跳转到主要内容

FSD M13 · 火花计划

← 总则 | 附录 → | 上游:PRD §4 M13 实现落点:backend/internal/domain/spark/(model/service/repo_gorp 三件)+ cmd/server/spark_handlers.go(34 行)+ cmd/server/routes.go:259-262(挂载——物理嵌在 M11 段 :258 与 :263 之间)。事实基准=Go 代码;冻结版 qmtv/server/index.js:739-766 仅差异对拍参照。 域内要点:二十六期补登域(P0 统计残留第八例——冻结 index.js:739-766 两条端点从未入任何模块行);三阶梯 tier 表单数据源(per 系);PRD §4 M13「逐字对齐无差异」——三十期新立 DIF-30(见 m09 册/99-附录 B)。E2E-SPK-01 已实现(spark.spec.ts,清单 :15)。

M13 火花计划

2 端点全量(join+me)。零 provider 零 SSE;通知一发(join 成功);扣费面为零(唯一 Add 奖励面——反向 credits 流转)。

F13.01 火花计划(spark/join + spark/me)

对应 PRD:§4 M13 · POST /api/spark/join、GET /api/spark/me | 状态:实现 | 实现落点:spark_handlers.go:13-34、service.go:33-86、model.go:13-46、repo_gorp.go | UI:SparkView(三阶梯卡片+加入按钮)| 场景挂钩:E2E-SPK-01(已实现——重跑容错:残留轮直断投影面)

1 功能定义

编剧激励计划:一次性加入(+100 奖励)与个人阶梯投影(按 published 过审数定档)。

2 触发条件与前置状态

join:未加入前置——重复 400「您已加入火花计划」(ErrAlreadyJoined model.go:10,errRespond 400 映射,冻结 :749 同形);me:零前置(joined=false 也给完整阶梯投影,quirk)。

3 输入与校验

两端点无 body/参数(全按 token user_id)。

4 处理流程(join 四动作禁事务)

置位 users.spark_joined → credits.Add(+100, type='spark', 「加入火花计划奖励(+100)」)(service.go:44,冻结 :751 同形)→ INSERT notifications「火花计划报名成功」→ 响应 {joined: true, bonus: 100}——四动作逐序无事务(:33-53,中途失败留半态=冻结无事务同形)。 me:total=submissions 非 draft 计数(repo_gorp.go:50-56)/published/pending 双计数 → tierOf(published) 定档(0 部无命中回退首档星火,model.go:51-58)→ next_tier 环形取下一档(tierTable[(idx+1)%len],service.go:84——燎原下一档回星火,冻结 :766 同式)。

5 输出与结果状态

me 键序逐字(model.go:34-46,冻结 :762-766):joined/total/published/pending/tier/tier_perk/tier_rate/reward_earned/next_tier/tiers——reward_earned=published×per 即时计算(非累计流水);tiers=三档全量数组(min/max/per/name/perk,max *int null=无上限)。

6 状态流转

spark_joined 0→1 单向(无退出机制);阶梯随 published 增长单向升级(E2E-SUB-01 投稿过审联动)。

7 边界与异常
条件系统行为提示/码
重复 join400「您已加入火花计划」
0 部过审查 metier=星火完整投影(非空/非 404,quirk)—
ErrNotConfiguredrequireDB 前置后为死路径(repo_gorp.go:13/:21-26 guard,边界节素材)—
bonus 与 tier per=100数值偶合但不同源(service.go:44 硬编码 vs model.go:23 阶梯表——调价不同步 quirk)—
8 权限与数据规则

authed + amw;Add 奖励走 credits 唯一入账口(ErrNoUser 容错装配侧);零扣费零退款(全站唯一纯奖励域);wire 全蛇形零驼峰(model.go 亲证)。


册尾端点覆盖对账(2/2)

对账 backend/cmd/server/routes.go:259-262 亲数 2 条 ↔ 本册 F13.01:

#端点(routes.go:line)节
1POST /spark/join(:261)F13.01
2GET /spark/me(:262)F13.01

差异纪律:PRD §4 M13「逐字对齐无差异」——本册零差异零新立 DIF(bonus/per 不同源与 0 部回退均系双方一致 quirk,节内登记);集成锚 SparkChain 第十六链(me 初态→join 对账→重复 400→submissions 直插阶梯联动→401)在位。