refactor: 收口公开作品详情映射

This commit is contained in:
2026-06-04 00:17:31 +08:00
parent dd52848e9c
commit 39522f3b96
8 changed files with 675 additions and 232 deletions

View File

@@ -13,7 +13,14 @@
- `resolvePlatformPublicWorkActionMode(entry, viewerUserId)`
- `resolvePlatformPublicWorkDetailOpenDecision(entry, deps)`
- `resolveActivePlatformPublicWorkAuthorEntry(args)`
- `map*WorkToPublicWorkDetail(...)`
- `mapPublicWorkDetailToPuzzleWork(entry)`
- `mapPublicWorkDetailToBigFishWork(entry)`
- `mapPublicWorkDetailToSquareHoleWork(entry)`
- `mapBarkBattlePublicDetailToWorkSummary(entry)`
- `PlatformEntryFlowShellImpl.tsx` 继续作为 Adapter根据 open strategy 调用 `openPublicWorkDetail``openPuzzlePublicWorkDetail``openJumpHopPublicWorkDetail``openWoodenFishPublicWorkDetail``openVisualNovelPublicWorkDetail``openRpgPublicWorkDetail`
- 公开详情 entry 映射与公开详情反推玩法 work 摘要也收口到 Module。壳层只在运行态启动、编辑、改造、推荐缓存和详情展示时调用映射 Interface不再在壳层顶部持有每个玩法的 DTO 拼装 Implementation。
- `mapMatch3DWorkToPublicWorkDetail` 归入 `platformMatch3DRuntimeProfile.ts`,继续委托 `normalizeMatch3DWorkForRuntimeUi` 处理素材归一和背景资产提升;`platformPublicWorkDetailFlow.ts` 不复制 Match3D 运行态素材规则。
- 本次不抽 `startSelectedPublicWork``likePublicWork``remixPublicWork``editOwnedPublicWork`。这些函数牵涉运行态启动、计数写入、草稿恢复、作品架缓存和多路错误 setter若直接搬进一个 Hook会形成浅 Interface。
## Interface 约束
@@ -26,16 +33,20 @@
- `resolvePlatformPublicWorkActionMode` 只比较 `entry.ownerUserId` 与当前 viewer user id当前用户拥有该公开作品时返回 `edit`,否则返回 `remix`
- `resolvePlatformPublicWorkDetailOpenDecision` 只表达直接展示公开详情的打开 / 阻断结果、错误文案、目标 stage 与可写入历史的路径;真正执行 setter、push history 的副作用仍由壳层 Adapter 执行。
- `resolveActivePlatformPublicWorkAuthorEntry` 只在 `work-detail` 阶段选择统一公开详情 entry在 RPG `detail` 阶段只选择非 draft 的 RPG 详情 entry作者请求、竞态 request key 和缓存仍留壳层。
- `map*WorkToPublicWorkDetail` 只把各玩法已存在的 work / gallery summary 映射为统一详情 entry公开码、封面、统计与标题字段继续复用 `rpgEntryWorldPresentation.ts` 的平台公开卡片映射。
- `mapPublicWorkDetailToPuzzleWork``mapPublicWorkDetailToBigFishWork``mapPublicWorkDetailToSquareHoleWork``mapBarkBattlePublicDetailToWorkSummary` 只用于公开详情 CTA、推荐缓存或运行态启动前的兼容 work 摘要拼装;缺省值必须留在 Module 测试中固定,壳层不得重复推导。
- Match3D 的公开详情与 work 摘要互转仍属于 Match3D Runtime Profile Module因为它依赖 `generatedItemAssets` 归一化与背景资产提升。公开详情 Flow 只接统一详情策略,不复制该运行态规则。
## Depth / Leverage / Locality
- **Depth**:壳层传入公开作品 entry当前用户 id即可得到详情打开策略动作模式;玩法判定细则藏在 Module Implementation 内。
- **Leverage**:新增玩法公开详情时先补 Strategy 单测,再接壳层 Adapter不必在多个 JSX / callback 位置重复 sourceType 判断。
- **Locality**:公开作品详情入口的纯策略集中到一个小 Module启动运行态、点赞、改造、编辑等副作用仍留在壳层避免伪 Seam。
- **Depth**:壳层传入公开作品 entry、玩法 work summary 或当前用户 id即可得到详情打开策略动作模式和统一详情映射;玩法判定与 DTO 默认值藏在 Module Implementation 内。
- **Leverage**:新增玩法公开详情时先补 Strategy / Mapping 单测,再接壳层 Adapter不必在多个 JSX / callback 位置重复 sourceType 判断或 DTO 回填
- **Locality**:公开作品详情入口的纯策略与通用映射集中到一个小 ModuleMatch3D 素材归一仍在 Match3D Module启动运行态、点赞、改造、编辑等副作用仍留在壳层避免伪 Seam。
## 验收
- `npm run test -- src/components/platform-entry/platformPublicWorkDetailFlow.test.ts`
- `npm run test -- src/components/platform-entry/platformMatch3DRuntimeProfile.test.ts`
- `npm run test -- src/components/platform-entry/platformPublicGalleryFlow.test.ts`
- `npm run test -- src/components/platform-entry/PlatformWorkDetailView.test.tsx`
- `npm run test -- src/components/rpg-entry/RpgEntryFlowShell.agent.interaction.test.tsx -t "public detail|owned public puzzle detail|direct missing public work detail"`