diff --git a/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/application/ContentAppService.java b/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/application/ContentAppService.java index 820c593e..c10cfa9e 100644 --- a/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/application/ContentAppService.java +++ b/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/application/ContentAppService.java @@ -17,6 +17,11 @@ public interface ContentAppService { */ PageResult listWorks(Long userId, Integer pageNo, Integer pageSize, String status); + /** + * 列出作品可绑定的 active Meta Schema 选项(targetType 为 null 则全部 active)。 + */ + List listWorkSchemaOptions(String targetType); + /** * 创建作品。 */ diff --git a/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/application/ContentAppServiceImpl.java b/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/application/ContentAppServiceImpl.java index ca80b929..8c8173b6 100644 --- a/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/application/ContentAppServiceImpl.java +++ b/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/application/ContentAppServiceImpl.java @@ -9,6 +9,7 @@ import cn.iocoder.muse.module.content.convert.ContentConvert; import cn.iocoder.muse.module.content.dal.dataobject.*; import cn.iocoder.muse.module.content.dal.mysql.*; import cn.iocoder.muse.module.content.domain.ContentRevisionGuard; +import cn.iocoder.muse.module.meta.api.schema.MetaSchemaBriefDTO; import cn.iocoder.muse.module.meta.api.schema.MetaSchemaQueryApi; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; @@ -60,6 +61,23 @@ public class ContentAppServiceImpl implements ContentAppService { return new PageResult<>(page.getList().stream().map(ContentConvert::toWorkSummary).toList(), page.getTotal()); } + @Override + public List listWorkSchemaOptions(String targetType) { + // 经 meta-api 端口拉取 active schema(不跨 BC 查 meta.dal),映射为前端 work 创建选项。 + return metaSchemaQueryApi.listActiveSchemasByTargetType(targetType).stream() + .map(this::toWorkSchemaOption) + .toList(); + } + + private WorkSchemaOptionRespVO toWorkSchemaOption(MetaSchemaBriefDTO brief) { + WorkSchemaOptionRespVO option = new WorkSchemaOptionRespVO(); + option.setId(brief.id()); + option.setSchemaKey(brief.schemaKey()); + option.setDisplayName(brief.displayName()); + option.setTargetType(brief.targetType()); + return option; + } + @Override @Transactional(rollbackFor = Exception.class) public WorkRespVO createWork(Long userId, WorkCreateReqVO reqVO) { diff --git a/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/controller/app/AppContentController.java b/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/controller/app/AppContentController.java index 53730c2a..afe07158 100644 --- a/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/controller/app/AppContentController.java +++ b/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/controller/app/AppContentController.java @@ -41,6 +41,15 @@ public class AppContentController { return success(contentAppService.listWorks(getLoginUserId(), pageNo, pageSize, status)); } + @GetMapping("/works/schema-options") + @Operation(summary = "查询作品可绑定的 Meta Schema 选项") + public CommonResult> listWorkSchemaOptions( + @RequestHeader(value = "X-API-Version", required = false) String apiVersion, + @RequestParam(required = false) String targetType) { + ContentApiVersionGuard.requireVersion(apiVersion); + return success(contentAppService.listWorkSchemaOptions(targetType)); + } + @PostMapping("/works") @Operation(summary = "创建作品") public CommonResult createWork(@RequestHeader(value = "X-API-Version", required = false) String apiVersion, diff --git a/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/controller/app/vo/WorkSchemaOptionRespVO.java b/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/controller/app/vo/WorkSchemaOptionRespVO.java new file mode 100644 index 00000000..3953f1cd --- /dev/null +++ b/muse-cloud/muse-module-content/muse-module-content-server/src/main/java/cn/iocoder/muse/module/content/controller/app/vo/WorkSchemaOptionRespVO.java @@ -0,0 +1,25 @@ +package cn.iocoder.muse.module.content.controller.app.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * 作品可绑定的 Meta Schema 选项(work 创建/编辑时供用户选择)。 + */ +@Schema(description = "作品可绑定的 Meta Schema 选项") +@Data +public class WorkSchemaOptionRespVO { + + @Schema(description = "Schema id(绑定时回传给 createWork/updateWork 的 schemaId)") + private Long id; + + @Schema(description = "Schema 业务键") + private String schemaKey; + + @Schema(description = "展示名") + private String displayName; + + @Schema(description = "目标类型") + private String targetType; + +} diff --git a/muse-cloud/muse-module-content/muse-module-content-server/src/test/java/cn/iocoder/muse/module/content/application/ContentAppServiceTest.java b/muse-cloud/muse-module-content/muse-module-content-server/src/test/java/cn/iocoder/muse/module/content/application/ContentAppServiceTest.java index f19ad866..fd2bd977 100644 --- a/muse-cloud/muse-module-content/muse-module-content-server/src/test/java/cn/iocoder/muse/module/content/application/ContentAppServiceTest.java +++ b/muse-cloud/muse-module-content/muse-module-content-server/src/test/java/cn/iocoder/muse/module/content/application/ContentAppServiceTest.java @@ -188,6 +188,19 @@ class ContentAppServiceTest extends BaseMockitoUnitTest { verify(workMapper).updateById(argThat((WorkDO w) -> Long.valueOf(7L).equals(w.getWorkSchemaId()))); } + @Test + void should_listWorkSchemaOptions_fromMetaPort() { + // 经 meta 端口拉取 active schema 选项,映射为前端可选项(work 创建/编辑用)。 + when(metaSchemaQueryApi.listActiveSchemasByTargetType("work")).thenReturn(List.of( + new MetaSchemaBriefDTO(5L, "work_core", "作品核心", "work"))); + + List options = contentAppService.listWorkSchemaOptions("work"); + + assertEquals(1, options.size()); + assertEquals(5L, options.getFirst().getId()); + assertEquals("work_core", options.getFirst().getSchemaKey()); + } + @Test void should_replayFirstSaveBlockResult_when_blockChangedAfterFirstExecution() { BlockSaveReqVO reqVO = new BlockSaveReqVO();