收口 M3 复核遗留:文档如实口径、fork-source 状态说明、forkAuthorization 机器守卫、e2e 引用去行号
- 技术方案 §3.4:删掉「GET /games/{gameId} 追加 forkSourceAvailable」——实现里不存在该字段;改为如实口径:改造入口显隐只依据 forkAuthorization,真实可复刻形态由 /fork-source 的 source 回答,若 M2b 要区分「可源码级改造 / 只能参考」届时再加
- 实施计划(M1)§5:同步去掉 forkSourceAvailable 并注明「未实现、也不需要」,保留其余字段清单不动
- 技术方案 §2.6 时序图:说明字句从「GET …/fork-source 是待实现接口」改为「M2a 已实现(形状见 §3.4 登录用户表)」,并在图内加一行 Note 标注「图中字段名是 M2b 目标形状」;图属目标形态的免责声明保留
- parity 脚本:game_payload 增加 mustEmit ['forkAuthorization']——该字段 TS 侧可选(旧响应可省),但公开与作者响应必须发出,否则详情页授权徽章与改造入口会静默退化成「禁止共创」;public_game_payload 以 game_payload 为 base,因此一并受保护
- e2e 脚本头部:把全部行号引用(含已过期 2–4 行的那些)改为「文件 + 符号」引用(router()/lineage_read_or_not_found()/GameDistributionLineageNode/lineage.rs 常量与函数等),并删除「消费链路在未提交的 M2a WIP 里」这类会过期的措辞,改为「已在 M2a 落地」;只改注释,断言逻辑未动
This commit is contained in:
@@ -46,7 +46,7 @@
|
||||
|
||||
- `GameDistributionCreateGameRequest` 追加 `fork: Option<GameDistributionForkDeclaration>`(`parentGameId` / `parentVersionId`)。
|
||||
- 新增 `GameDistributionSetForkAuthorizationRequest { expectedForkAuthorization, forkAuthorization }`。
|
||||
- 游戏响应加 `forkAuthorization`,公开响应加 `forkCount` / `lineage` / `forkSourceAvailable`。
|
||||
- 游戏响应加 `forkAuthorization`,公开响应加 `forkCount` / `lineage`。(原计划的 `forkSourceAvailable` 未实现,也不需要:改造入口的显隐依据 `forkAuthorization`,可复刻形态由 `/fork-source` 回答;若 M2b 要在详情页区分「可源码级改造 / 只能参考」,届时再加。)
|
||||
|
||||
### 6. `server-rs/crates/api-server/src/modules/game_distribution.rs`
|
||||
|
||||
|
||||
@@ -177,6 +177,7 @@ sequenceDiagram
|
||||
U->>AGC: 唤起客户端(方式待拍板:手工输入 / 取件码 / deep link)
|
||||
AGC->>API: GET /api/game-distribution/games/X/fork-source (Bearer)
|
||||
API-->>AGC: {versionId, bundleSha256, bundleBytes, downloadPath}
|
||||
Note over API: 图中的字段名是 M2b 目标形状;M2a 已实现的形状见 §3.4「登录用户」表
|
||||
AGC->>AGC: 下载 → 校验 SHA-256 → 解压(同模板安装门禁)→ 新建项目
|
||||
AGC->>AGC: manifest 写入 forkedFrom{gameId, versionId, rootGameId, generation}
|
||||
Note over AGC: 工程源包可改源码/重跑构建/发布;只有成品包则只能试玩与提取素材(§3.5.1)
|
||||
@@ -184,7 +185,7 @@ sequenceDiagram
|
||||
API->>API: 校验授权/来源版本/计算 generation 与 root → 写 lineage
|
||||
```
|
||||
|
||||
> 说明:本图是**目标形态**。唤起方式尚未拍板(§7 第 11 条),`GET …/fork-source` 是**待实现**接口(§3.5.1),`fork-source` 的响应字段最终以定稿合同为准。
|
||||
> 说明:本图是**目标形态**。唤起方式尚未拍板(§7 第 11 条);`GET …/fork-source` **M2a 已实现**(受鉴权元数据 + 取件本体,实际字段与状态码见 §3.4「登录用户」表),但本图里的响应字段名是 M2b 的目标形状,定稿一律以 §3.4 表格为准。
|
||||
|
||||
**C. 溯源与命名**
|
||||
|
||||
@@ -302,7 +303,7 @@ pub(crate) project_bundle_sha256: Option<String>,
|
||||
|
||||
| 方法 / 路径 | 说明 |
|
||||
| --- | --- |
|
||||
| `GET /games/{gameId}`(**既有,响应增量**) | 追加 `forkAuthorization`、`forkCount`、`lineage`(可选)、`forkSourceAvailable`(布尔,仅表达"能否真复刻",不泄露对象键) |
|
||||
| `GET /games/{gameId}`(**既有,响应增量**) | 追加 `forkAuthorization`、`forkCount`、`lineage`(可选)。**不追加 `forkSourceAvailable`**:网页端「改造这个作品」入口的显隐只依据 `forkAuthorization`(已公开 + 非禁止即可引导去取件),真实可复刻形态由 `/games/{gameId}/fork-source` 的 `source` 字段回答,不需要在公开详情里提前判断;若 M2b 需要在详情页区分「可源码级改造 / 只能参考」,再在 M2b 里加该字段 |
|
||||
| `GET /games/{gameId}/lineage`(新) | 以该 game 的根为顶返回树:`{ rootGameId, root: LineageNode \| null, nodes: [LineageNode], truncated }`,`LineageNode = { gameId, title, authorName, generation, parentGameId, playCount, status }`,按代际升序 / 同代创建时间升序稳定排序;节点上限 200,超出返回 `truncated: true`。**锚点必须公开可读**:未公开、已软删除或不存在的作品返回 404(与公开详情同口径),不用空标题占位或空树代替 404。树内只出现未软删除且已公开的作品;父/祖辈被排除时孩子照常出现并保留 `generation` 与 `parentGameId`,由展示层标注「原作品已不可用」,不补 null 占位节点 |
|
||||
| `GET /games/{gameId}/derived`(新,可选分页) | 直接子代列表:`{ gameId, nodes: [LineageNode], truncated }`,只含未软删除且已公开的直接子代(与公开详情 `forkCount` 同口径,因此条数与「被改编 N」一致);锚点同样必须公开可读,否则 404 |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user