Merge branch 'master' into codex/frontend-error-dialogs

# Conflicts:
#	.hermes/shared-memory/decision-log.md
#	server-rs/crates/api-server/src/generated_asset_sheets.rs
This commit is contained in:
kdletters
2026-05-26 22:10:41 +08:00
175 changed files with 4760 additions and 465 deletions

View File

@@ -0,0 +1,92 @@
# 统一公开作品 ReadModel 设计
更新时间:`2026-05-26`
## 背景
各玩法原本各自维护 `*_gallery_card_view` / `*_gallery_view` / `custom_world_gallery_entry` 等公开投影。它们继续保留为 source view 和兼容路径,但公开列表与公开详情的主读模型需要跨玩法统一,避免 `api-server` 在 HTTP 热路径里为每个玩法各写一套拼装逻辑。
## 统一契约
公开列表主读模型:
- `public_work_gallery_entry`
公开详情摘要主读模型:
- `public_work_detail_entry`
统一字段只保留公开层契约所需内容:
- `source_type`
- `work_id`
- `profile_id`
- `source_session_id`
- `public_work_code`
- `owner_user_id`
- `author_display_name`
- `world_name`
- `subtitle`
- `summary_text`
- `cover_image_src`
- `cover_asset_id`
- `theme_tags`
- `play_count`
- `remix_count`
- `like_count`
- `published_at_micros`
- `updated_at_micros`
- `sort_time_micros`
- `detail_payload_json`
其中 `detail_payload_json` 只承载平台详情页展示扩展,不承载正式 runtime 配置、玩法规则或草稿真相。
## 来源与兼容
统一 public view 由现有玩法 source view 组装:
- `puzzle_gallery_card_view`
- `puzzle_gallery_view`
- `custom_world_gallery_entry`
- `jump_hop_gallery_card_view`
- `jump_hop_gallery_view`
- `wooden_fish_gallery_card_view`
- `wooden_fish_gallery_view`
- `match_3_d_gallery_view`
- `square_hole_gallery_view`
- `visual_novel_gallery_view`
- `big_fish_gallery_view`
- `bark_battle_gallery_view`
规则是:
- 旧 view 保留,不删除。
- 旧 view 退到底层 source / 兼容职责。
-`public_work_*` view 是 `api-server` 公开列表 / 详情的统一主读模型。
-`/api/runtime/<play>/gallery` 响应 shape 保持兼容,由 BFF mapper 把统一 cache 再映射回当前 DTO。
- 旧详情 / runtime / 点赞 / 游玩 / Remix 仍走玩法专用路径。
## 订阅与路由
`spacetime-client` 当前长期订阅:
- `SELECT * FROM public_work_gallery_entry`
- `SELECT * FROM public_work_detail_entry`
- `SELECT * FROM public_work_play_daily_stat`
- 各玩法 source view 作为兼容缓存和旧路径支撑
`api-server` 当前新增统一公开路由:
- `GET /api/public-works`
- `GET /api/public-works/{publicWorkCode}`
旧 route 继续保留,由 BFF 从统一 cache 映射回旧 DTO 形状。
## 验证
- `npm run spacetime:generate`
- `npm run check:spacetime-schema`
- `cargo check -p spacetime-client --manifest-path server-rs/Cargo.toml`
- `cargo check -p api-server --manifest-path server-rs/Cargo.toml`
- `npm run typecheck`
- `npm run check:encoding`