feat: add Halo version variable to theme model (#6677)

#### What type of PR is this?
/kind feature
/milestone 2.20.x
/area theme

#### What this PR does / why we need it:
主题支持通过 `${site.version}` 得到 Halo 版本号

#### Which issue(s) this PR fixes:
Fixes #6676

#### Does this PR introduce a user-facing change?
```release-note
主题支持通过 `${site.version}` 得到 Halo 版本号
```
pull/6680/head
guqing 2024-09-19 15:20:54 +08:00 committed by GitHub
parent 07077f7d0c
commit dcadd38843
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 19 additions and 2 deletions

View File

@ -7,6 +7,7 @@ import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
import run.halo.app.infra.ExternalUrlSupplier; import run.halo.app.infra.ExternalUrlSupplier;
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
import run.halo.app.infra.SystemVersionSupplier;
import run.halo.app.theme.finders.vo.SiteSettingVo; import run.halo.app.theme.finders.vo.SiteSettingVo;
/** /**
@ -21,6 +22,7 @@ public class SiteSettingVariablesAcquirer implements ViewContextBasedVariablesAc
private final SystemConfigurableEnvironmentFetcher environmentFetcher; private final SystemConfigurableEnvironmentFetcher environmentFetcher;
private final ExternalUrlSupplier externalUrlSupplier; private final ExternalUrlSupplier externalUrlSupplier;
private final SystemVersionSupplier systemVersionSupplier;
@Override @Override
public Mono<Map<String, Object>> acquire(ServerWebExchange exchange) { public Mono<Map<String, Object>> acquire(ServerWebExchange exchange) {
@ -28,7 +30,8 @@ public class SiteSettingVariablesAcquirer implements ViewContextBasedVariablesAc
.filter(configMap -> configMap.getData() != null) .filter(configMap -> configMap.getData() != null)
.map(configMap -> { .map(configMap -> {
SiteSettingVo siteSettingVo = SiteSettingVo.from(configMap) SiteSettingVo siteSettingVo = SiteSettingVo.from(configMap)
.withUrl(externalUrlSupplier.getURL(exchange.getRequest())); .withUrl(externalUrlSupplier.getURL(exchange.getRequest()))
.withVersion(systemVersionSupplier.get().toString());
return Map.of("site", siteSettingVo); return Map.of("site", siteSettingVo);
}); });
} }

View File

@ -25,6 +25,9 @@ public class SiteSettingVo {
@With @With
URL url; URL url;
@With
String version;
String subtitle; String subtitle;
String logo; String logo;

View File

@ -6,6 +6,7 @@ import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
import com.github.zafarkhaja.semver.Version;
import java.net.MalformedURLException; import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.util.Map; import java.util.Map;
@ -20,6 +21,7 @@ import reactor.test.StepVerifier;
import run.halo.app.extension.ConfigMap; import run.halo.app.extension.ConfigMap;
import run.halo.app.infra.ExternalUrlSupplier; import run.halo.app.infra.ExternalUrlSupplier;
import run.halo.app.infra.SystemConfigurableEnvironmentFetcher; import run.halo.app.infra.SystemConfigurableEnvironmentFetcher;
import run.halo.app.infra.SystemVersionSupplier;
import run.halo.app.theme.finders.vo.SiteSettingVo; import run.halo.app.theme.finders.vo.SiteSettingVo;
/** /**
@ -32,6 +34,10 @@ import run.halo.app.theme.finders.vo.SiteSettingVo;
public class SiteSettingVariablesAcquirerTest { public class SiteSettingVariablesAcquirerTest {
@Mock @Mock
private ExternalUrlSupplier externalUrlSupplier; private ExternalUrlSupplier externalUrlSupplier;
@Mock
private SystemVersionSupplier systemVersionSupplier;
@Mock @Mock
private SystemConfigurableEnvironmentFetcher environmentFetcher; private SystemConfigurableEnvironmentFetcher environmentFetcher;
@ -45,6 +51,7 @@ public class SiteSettingVariablesAcquirerTest {
var url = new URL("https://halo.run"); var url = new URL("https://halo.run");
when(externalUrlSupplier.getURL(any())).thenReturn(url); when(externalUrlSupplier.getURL(any())).thenReturn(url);
when(systemVersionSupplier.get()).thenReturn(Version.parse("0.0.0-alpha.1"));
when(environmentFetcher.getConfigMap()).thenReturn(Mono.just(configMap)); when(environmentFetcher.getConfigMap()).thenReturn(Mono.just(configMap));
siteSettingVariablesAcquirer.acquire(mock(ServerWebExchange.class)) siteSettingVariablesAcquirer.acquire(mock(ServerWebExchange.class))
@ -52,9 +59,13 @@ public class SiteSettingVariablesAcquirerTest {
.consumeNextWith(result -> { .consumeNextWith(result -> {
assertThat(result).containsKey("site"); assertThat(result).containsKey("site");
assertThat(result.get("site")).isInstanceOf(SiteSettingVo.class); assertThat(result.get("site")).isInstanceOf(SiteSettingVo.class);
assertThat((SiteSettingVo) result.get("site")) var site = (SiteSettingVo) result.get("site");
assertThat(site)
.extracting(SiteSettingVo::getUrl) .extracting(SiteSettingVo::getUrl)
.isEqualTo(url); .isEqualTo(url);
assertThat(site)
.extracting(SiteSettingVo::getVersion)
.isEqualTo("0.0.0-alpha.1");
}) })
.verifyComplete(); .verifyComplete();
verify(externalUrlSupplier).getURL(any()); verify(externalUrlSupplier).getURL(any());