feat: add admin work visibility controls

This commit is contained in:
kdletters
2026-05-28 00:49:45 +08:00
parent 8e96c8a67c
commit dbbd48083a
38 changed files with 1807 additions and 89 deletions

View File

@@ -0,0 +1,83 @@
# 作品可见性后台管理 Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 在后台增加统一作品可见性列表与修改能力,让管理员可以把已发布作品从公开 read model 中隐藏或恢复显示。
**Architecture:** 可见性仍以各玩法源表 `visible` 字段为真相源;新增 SpacetimeDB admin procedure 统一列出和更新各玩法作品可见性,`api-server` 只做鉴权、DTO 校验和 BFF 转发,后台前端新增简洁管理页。统一公开 read model 继续只消费 `visible=true` 的 source view不向公开契约暴露后台字段。
**Tech Stack:** Rust server-rs + SpacetimeDB module/procedure + spacetime-client bindings/facade + shared-contracts DTO + React admin-web TypeScript。
---
### Task 1: 文档契约补齐
**Files:**
- Modify: `docs/【后端架构】server-rs与SpacetimeDB数据契约-2026-05-15.md`
- Modify: `docs/technical/【后端架构】统一公开作品ReadModel设计-2026-05-26.md`
- [ ] 在 API 路由分组中补充 `/admin/api/works/visibility`
- [ ] 在统一公开作品 ReadModel 文档中写清后台只能修改源表 `visible`,隐藏后不进入 `public_work_gallery_entry` / `public_work_detail_entry`
### Task 2: DTO 与后端路由
**Files:**
- Modify: `server-rs/crates/shared-contracts/src/admin.rs`
- Modify: `server-rs/crates/api-server/src/admin.rs`
- Modify: `server-rs/crates/api-server/src/app.rs` 或现有 admin module router 文件
- [ ] 增加 `AdminWorkVisibilityEntryPayload``AdminWorkVisibilityListResponse``AdminUpdateWorkVisibilityRequest``AdminUpdateWorkVisibilityResponse`
- [ ] 新增 `GET /admin/api/works/visibility` handler必须走 `require_admin_auth`
- [ ] 新增 `POST /admin/api/works/visibility` handler校验 `sourceType``profileId` 非空并转发到 SpacetimeDB facade。
### Task 3: SpacetimeDB runtime/procedure 与 facade
**Files:**
- Modify: `server-rs/crates/module-runtime/src/domain.rs`
- Create: `server-rs/crates/spacetime-module/src/runtime/admin_work_visibility.rs`
- Modify: `server-rs/crates/spacetime-module/src/runtime.rs`
- Modify: `server-rs/crates/spacetime-module/src/lib.rs`
- Modify: `server-rs/crates/spacetime-client/src/runtime.rs`
- Modify: `server-rs/crates/spacetime-client/src/mapper/runtime.rs`
- [ ] 增加 module-runtime typed input/output 类型。
- [ ] SpacetimeDB procedure 统一读取各玩法已发布源表/view并返回可见性列表。
- [ ] SpacetimeDB procedure 根据 `sourceType + profileId` 修改对应源表 `visible``custom-world` 同步 `custom_world_gallery_entry.visible``big-fish` 使用 `session_id``bark-battle` 使用 `work_id`
- [ ] spacetime-client 增加 list/update facade 和 mapper。
### Task 4: 后台前端页面
**Files:**
- Modify: `apps/admin-web/src/api/adminApiTypes.ts`
- Modify: `apps/admin-web/src/api/adminApiClient.ts`
- Create: `apps/admin-web/src/pages/AdminWorkVisibilityPage.tsx`
- Modify: `apps/admin-web/src/app/adminRoutes.ts`
- Modify: `apps/admin-web/src/app/AdminShell.tsx`
- Modify: `apps/admin-web/src/app/AdminApp.tsx`
- [ ] 增加 API 类型和 client 方法。
- [ ] 新增简洁表格页,显示玩法、标题、作者、公开码、更新时间、可见状态。
- [ ] 修改可见性时使用 `useAdminWriteConfirm` 确认。
- [ ] 接入后台导航和 route switch。
### Task 5: 生成绑定与验证
**Files:**
- Generated: `server-rs/crates/spacetime-client/src/module_bindings*`
- Generated: front-end shared bindings if generator updates them
- [ ] Run: `npm run spacetime:generate`
- [ ] Run: `npm run check:spacetime-schema`
- [ ] Run: `cargo check -p spacetime-client --manifest-path server-rs/Cargo.toml`
- [ ] Run: `cargo check -p api-server --manifest-path server-rs/Cargo.toml`
- [ ] Run: `npm run admin-web:typecheck`
- [ ] Run: `npm run check:encoding`
### Task 6: 提交并推送
**Files:**
- All changed files
- [ ] Inspect `git diff` and `git status --short --branch`
- [ ] Commit with message `feat: add admin work visibility controls`
- [ ] Push current branch `codex/visible-work-field`

View File

@@ -43,6 +43,17 @@
其中 `detail_payload_json` 只承载平台详情页展示扩展,不承载正式 runtime 配置、玩法规则或草稿真相。
## 后台可见性管理
后台通过独立接口管理已发布作品的源表可见性:
- `GET /admin/api/works/visibility`
- `POST /admin/api/works/visibility`
后台操作 key 使用统一的 `sourceType + profileId` 组合。`profileId` 在大多数玩法中对应作品 profile特殊玩法维持既有源表身份`big-fish` 对应 `session_id``bark-battle` 对应 `work_id``custom-world` 更新源表时必须同步 `custom_world_gallery_entry.visible`,避免兼容 gallery 缓存与统一公开 read model 出现可见性漂移。
该后台能力只修改源表 / source view 过滤事实,不把 `visible` 暴露到公开列表或公开详情契约。隐藏作品后,统一 `public_work_gallery_entry``public_work_detail_entry` 不再返回该作品;恢复显示后重新进入公开 read model。
## 来源与兼容
统一 public view 由现有玩法 source view 组装:

View File

@@ -51,7 +51,7 @@ npm run check:server-rs-ddd
路由树由 `server-rs/crates/api-server/src/app.rs` 统一构造。当前主要分组:
- 健康检查:`GET /healthz`
- 后台管理:`/admin/api/*`包括登录、概览、HTTP debug、埋点、表查询、创作入口开关、兑换码、邀请码、任务配置和充值商品配置。
- 后台管理:`/admin/api/*`包括登录、概览、HTTP debug、埋点、表查询、创作入口开关、作品可见性、兑换码、邀请码、任务配置和充值商品配置。
- 认证与账号:`/api/auth/*``/api/profile/me`包括短信、密码、微信、refresh session、多端会话和登出。
- 个人中心:`/api/profile/*`,包括钱包流水、任务、领奖、充值、反馈、邀请、兑换、存档、历史浏览和游玩统计。
- LLM 与语音:`/api/llm/*``/api/speech/volcengine/*`