From 0c96c29f9458973a4ac7b3a8dccb94aeb2ff80f4 Mon Sep 17 00:00:00 2001 From: ChiveHao Date: Thu, 10 Oct 2024 23:32:26 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E6=8F=92=E4=BB=B6?= =?UTF-8?q?=E8=B0=83=E7=94=A8=E4=B8=89=E6=96=B9=E5=85=83=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E6=9D=A1=E7=9B=AE=E6=9F=A5=E5=AF=BB=20(#683)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.MD | 6 +++ .../api/core/meta/DelegateMetaService.java | 9 ++++ .../run/ikaros/api/core/meta/MetaOperate.java | 12 +++++ gradle.properties | 2 +- .../server/core/meta/DefaultMetaService.java | 50 +++++++++++++++++++ .../ikaros/server/core/meta/MetaOperator.java | 28 +++++++++++ .../ikaros/server/core/meta/MetaService.java | 14 ++++++ 7 files changed, 120 insertions(+), 1 deletion(-) create mode 100644 api/src/main/java/run/ikaros/api/core/meta/DelegateMetaService.java create mode 100644 api/src/main/java/run/ikaros/api/core/meta/MetaOperate.java create mode 100644 server/src/main/java/run/ikaros/server/core/meta/DefaultMetaService.java create mode 100644 server/src/main/java/run/ikaros/server/core/meta/MetaOperator.java create mode 100644 server/src/main/java/run/ikaros/server/core/meta/MetaService.java diff --git a/CHANGELOG.MD b/CHANGELOG.MD index f81db872..8261bf39 100644 --- a/CHANGELOG.MD +++ b/CHANGELOG.MD @@ -2,6 +2,12 @@ 更新日志文档,版本顺序从新到旧,最新版本在最前(上)面。 +# 0.15.11 + +## 插件支持 + +- 添加`MetaOperate`以支持插件调用三方元数据插件条目查寻 + # 0.15.10 ## 问题修复 diff --git a/api/src/main/java/run/ikaros/api/core/meta/DelegateMetaService.java b/api/src/main/java/run/ikaros/api/core/meta/DelegateMetaService.java new file mode 100644 index 00000000..6b91161a --- /dev/null +++ b/api/src/main/java/run/ikaros/api/core/meta/DelegateMetaService.java @@ -0,0 +1,9 @@ +package run.ikaros.api.core.meta; + +import org.pf4j.ExtensionPoint; +import reactor.core.publisher.Flux; +import run.ikaros.api.core.subject.SubjectMeta; + +public interface DelegateMetaService extends ExtensionPoint { + Flux findAll(String keyword); +} diff --git a/api/src/main/java/run/ikaros/api/core/meta/MetaOperate.java b/api/src/main/java/run/ikaros/api/core/meta/MetaOperate.java new file mode 100644 index 00000000..e26f2265 --- /dev/null +++ b/api/src/main/java/run/ikaros/api/core/meta/MetaOperate.java @@ -0,0 +1,12 @@ +package run.ikaros.api.core.meta; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import run.ikaros.api.core.subject.SubjectMeta; +import run.ikaros.api.plugin.AllowPluginOperate; + +public interface MetaOperate extends AllowPluginOperate { + Mono findOne(String keyword); + + Flux findAll(String keyword); +} diff --git a/gradle.properties b/gradle.properties index 4a811642..425fb5a3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1 +1 @@ -version=0.15.10 +version=0.15.11 diff --git a/server/src/main/java/run/ikaros/server/core/meta/DefaultMetaService.java b/server/src/main/java/run/ikaros/server/core/meta/DefaultMetaService.java new file mode 100644 index 00000000..99a27d42 --- /dev/null +++ b/server/src/main/java/run/ikaros/server/core/meta/DefaultMetaService.java @@ -0,0 +1,50 @@ +package run.ikaros.server.core.meta; + +import java.util.ArrayList; +import java.util.List; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import run.ikaros.api.core.meta.DelegateMetaService; +import run.ikaros.api.core.subject.SubjectMeta; +import run.ikaros.api.infra.utils.AssertUtils; +import run.ikaros.server.plugin.ExtensionComponentsFinder; + +@Slf4j +@Service +public class DefaultMetaService implements MetaService { + + private final ExtensionComponentsFinder extensionComponentsFinder; + + public DefaultMetaService(ExtensionComponentsFinder extensionComponentsFinder) { + this.extensionComponentsFinder = extensionComponentsFinder; + } + + @Override + public Mono findOne(String keyword) { + AssertUtils.notBlank(keyword, "'keyword' has not blank."); + return findAll(keyword) + .collectList() + .filter(list -> !list.isEmpty()) + .flatMap(list -> Mono.justOrEmpty(list.get(0))); + } + + @Override + public Flux findAll(String keyword) { + AssertUtils.notBlank(keyword, "'keyword' has not blank."); + List metaService = + extensionComponentsFinder.getExtensions(DelegateMetaService.class); + return Flux.fromStream(metaService.stream()) + .flatMap(service -> service.findAll(keyword).collectList()) + .collectList() + .map(list -> { + List subjectMetas = new ArrayList<>(); + for (List metas : list) { + subjectMetas.addAll(metas); + } + return subjectMetas; + }) + .flatMapMany(Flux::fromIterable); + } +} diff --git a/server/src/main/java/run/ikaros/server/core/meta/MetaOperator.java b/server/src/main/java/run/ikaros/server/core/meta/MetaOperator.java new file mode 100644 index 00000000..0e2ac02f --- /dev/null +++ b/server/src/main/java/run/ikaros/server/core/meta/MetaOperator.java @@ -0,0 +1,28 @@ +package run.ikaros.server.core.meta; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import run.ikaros.api.core.meta.MetaOperate; +import run.ikaros.api.core.subject.SubjectMeta; + +@Slf4j +@Component +public class MetaOperator implements MetaOperate { + private final MetaService metaService; + + public MetaOperator(MetaService metaService) { + this.metaService = metaService; + } + + @Override + public Mono findOne(String keyword) { + return metaService.findOne(keyword); + } + + @Override + public Flux findAll(String keyword) { + return metaService.findAll(keyword); + } +} diff --git a/server/src/main/java/run/ikaros/server/core/meta/MetaService.java b/server/src/main/java/run/ikaros/server/core/meta/MetaService.java new file mode 100644 index 00000000..89c35eea --- /dev/null +++ b/server/src/main/java/run/ikaros/server/core/meta/MetaService.java @@ -0,0 +1,14 @@ +package run.ikaros.server.core.meta; + +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; +import run.ikaros.api.core.subject.SubjectMeta; + +/** + * Meta service. + */ +public interface MetaService { + Mono findOne(String keyword); + + Flux findAll(String keyword); +}