56 lines
1.9 KiB
Markdown
56 lines
1.9 KiB
Markdown
# T-WEB-007 上传审核流程
|
||
|
||
- **状态**:done
|
||
- **依赖**:T-WEB-003 / 004 / 005
|
||
|
||
## 目标
|
||
|
||
对歌曲、动作、模型三类资产实施统一的状态机与审核流水,确保只有审核通过的资产
|
||
被客户端消费。
|
||
|
||
## load
|
||
|
||
```
|
||
DSH.md
|
||
contracts/rest-api.yaml # 锚点:#/paths/~1api~1reviews
|
||
contracts/data-models.md # 锚点:§1.2 PublishStatus、§5 ReviewRecord
|
||
contracts/database.md # 锚点:状态机
|
||
web-server/src/reviews/*
|
||
```
|
||
|
||
## 状态机(契约冻结)
|
||
|
||
```
|
||
draft ──submit──▶ pending ──approve──▶ published
|
||
│
|
||
└──reject──▶ rejected ──submit──▶ pending
|
||
```
|
||
|
||
| 方法 | 路径 | 说明 |
|
||
|---|---|---|
|
||
| GET | `/api/reviews` | 不传 `status` → 审核流水;传 `status` → 该状态待审资产(三类合并) |
|
||
| GET | `/api/reviews/:targetType/:id/history` | 单个资产的审核历史 |
|
||
| POST | `/api/reviews/:targetType/:id/submit` | → `pending` |
|
||
| POST | `/api/reviews/:targetType/:id/approve` | → `published` |
|
||
| POST | `/api/reviews/:targetType/:id/reject` | → `rejected`,**必须填写意见** |
|
||
| POST | `/api/reviews/:targetType/:id/withdraw` | → `draft` |
|
||
|
||
## 关键实现
|
||
|
||
- `STATUS_TRANSITIONS` 是状态机的唯一来源;非法流转一律 **409**,
|
||
重复审核同一状态同样 409。
|
||
- 驳回未填 `comment` → **400**(合规要求:拒绝侵权内容需留痕)。
|
||
- 每次成功流转都写一条 `review_records`,记录 `fromStatus` / `toStatus` /
|
||
`reviewer` / `comment`。
|
||
- 三类资产的直连 PATCH 也会校验状态机,避免绕过审核流程。
|
||
- `/api/catalog/export` 与 `/api/catalog/version` 只导出 `published`。
|
||
|
||
## 验收
|
||
|
||
```bash
|
||
npm run test:smoke
|
||
```
|
||
|
||
冒烟 [5] 段落:submit → pending、待审列表包含、驳回无意见 400、approve → published、
|
||
重复审核 409、流水恰好 2 条。
|