From 716a2a2c2b15d859657ff22ec13471f2f3913f18 Mon Sep 17 00:00:00 2001 From: guqing Date: Thu, 17 Nov 2022 16:25:43 +0800 Subject: [PATCH 1/2] feat: support obtaining the configuration of halo.external-url for themes and plugins --- .../app/plugin/SharedApplicationContextHolder.java | 3 +++ .../halo/app/theme/SiteSettingVariablesAcquirer.java | 11 ++++++----- .../run/halo/app/theme/finders/vo/SiteSettingVo.java | 5 +++++ 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/run/halo/app/plugin/SharedApplicationContextHolder.java b/src/main/java/run/halo/app/plugin/SharedApplicationContextHolder.java index 4e98468e20..4f6c9cb368 100644 --- a/src/main/java/run/halo/app/plugin/SharedApplicationContextHolder.java +++ b/src/main/java/run/halo/app/plugin/SharedApplicationContextHolder.java @@ -6,6 +6,7 @@ import run.halo.app.extension.DefaultSchemeManager; import run.halo.app.extension.ExtensionClient; import run.halo.app.extension.ReactiveExtensionClient; +import run.halo.app.infra.ExternalUrlSupplier; /** *

This {@link SharedApplicationContextHolder} class is used to hold a singleton instance of @@ -61,6 +62,8 @@ SharedApplicationContext createSharedApplicationContext() { DefaultSchemeManager defaultSchemeManager = rootApplicationContext.getBean(DefaultSchemeManager.class); beanFactory.registerSingleton("schemeManager", defaultSchemeManager); + beanFactory.registerSingleton("externalUrlSupplier", + rootApplicationContext.getBean(ExternalUrlSupplier.class)); // TODO add more shared instance here return sharedApplicationContext; diff --git a/src/main/java/run/halo/app/theme/SiteSettingVariablesAcquirer.java b/src/main/java/run/halo/app/theme/SiteSettingVariablesAcquirer.java index 413a57cfa1..4713fa7a9d 100644 --- a/src/main/java/run/halo/app/theme/SiteSettingVariablesAcquirer.java +++ b/src/main/java/run/halo/app/theme/SiteSettingVariablesAcquirer.java @@ -1,9 +1,11 @@ package run.halo.app.theme; import java.util.Map; +import lombok.AllArgsConstructor; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; +import run.halo.app.infra.ExternalUrlSupplier; import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; import run.halo.app.theme.finders.vo.SiteSettingVo; @@ -14,20 +16,19 @@ * @since 2.0.0 */ @Component +@AllArgsConstructor public class SiteSettingVariablesAcquirer implements ViewContextBasedVariablesAcquirer { private final SystemConfigurableEnvironmentFetcher environmentFetcher; - - public SiteSettingVariablesAcquirer(SystemConfigurableEnvironmentFetcher environmentFetcher) { - this.environmentFetcher = environmentFetcher; - } + private final ExternalUrlSupplier externalUrlSupplier; @Override public Mono> acquire(ServerWebExchange exchange) { return environmentFetcher.getConfigMap() .filter(configMap -> configMap.getData() != null) .map(configMap -> { - SiteSettingVo siteSettingVo = SiteSettingVo.from(configMap); + SiteSettingVo siteSettingVo = SiteSettingVo.from(configMap) + .withUrl(externalUrlSupplier.get()); return Map.of("site", siteSettingVo); }); } diff --git a/src/main/java/run/halo/app/theme/finders/vo/SiteSettingVo.java b/src/main/java/run/halo/app/theme/finders/vo/SiteSettingVo.java index 9aabe76d5b..1b0145f508 100644 --- a/src/main/java/run/halo/app/theme/finders/vo/SiteSettingVo.java +++ b/src/main/java/run/halo/app/theme/finders/vo/SiteSettingVo.java @@ -1,8 +1,10 @@ package run.halo.app.theme.finders.vo; +import java.net.URI; import java.util.Map; import lombok.Builder; import lombok.Value; +import lombok.With; import org.springframework.util.Assert; import run.halo.app.extension.ConfigMap; import run.halo.app.infra.SystemSetting; @@ -20,6 +22,9 @@ public class SiteSettingVo { String title; + @With + URI url; + String subtitle; String logo; From 546d91ecccb4f56241f15d9e701f1b0edd024e5b Mon Sep 17 00:00:00 2001 From: guqing Date: Fri, 18 Nov 2022 11:10:52 +0800 Subject: [PATCH 2/2] feat: add unit test case --- .../SiteSettingVariablesAcquirerTest.java | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 src/test/java/run/halo/app/theme/SiteSettingVariablesAcquirerTest.java diff --git a/src/test/java/run/halo/app/theme/SiteSettingVariablesAcquirerTest.java b/src/test/java/run/halo/app/theme/SiteSettingVariablesAcquirerTest.java new file mode 100644 index 0000000000..dc0e69f110 --- /dev/null +++ b/src/test/java/run/halo/app/theme/SiteSettingVariablesAcquirerTest.java @@ -0,0 +1,59 @@ +package run.halo.app.theme; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.when; + +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.web.server.ServerWebExchange; +import reactor.core.publisher.Mono; +import reactor.test.StepVerifier; +import run.halo.app.extension.ConfigMap; +import run.halo.app.infra.ExternalUrlSupplier; +import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; +import run.halo.app.theme.finders.vo.SiteSettingVo; + +/** + * Tests for {@link SiteSettingVariablesAcquirer}. + * + * @author guqing + * @since 2.0.0 + */ +@ExtendWith(MockitoExtension.class) +public class SiteSettingVariablesAcquirerTest { + @Mock + private ExternalUrlSupplier externalUrlSupplier; + @Mock + private SystemConfigurableEnvironmentFetcher environmentFetcher; + + @InjectMocks + private SiteSettingVariablesAcquirer siteSettingVariablesAcquirer; + + @Test + void acquire() throws URISyntaxException { + ConfigMap configMap = new ConfigMap(); + configMap.setData(Map.of()); + + URI uri = new URI("https://halo.run"); + when(externalUrlSupplier.get()).thenReturn(uri); + when(environmentFetcher.getConfigMap()).thenReturn(Mono.just(configMap)); + + siteSettingVariablesAcquirer.acquire(Mockito.mock(ServerWebExchange.class)) + .as(StepVerifier::create) + .consumeNextWith(result -> { + assertThat(result).containsKey("site"); + assertThat(result.get("site")).isInstanceOf(SiteSettingVo.class); + assertThat((SiteSettingVo) result.get("site")) + .extracting(SiteSettingVo::getUrl) + .isEqualTo(uri); + }) + .verifyComplete(); + } +}