diff --git a/api/src/main/java/run/halo/app/core/extension/content/Comment.java b/api/src/main/java/run/halo/app/core/extension/content/Comment.java index 320f1cca1..068ca55fa 100644 --- a/api/src/main/java/run/halo/app/core/extension/content/Comment.java +++ b/api/src/main/java/run/halo/app/core/extension/content/Comment.java @@ -123,6 +123,8 @@ public class Comment extends AbstractExtension { private Integer replyCount; + private Integer visibleReplyCount; + private Integer unreadReplyCount; private Boolean hasNewReply; diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/ReplyReconciler.java b/application/src/main/java/run/halo/app/core/extension/reconciler/ReplyReconciler.java index 7d1011ced..540e8649f 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/ReplyReconciler.java +++ b/application/src/main/java/run/halo/app/core/extension/reconciler/ReplyReconciler.java @@ -6,7 +6,7 @@ import lombok.AllArgsConstructor; import org.springframework.context.ApplicationEventPublisher; import org.springframework.stereotype.Component; import run.halo.app.core.extension.content.Reply; -import run.halo.app.event.post.ReplyCreatedEvent; +import run.halo.app.event.post.ReplyChangedEvent; import run.halo.app.event.post.ReplyDeletedEvent; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.controller.Controller; @@ -36,10 +36,9 @@ public class ReplyReconciler implements Reconciler { return; } - if (addFinalizerIfNecessary(reply)) { - // on reply created - eventPublisher.publishEvent(new ReplyCreatedEvent(this, reply)); - } + addFinalizerIfNecessary(reply); + // on reply created + eventPublisher.publishEvent(new ReplyChangedEvent(this, reply)); }); return new Result(false, null); } @@ -56,10 +55,10 @@ public class ReplyReconciler implements Reconciler { }); } - private boolean addFinalizerIfNecessary(Reply oldReply) { + private void addFinalizerIfNecessary(Reply oldReply) { Set finalizers = oldReply.getMetadata().getFinalizers(); if (finalizers != null && finalizers.contains(FINALIZER_NAME)) { - return false; + return; } client.fetch(Reply.class, oldReply.getMetadata().getName()) .ifPresent(reply -> { @@ -71,7 +70,6 @@ public class ReplyReconciler implements Reconciler { newFinalizers.add(FINALIZER_NAME); client.update(reply); }); - return true; } @Override diff --git a/application/src/main/java/run/halo/app/event/post/ReplyCreatedEvent.java b/application/src/main/java/run/halo/app/event/post/ReplyChangedEvent.java similarity index 59% rename from application/src/main/java/run/halo/app/event/post/ReplyCreatedEvent.java rename to application/src/main/java/run/halo/app/event/post/ReplyChangedEvent.java index fbc21a60e..c61568666 100644 --- a/application/src/main/java/run/halo/app/event/post/ReplyCreatedEvent.java +++ b/application/src/main/java/run/halo/app/event/post/ReplyChangedEvent.java @@ -6,9 +6,9 @@ import run.halo.app.core.extension.content.Reply; * @author guqing * @since 2.0.0 */ -public class ReplyCreatedEvent extends ReplyEvent { +public class ReplyChangedEvent extends ReplyEvent { - public ReplyCreatedEvent(Object source, Reply reply) { + public ReplyChangedEvent(Object source, Reply reply) { super(source, reply); } } diff --git a/application/src/main/java/run/halo/app/metrics/ReplyEventReconciler.java b/application/src/main/java/run/halo/app/metrics/ReplyEventReconciler.java index f1da43872..6e41321c6 100644 --- a/application/src/main/java/run/halo/app/metrics/ReplyEventReconciler.java +++ b/application/src/main/java/run/halo/app/metrics/ReplyEventReconciler.java @@ -1,5 +1,7 @@ package run.halo.app.metrics; +import static org.apache.commons.lang3.BooleanUtils.isFalse; +import static org.apache.commons.lang3.BooleanUtils.isTrue; import static org.apache.commons.lang3.ObjectUtils.defaultIfNull; import java.time.Duration; @@ -8,6 +10,7 @@ import java.util.List; import lombok.extern.slf4j.Slf4j; import org.springframework.context.SmartLifecycle; import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; import run.halo.app.content.comment.ReplyService; import run.halo.app.core.extension.content.Comment; @@ -62,6 +65,13 @@ public class ReplyEventReconciler implements Reconciler, SmartLifecy // total reply count status.setReplyCount(replies.size()); + long visibleReplyCount = replies.stream() + .filter(reply -> isTrue(reply.getSpec().getApproved()) + && isFalse(reply.getSpec().getHidden()) + ) + .count(); + status.setVisibleReplyCount((int) visibleReplyCount); + // calculate last reply time Instant lastReplyTime = replies.stream() .findFirst() @@ -73,6 +83,7 @@ public class ReplyEventReconciler implements Reconciler, SmartLifecy Instant lastReadTime = comment.getSpec().getLastReadTime(); status.setUnreadReplyCount(Comment.getUnreadReplyCount(replies, lastReadTime)); + status.setHasNewReply(defaultIfNull(status.getUnreadReplyCount(), 0) > 0); client.update(comment); }); @@ -107,8 +118,13 @@ public class ReplyEventReconciler implements Reconciler, SmartLifecy return this.running; } - @EventListener(ReplyEvent.class) - public void onReplyAdded(ReplyEvent replyEvent) { - replyEventQueue.addImmediately(replyEvent); + @Component + public class ReplyEventListener { + + @Async + @EventListener(ReplyEvent.class) + public void onReplyEvent(ReplyEvent replyEvent) { + replyEventQueue.addImmediately(replyEvent); + } } }