From d1902ef50f7a2add631adee9baf555f22695a28e Mon Sep 17 00:00:00 2001 From: John Niang Date: Thu, 8 Sep 2022 18:12:10 +0800 Subject: [PATCH] Reconcile SinglePage reference of MenuItem (#2395) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #### What type of PR is this? /kind feature #### What this PR does / why we need it: Synchronize premalink and display name from SinglePage every 1 minute if only `spec.pageRef` is set. #### Special notes for your reviewer: See https://github.com/halo-dev/halo/pull/2380 for more. How to test? 1. Checkout https://github.com/halo-dev/halo-admin/pull/608 and run it. 2. Create a custom page 3. Select the custom page you created just now when creating menu item 4. Check the permalink of the menu item 5. Change slug name of the custom page and check the permalink of it 6. Wait for 1 minute and check the permalink of of the menu item #### Does this PR introduce a user-facing change? ```release-note 支持绑定自定义页面至菜单项 ``` --- .../run/halo/app/core/extension/MenuItem.java | 4 +- .../reconciler/MenuItemReconciler.java | 18 ++++++-- .../reconciler/MenuItemReconcilerTest.java | 46 +++++++++++++++++++ 3 files changed, 63 insertions(+), 5 deletions(-) diff --git a/src/main/java/run/halo/app/core/extension/MenuItem.java b/src/main/java/run/halo/app/core/extension/MenuItem.java index 862f6208a..7480717ec 100644 --- a/src/main/java/run/halo/app/core/extension/MenuItem.java +++ b/src/main/java/run/halo/app/core/extension/MenuItem.java @@ -49,8 +49,8 @@ public class MenuItem extends AbstractExtension { @Schema(description = "Post reference.") private Ref postRef; - @Schema(description = "Page reference.") - private Ref pageRef; + @Schema(description = "SinglePage reference.") + private Ref singlePageRef; } diff --git a/src/main/java/run/halo/app/core/extension/reconciler/MenuItemReconciler.java b/src/main/java/run/halo/app/core/extension/reconciler/MenuItemReconciler.java index 6c9c3b010..26e3f75bc 100644 --- a/src/main/java/run/halo/app/core/extension/reconciler/MenuItemReconciler.java +++ b/src/main/java/run/halo/app/core/extension/reconciler/MenuItemReconciler.java @@ -8,6 +8,7 @@ import run.halo.app.core.extension.MenuItem; import run.halo.app.core.extension.MenuItem.MenuItemSpec; import run.halo.app.core.extension.MenuItem.MenuItemStatus; import run.halo.app.core.extension.Post; +import run.halo.app.core.extension.SinglePage; import run.halo.app.core.extension.Tag; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.Ref; @@ -35,9 +36,8 @@ public class MenuItemReconciler implements Reconciler { return handleCategoryRef(request.name(), status, spec.getCategoryRef()); } else if (spec.getTagRef() != null) { return handleTagRef(request.name(), status, spec.getTagRef()); - } else if (spec.getPageRef() != null) { - // TODO resolve permalink from page. At present, we don't have Page extension. - return new Result(false, null); + } else if (spec.getSinglePageRef() != null) { + return handleSinglePageSpec(request.name(), status, spec.getSinglePageRef()); } else if (spec.getPostRef() != null) { return handlePostRef(request.name(), status, spec.getPostRef()); } else { @@ -79,6 +79,18 @@ public class MenuItemReconciler implements Reconciler { return new Result(true, Duration.ofMinutes(1)); } + private Result handleSinglePageSpec(String menuItemName, MenuItemStatus status, Ref pageRef) { + client.fetch(SinglePage.class, pageRef.getName()) + .filter(page -> page.getStatus() != null) + .filter(page -> StringUtils.hasText(page.getStatus().getPermalink())) + .ifPresent(page -> { + status.setHref(page.getStatus().getPermalink()); + status.setDisplayName(page.getSpec().getTitle()); + updateStatus(menuItemName, status); + }); + return new Result(true, Duration.ofMinutes(1)); + } + private Result handleMenuSpec(String menuItemName, MenuItemStatus status, MenuItemSpec spec) { if (spec.getHref() != null && StringUtils.hasText(spec.getDisplayName())) { status.setHref(spec.getHref()); diff --git a/src/test/java/run/halo/app/core/extension/reconciler/MenuItemReconcilerTest.java b/src/test/java/run/halo/app/core/extension/reconciler/MenuItemReconcilerTest.java index 7d0a01550..c0d96b2e9 100644 --- a/src/test/java/run/halo/app/core/extension/reconciler/MenuItemReconcilerTest.java +++ b/src/test/java/run/halo/app/core/extension/reconciler/MenuItemReconcilerTest.java @@ -23,6 +23,7 @@ import org.mockito.junit.jupiter.MockitoExtension; import run.halo.app.core.extension.Category; import run.halo.app.core.extension.MenuItem; import run.halo.app.core.extension.MenuItem.MenuItemSpec; +import run.halo.app.core.extension.SinglePage; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.Metadata; import run.halo.app.extension.Ref; @@ -101,6 +102,51 @@ class MenuItemReconcilerTest { } } + @Nested + class WhenSinglePageRefSet { + + @Test + void shouldUpdateMenuItemIfPageFound() { + Supplier menuItemSupplier = () -> createMenuItem("fake-name", spec -> { + spec.setSinglePageRef(Ref.of("fake-page")); + }); + + when(client.fetch(MenuItem.class, "fake-name")) + .thenReturn(Optional.of(menuItemSupplier.get())) + .thenReturn(Optional.of(menuItemSupplier.get())); + + when(client.fetch(SinglePage.class, "fake-page")) + .thenReturn(Optional.of(createSinglePage())); + + var result = reconciler.reconcile(new Request("fake-name")); + assertTrue(result.reEnqueue()); + assertEquals(Duration.ofMinutes(1), result.retryAfter()); + verify(client, times(2)).fetch(MenuItem.class, "fake-name"); + verify(client).fetch(SinglePage.class, "fake-page"); + verify(client).update(argThat(menuItem -> { + var status = menuItem.getStatus(); + return status.getHref().equals("fake://permalink") + && status.getDisplayName().equals("fake-title"); + })); + } + + SinglePage createSinglePage() { + var metadata = new Metadata(); + metadata.setName("fake-page"); + + var spec = new SinglePage.SinglePageSpec(); + spec.setTitle("fake-title"); + var status = new SinglePage.SinglePageStatus(); + status.setPermalink("fake://permalink"); + + var singlePage = new SinglePage(); + singlePage.setMetadata(metadata); + singlePage.setSpec(spec); + singlePage.setStatus(status); + return singlePage; + } + } + @Nested class WhenOtherRefsNotSet {