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 {