Skip to content

Commit

Permalink
feat: add system info getter for plugin
Browse files Browse the repository at this point in the history
  • Loading branch information
guqing committed Dec 2, 2024
1 parent 033a77e commit 57c19dd
Show file tree
Hide file tree
Showing 3 changed files with 121 additions and 0 deletions.
45 changes: 45 additions & 0 deletions api/src/main/java/run/halo/app/infra/SystemInfoGetter.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package run.halo.app.infra;

import com.github.zafarkhaja.semver.Version;
import java.net.URL;
import java.util.Locale;
import java.util.TimeZone;
import java.util.function.Supplier;
import lombok.Data;
import lombok.experimental.Accessors;
import reactor.core.publisher.Mono;

public interface SystemInfoGetter extends Supplier<Mono<SystemInfoGetter.SystemInfo>> {

@Data
@Accessors(chain = true)
class SystemInfo {
private String title;

private String subtitle;

private String logo;

private String favicon;

private URL url;

private Version version;

private SeoProp seo;

private Locale locale;

private TimeZone timeZone;

private String activatedThemeName;
}

@Data
@Accessors(chain = true)
class SeoProp {
private boolean blockSpiders;
private String keywords;
private String description;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package run.halo.app.infra;

import java.net.MalformedURLException;
import java.net.URI;
import java.net.URL;
import java.util.Locale;
import java.util.TimeZone;
import lombok.RequiredArgsConstructor;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.autoconfigure.web.reactive.WebFluxProperties;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;

@Component
@RequiredArgsConstructor
public class SystemInfoGetterImpl implements SystemInfoGetter {
private final SystemConfigurableEnvironmentFetcher environmentFetcher;
private final SystemVersionSupplier systemVersionSupplier;
private final ExternalUrlSupplier externalUrlSupplier;
private final ServerProperties serverProperties;
private final WebFluxProperties webFluxProperties;

@Override
public Mono<SystemInfo> get() {
var systemInfo = new SystemInfo()
.setVersion(systemVersionSupplier.get())
.setUrl(getExternalUrl())
// TODO populate locale and timezone from system settings in the future
.setLocale(Locale.getDefault())
.setTimeZone(TimeZone.getDefault());

var basicMono =
environmentFetcher.fetch(SystemSetting.Basic.GROUP, SystemSetting.Basic.class)
.doOnNext(basic -> systemInfo.setTitle(basic.getTitle())
.setSubtitle(basic.getSubtitle())
.setLogo(basic.getLogo())
.setFavicon(basic.getFavicon())
);

var seoMono = environmentFetcher.fetch(SystemSetting.Seo.GROUP, SystemSetting.Seo.class)
.doOnNext(seo -> systemInfo.setSeo(new SeoProp()
.setBlockSpiders(BooleanUtils.isTrue(seo.blockSpiders))
.setKeywords(seo.getKeywords())
.setDescription(seo.getDescription())
));

var themeMono =
environmentFetcher.fetch(SystemSetting.Theme.GROUP, SystemSetting.Theme.class)
.doOnNext(theme -> systemInfo.setActivatedThemeName(theme.getActive()));
return Mono.when(basicMono, seoMono, themeMono)
.thenReturn(systemInfo);
}

private URL getExternalUrl() {
var url = externalUrlSupplier.getRaw();
if (url != null) {
return url;
}
var port = serverProperties.getPort();
var basePath = StringUtils.defaultIfBlank(webFluxProperties.getBasePath(), "/");
try {
var uriStr = "http://localhost:" + port + basePath;
return URI.create(StringUtils.removeEnd(uriStr, "/")).toURL();
} catch (MalformedURLException e) {
// Should not happen
throw new RuntimeException("Cannot create URL from server properties.", e);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import run.halo.app.infra.BackupRootGetter;
import run.halo.app.infra.ExternalLinkProcessor;
import run.halo.app.infra.ExternalUrlSupplier;
import run.halo.app.infra.SystemInfoGetter;
import run.halo.app.notification.NotificationCenter;
import run.halo.app.notification.NotificationReasonEmitter;
import run.halo.app.plugin.extensionpoint.ExtensionGetter;
Expand Down Expand Up @@ -97,6 +98,10 @@ public static ApplicationContext create(ApplicationContext rootContext) {
.ifUnique(userDetailsService ->
beanFactory.registerSingleton("userDetailsService", userDetailsService)
);
rootContext.getBeanProvider(SystemInfoGetter.class)
.ifUnique(systemInfoGetter ->
beanFactory.registerSingleton("systemInfoGetter", systemInfoGetter)
);
// TODO add more shared instance here

sharedContext.refresh();
Expand Down

0 comments on commit 57c19dd

Please sign in to comment.