diff --git a/src/main/java/run/halo/app/core/extension/Theme.java b/src/main/java/run/halo/app/core/extension/Theme.java index 3f3506751..1e6f2ec50 100644 --- a/src/main/java/run/halo/app/core/extension/Theme.java +++ b/src/main/java/run/halo/app/core/extension/Theme.java @@ -25,6 +25,8 @@ public class Theme extends AbstractExtension { @Schema(required = true) private ThemeSpec spec; + private ThemeStatus status; + @Data @ToString public static class ThemeSpec { @@ -69,6 +71,11 @@ public class Theme extends AbstractExtension { } } + @Data + public static class ThemeStatus { + private String location; + } + @Data @ToString public static class Author { diff --git a/src/main/java/run/halo/app/core/extension/reconciler/ThemeReconciler.java b/src/main/java/run/halo/app/core/extension/reconciler/ThemeReconciler.java index f8c4bac5e..9e3aa5149 100644 --- a/src/main/java/run/halo/app/core/extension/reconciler/ThemeReconciler.java +++ b/src/main/java/run/halo/app/core/extension/reconciler/ThemeReconciler.java @@ -47,10 +47,25 @@ public class ThemeReconciler implements Reconciler { reconcileThemeDeletion(theme); } themeSettingDefaultConfig(theme); + reconcileStatus(request.name()); }); return new Result(false, null); } + private void reconcileStatus(String name) { + client.fetch(Theme.class, name).ifPresent(theme -> { + Theme oldTheme = JsonUtils.deepCopy(theme); + if (theme.getStatus() == null) { + theme.setStatus(new Theme.ThemeStatus()); + } + Path themePath = themePathPolicy.generate(theme); + theme.getStatus().setLocation(themePath.toAbsolutePath().toString()); + if (!oldTheme.equals(theme)) { + client.update(theme); + } + }); + } + private void themeSettingDefaultConfig(Theme theme) { if (StringUtils.isBlank(theme.getSpec().getSettingName())) { return; diff --git a/src/test/java/run/halo/app/core/extension/reconciler/ThemeReconcilerTest.java b/src/test/java/run/halo/app/core/extension/reconciler/ThemeReconcilerTest.java index f8d25a44c..559560cf1 100644 --- a/src/test/java/run/halo/app/core/extension/reconciler/ThemeReconcilerTest.java +++ b/src/test/java/run/halo/app/core/extension/reconciler/ThemeReconcilerTest.java @@ -102,7 +102,7 @@ class ThemeReconcilerTest { themeReconciler.reconcile(new Reconciler.Request(metadata.getName())); - verify(extensionClient, times(2)).fetch(eq(Theme.class), eq(metadata.getName())); + verify(extensionClient, times(3)).fetch(eq(Theme.class), eq(metadata.getName())); verify(extensionClient, times(2)).fetch(eq(Setting.class), eq(themeSpec.getSettingName())); assertThat(Files.exists(testWorkDir)).isTrue(); @@ -133,7 +133,7 @@ class ThemeReconcilerTest { Reconciler.Result reconcile = themeReconciler.reconcile(new Reconciler.Request(metadata.getName())); assertThat(reconcile.reEnqueue()).isFalse(); - verify(extensionClient, times(1)).fetch(eq(Theme.class), eq(metadata.getName())); + verify(extensionClient, times(2)).fetch(eq(Theme.class), eq(metadata.getName())); // setting exists themeSpec.setSettingName("theme-test-setting"); @@ -142,9 +142,9 @@ class ThemeReconcilerTest { assertThat(theme.getSpec().getConfigMapName()).isNull(); ArgumentCaptor captor = ArgumentCaptor.forClass(Theme.class); themeReconciler.reconcile(new Reconciler.Request(metadata.getName())); - verify(extensionClient, times(3)) + verify(extensionClient, times(5)) .fetch(eq(Theme.class), eq(metadata.getName())); - verify(extensionClient, times(1)) + verify(extensionClient, times(2)) .update(captor.capture()); Theme value = captor.getValue(); assertThat(value.getSpec().getConfigMapName()).isNotNull();