From 529740a2382bacd75c96129570803f729ceddece Mon Sep 17 00:00:00 2001 From: guqing <38999863+guqing@users.noreply.github.com> Date: Fri, 30 Jun 2023 11:04:16 +0800 Subject: [PATCH] fix: creating a draft cannot be displayed in the post list (#4155) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What this PR does / why we need it: 此改动为还原 AbstractContentService 的 getContent 逻辑 当将 AbstractContentService 的 getContent 的查询改为 client.get 时会影响到文章 reconciler 的调用导致出错后一直requeue 所以无法完成文章逻辑处理。 image reconciler 这里获取 releaseSnapshot 时可能文章还是草稿,所以会导致调用 getContent 时多一次查询,所以最好是后续判断一下,当然这里已经在 getContent 判断了 #### Which issue(s) this PR fixes: Fixes #4154 #### Does this PR introduce a user-facing change? ```release-note None ``` --- .../app/content/AbstractContentService.java | 17 ++++++++++++++--- .../app/theme/router/PreviewRouterFunction.java | 4 ++-- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/application/src/main/java/run/halo/app/content/AbstractContentService.java b/application/src/main/java/run/halo/app/content/AbstractContentService.java index 17873479b..ea3add8d4 100644 --- a/application/src/main/java/run/halo/app/content/AbstractContentService.java +++ b/application/src/main/java/run/halo/app/content/AbstractContentService.java @@ -4,6 +4,7 @@ import java.security.Principal; import java.time.Instant; import java.util.UUID; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.lang.Nullable; import org.springframework.security.core.context.ReactiveSecurityContextHolder; @@ -20,22 +21,32 @@ import run.halo.app.extension.ReactiveExtensionClient; * @author guqing * @since 2.0.0 */ +@Slf4j @AllArgsConstructor public abstract class AbstractContentService { private final ReactiveExtensionClient client; public Mono getContent(String snapshotName, String baseSnapshotName) { - return client.get(Snapshot.class, baseSnapshotName) + if (StringUtils.isBlank(snapshotName) || StringUtils.isBlank(baseSnapshotName)) { + return Mono.empty(); + } + // TODO: refactor this method to use client.get instead of fetch but please be careful + return client.fetch(Snapshot.class, baseSnapshotName) .doOnNext(this::checkBaseSnapshot) .flatMap(baseSnapshot -> { if (StringUtils.equals(snapshotName, baseSnapshotName)) { var contentWrapper = ContentWrapper.patchSnapshot(baseSnapshot, baseSnapshot); return Mono.just(contentWrapper); } - return client.get(Snapshot.class, snapshotName) + return client.fetch(Snapshot.class, snapshotName) .map(snapshot -> ContentWrapper.patchSnapshot(snapshot, baseSnapshot)); - }); + }) + .switchIfEmpty(Mono.defer(() -> { + log.error("The content snapshot [{}] or base snapshot [{}] not found.", + snapshotName, baseSnapshotName); + return Mono.empty(); + })); } protected void checkBaseSnapshot(Snapshot snapshot) { diff --git a/application/src/main/java/run/halo/app/theme/router/PreviewRouterFunction.java b/application/src/main/java/run/halo/app/theme/router/PreviewRouterFunction.java index f60342cd5..56b149c4c 100644 --- a/application/src/main/java/run/halo/app/theme/router/PreviewRouterFunction.java +++ b/application/src/main/java/run/halo/app/theme/router/PreviewRouterFunction.java @@ -70,7 +70,7 @@ public class PreviewRouterFunction { .flatMap(post -> canPreview(post.getContributors()) .doOnNext(canPreview -> { if (!canPreview) { - throw new NotFoundException("Page not found."); + throw new NotFoundException("Post not found."); } }) .thenReturn(post) @@ -138,7 +138,7 @@ public class PreviewRouterFunction { .flatMap(singlePageVo -> canPreview(singlePageVo.getContributors()) .doOnNext(canPreview -> { if (!canPreview) { - throw new NotFoundException("Page not found."); + throw new NotFoundException("Single page not found."); } }) .thenReturn(singlePageVo)