From 264a4330c3189523aa026abd4bd2f61631702236 Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Tue, 27 Sep 2022 10:16:15 +0800 Subject: [PATCH] feat: add error log when permalink exists (#2460) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind improvement /area core /milestone 2.0 #### What this PR does / why we need it: 注册 permalink 到 Permalinker 时校验 permalink 是否已经存在,如果存在则记录错误日志且不向 PermalinkIndexer 添加记录 TODO: - [ ] 后续增加事件功能后检查到 permalink 重复则发送记录事件的 event 来代替日志记录 #### Which issue(s) this PR fixes: A part of #2454 #### Special notes for your reviewer: /cc @halo-dev/sig-halo #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../app/theme/router/PermalinkIndexer.java | 31 +++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main/java/run/halo/app/theme/router/PermalinkIndexer.java b/src/main/java/run/halo/app/theme/router/PermalinkIndexer.java index 075d8977b..e34cc990d 100644 --- a/src/main/java/run/halo/app/theme/router/PermalinkIndexer.java +++ b/src/main/java/run/halo/app/theme/router/PermalinkIndexer.java @@ -4,6 +4,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.locks.ReentrantReadWriteLock; +import lombok.extern.slf4j.Slf4j; import org.springframework.context.event.EventListener; import org.springframework.lang.NonNull; import org.springframework.lang.Nullable; @@ -17,6 +18,7 @@ import run.halo.app.extension.GroupVersionKind; * @author guqing * @since 2.0.0 */ +@Slf4j @Component public class PermalinkIndexer { private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock(); @@ -173,8 +175,20 @@ public class PermalinkIndexer { return permalinkLocatorLookup.size(); } + /** + * Add a record to the {@link PermalinkIndexer}. + * If permalink already exists, it will not be added to indexer + * + * @param addCommand a command to add a record to {@link PermalinkIndexer} + */ @EventListener(PermalinkIndexAddCommand.class) public void onPermalinkAdd(PermalinkIndexAddCommand addCommand) { + if (checkPermalinkExists(addCommand.getLocator(), addCommand.getPermalink())) { + // TODO send an extension event to log this error + log.error("Permalink [{}] already exists, you can try to change the slug [{}].", + addCommand.getPermalink(), addCommand.getLocator()); + return; + } register(addCommand.getLocator(), addCommand.getPermalink()); } @@ -183,9 +197,26 @@ public class PermalinkIndexer { remove(deleteCommand.getLocator()); } + /** + * Update a {@link PermalinkIndexer} record by {@link ExtensionLocator} and permalink. + * If permalink already exists, it will not be updated + * + * @param updateCommand a command to update an indexer record + */ @EventListener(PermalinkIndexUpdateCommand.class) public void onPermalinkUpdate(PermalinkIndexUpdateCommand updateCommand) { + if (checkPermalinkExists(updateCommand.getLocator(), updateCommand.getPermalink())) { + // TODO send an extension event to log this error + log.error("Permalink [{}] already exists, you can try to change the slug [{}].", + updateCommand.getPermalink(), updateCommand.getLocator()); + return; + } remove(updateCommand.getLocator()); register(updateCommand.getLocator(), updateCommand.getPermalink()); } + + private boolean checkPermalinkExists(ExtensionLocator locator, String permalink) { + ExtensionLocator lookup = lookup(permalink); + return lookup != null && !lookup.equals(locator); + } }