From d2a03dc8499923c64a999fb32f32f1796db4990e Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Fri, 28 Jun 2024 21:51:00 +0800 Subject: [PATCH] fix: incorrect post display when linking or unlinking hidden categories (#6204) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind bug /area core /milestone 2.17.x #### What this PR does / why we need it: 修复文章关联或取消关联隐藏分类后显示不正确的问题 #### Which issue(s) this PR fixes: Fixes #6194 Fixes #6195 #### Does this PR introduce a user-facing change? ```release-note 修复文章关联或取消关联隐藏分类后显示不正确的问题 ``` --- .../reconciler/CategoryReconciler.java | 15 ++++++++++----- .../extension/reconciler/PostReconciler.java | 17 +++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/CategoryReconciler.java b/application/src/main/java/run/halo/app/core/extension/reconciler/CategoryReconciler.java index 498757e9e..d4abf4862 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/CategoryReconciler.java +++ b/application/src/main/java/run/halo/app/core/extension/reconciler/CategoryReconciler.java @@ -42,6 +42,7 @@ public class CategoryReconciler implements Reconciler { .ifPresent(category -> { if (ExtensionUtil.isDeleted(category)) { if (removeFinalizers(category.getMetadata(), Set.of(FINALIZER_NAME))) { + refreshHiddenState(category, false); client.update(category); } return; @@ -50,20 +51,24 @@ public class CategoryReconciler implements Reconciler { populatePermalinkPattern(category); populatePermalink(category); - checkHideFromListState(category); + checkHiddenState(category); client.update(category); }); return Result.doNotRetry(); } - /** - * TODO move this logic to before-create/update hook in the future see {@code gh-4343}. - */ - private void checkHideFromListState(Category category) { + private void checkHiddenState(Category category) { final boolean hidden = categoryService.isCategoryHidden(category.getMetadata().getName()) .blockOptional() .orElse(false); + refreshHiddenState(category, hidden); + } + + /** + * TODO move this logic to before-create/update hook in the future see {@code gh-4343}. + */ + private void refreshHiddenState(Category category, boolean hidden) { category.getSpec().setHideFromList(hidden); if (isHiddenStateChanged(category)) { publishHiddenStateChangeEvent(category); diff --git a/application/src/main/java/run/halo/app/core/extension/reconciler/PostReconciler.java b/application/src/main/java/run/halo/app/core/extension/reconciler/PostReconciler.java index 2c36d022b..55f8f28b7 100644 --- a/application/src/main/java/run/halo/app/core/extension/reconciler/PostReconciler.java +++ b/application/src/main/java/run/halo/app/core/extension/reconciler/PostReconciler.java @@ -28,6 +28,7 @@ import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.data.domain.Sort; import org.springframework.stereotype.Component; +import run.halo.app.content.CategoryService; import run.halo.app.content.ContentWrapper; import run.halo.app.content.NotificationReasonConst; import run.halo.app.content.PostService; @@ -83,6 +84,7 @@ public class PostReconciler implements Reconciler { private final PostPermalinkPolicy postPermalinkPolicy; private final CounterService counterService; private final CommentService commentService; + private final CategoryService categoryService; private final ApplicationEventPublisher eventPublisher; private final NotificationCenter notificationCenter; @@ -185,6 +187,8 @@ public class PostReconciler implements Reconciler { status.setInProgress( !StringUtils.equals(headSnapshot, post.getSpec().getReleaseSnapshot())); + computeHiddenState(post); + // version + 1 is required to truly equal version // as a version will be incremented after the update status.setObservedVersion(post.getMetadata().getVersion() + 1); @@ -196,6 +200,19 @@ public class PostReconciler implements Reconciler { return Result.doNotRetry(); } + private void computeHiddenState(Post post) { + var categories = post.getSpec().getCategories(); + if (categories == null) { + post.getStatusOrDefault().setHideFromList(false); + return; + } + var hidden = categories.stream() + .anyMatch(categoryName -> categoryService.isCategoryHidden(categoryName) + .blockOptional().orElse(false) + ); + post.getStatusOrDefault().setHideFromList(hidden); + } + private void populateLabels(Post post, Set events) { var labels = nullSafeLabels(post); labels.put(Post.DELETED_LABEL, String.valueOf(isTrue(post.getSpec().getDeleted())));