diff --git a/application/src/main/java/run/halo/app/content/ContentWrapper.java b/api/src/main/java/run/halo/app/content/ContentWrapper.java similarity index 100% rename from application/src/main/java/run/halo/app/content/ContentWrapper.java rename to api/src/main/java/run/halo/app/content/ContentWrapper.java diff --git a/application/src/main/java/run/halo/app/content/PatchUtils.java b/api/src/main/java/run/halo/app/content/PatchUtils.java similarity index 100% rename from application/src/main/java/run/halo/app/content/PatchUtils.java rename to api/src/main/java/run/halo/app/content/PatchUtils.java diff --git a/api/src/main/java/run/halo/app/content/PostContentService.java b/api/src/main/java/run/halo/app/content/PostContentService.java new file mode 100644 index 000000000..e8fb6ede9 --- /dev/null +++ b/api/src/main/java/run/halo/app/content/PostContentService.java @@ -0,0 +1,15 @@ +package run.halo.app.content; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; + +public interface PostContentService { + + Mono getHeadContent(String postName); + + Mono getReleaseContent(String postName); + + Mono getSpecifiedContent(String postName, String snapshotName); + + Flux listSnapshots(String postName); +} diff --git a/application/src/main/java/run/halo/app/content/PostContentServiceImpl.java b/application/src/main/java/run/halo/app/content/PostContentServiceImpl.java new file mode 100644 index 000000000..aad11d01f --- /dev/null +++ b/application/src/main/java/run/halo/app/content/PostContentServiceImpl.java @@ -0,0 +1,58 @@ +package run.halo.app.content; + +import org.springframework.stereotype.Component; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import run.halo.app.core.extension.content.Post; +import run.halo.app.extension.ReactiveExtensionClient; +import run.halo.app.extension.Ref; + +/** + * Provides ability to get post content for the specified post. + * + * @author guqing + * @since 2.16.0 + */ +@Component +public class PostContentServiceImpl extends AbstractContentService implements PostContentService { + private final ReactiveExtensionClient client; + + public PostContentServiceImpl(ReactiveExtensionClient client) { + super(client); + this.client = client; + } + + @Override + public Mono getHeadContent(String postName) { + return client.get(Post.class, postName) + .flatMap(post -> { + var headSnapshot = post.getSpec().getHeadSnapshot(); + return super.getContent(headSnapshot, post.getSpec().getBaseSnapshot()); + }); + } + + @Override + public Mono getReleaseContent(String postName) { + return client.get(Post.class, postName) + .flatMap(post -> { + var releaseSnapshot = post.getSpec().getReleaseSnapshot(); + return super.getContent(releaseSnapshot, post.getSpec().getBaseSnapshot()); + }); + } + + @Override + public Mono getSpecifiedContent(String postName, String snapshotName) { + return client.get(Post.class, postName) + .flatMap(post -> { + var baseSnapshot = post.getSpec().getBaseSnapshot(); + return super.getContent(snapshotName, baseSnapshot); + }); + } + + @Override + public Flux listSnapshots(String postName) { + return client.get(Post.class, postName) + .flatMapMany(page -> listSnapshotsBy(Ref.of(page))) + .map(snapshot -> snapshot.getMetadata().getName()); + } +} diff --git a/application/src/main/java/run/halo/app/plugin/SharedApplicationContextFactory.java b/application/src/main/java/run/halo/app/plugin/SharedApplicationContextFactory.java index 5beb2e97e..3828a7c06 100644 --- a/application/src/main/java/run/halo/app/plugin/SharedApplicationContextFactory.java +++ b/application/src/main/java/run/halo/app/plugin/SharedApplicationContextFactory.java @@ -3,6 +3,7 @@ package run.halo.app.plugin; import org.springframework.context.ApplicationContext; import org.springframework.context.support.GenericApplicationContext; import org.springframework.security.web.server.context.ServerSecurityContextRepository; +import run.halo.app.content.PostContentService; import run.halo.app.core.extension.service.AttachmentService; import run.halo.app.extension.DefaultSchemeManager; import run.halo.app.extension.ExtensionClient; @@ -53,6 +54,8 @@ public enum SharedApplicationContextFactory { rootContext.getBean(NotificationCenter.class)); beanFactory.registerSingleton("externalLinkProcessor", rootContext.getBean(ExternalLinkProcessor.class)); + beanFactory.registerSingleton("postContentService", + rootContext.getBean(PostContentService.class)); // TODO add more shared instance here sharedContext.refresh();