feat: add error log when permalink exists (#2460)

#### 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
```
pull/2474/head
guqing 2022-09-27 10:16:15 +08:00 committed by GitHub
parent 721cddff5d
commit 264a4330c3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 31 additions and 0 deletions

View File

@ -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);
}
}