视觉按最新原型,业务按已确认PRD。现有代码为满足设计而改造。执行见按设计实施与任务卡;当前代码与验证范围见消费者功能页。
A03 注销后端与数据清理
本段完成真实邮箱验证码确认、原操作恢复、身份删除与个人消费记录清理。复用 Better Auth 1.7.7、已有 PostgreSQL verification、E00 command 和 Outbox,没有新增身份系统或数据表。代码已写入原项目,正式 API、App、OTA 未发布。App/Web 注销页面及本机离线清理尚未接入。
已实现的流程
- 已验证账号创建服务端注销意图,随机 operationId,5 分钟有效。当前新鲜会话本身不足以注销。
- 使用官方 sign-in 邮箱 OTP 重新登录。只有意图创建后、同 user.id 的实际新会话可绑定证明。验证码、会话 token 不写入注销收据。
- 官方 delete-user 的 beforeDelete 检查证明、当前实际会话、账号及到期时间。直接删除、旧会话、其他账号、删除链接 callback 和 token 分支不能绕过确认。
- 已有 E00 事务提交原 operation 的 terminal、撤销 App 批准、释放待播放预留,并写原 Outbox。等待 owner 锁期间再次检查证明有效期及实际会话行。
- 撤销身份会话,清个人消费记录,再消费短期证明。官方框架删除身份;查实际身份残留后才确认完成。
- 如果终态之后断线或删除失败,可信任务调用 processPending,继续原收据。恢复不需要旧账号重新登录,不创建替代账号、不重发奖励。失败保持原事件待处理,租约到期后继续。
删除结果以原操作状态为准,HTTP 成功不能代替真实残留检查。故障测试已证实:框架可能吞掉用户快照查询错误而跳过删除。本段不会把这种情况标记为已完成。
接口
| 接口 | 约束 |
|---|---|
| POST /api/consumer/account/delete/intent,空 JSON | 已验证官方账号;不接受 userId、sessionId、设备证明等客户端身份 |
| 官方 POST /api/auth/email-otp/send-verification-otp | type=sign-in;现有 6 位、5 分钟、次数限制、轮换与哈希存储保持原框架行为 |
| 官方 POST /api/auth/sign-in/email-otp | 通过 fetchOptions.headers 传 x-dramivio-deletion-intent;框架验证后绑定真实 newSession |
| 官方 POST /api/auth/delete-user,空 JSON | 相同意图头;业务 beforeDelete 检查绑定证明,不把自定义值填入官方 token |
| GET /api/consumer/account/delete/status?operationId=... | 只返回 awaiting_verification、ready、deleting、deleted 与必要短期到期时间;随机操作无法读取旧邮箱、片单、进度 |
状态查询精确跳过旧身份、来源和 viewer 中间件,因此会话已撤销、旧来源权限已变化时仍可查询。网站同源、方法与不缓存检查保留。其他账号接口继续走原身份体系。注销本身由官方登录路由处理;网站未增加任意 userId 删除入口。
清理与保留
| 立即清理或失效 | 处理 |
|---|---|
| 追剧、逐集位置、观看区间、播放上报、逐剧范围与个人状态行 | 按实际 FK 顺序删除;E00 保留终态拒绝迟到上报 |
| 搜索词、筛选快照与个人 AI 日计数 | 删除;快照 INSERT、模型预算写入与同 owner 终态锁串行,阻止迟到写入复活 |
| 身份账号、登录会话、身份关联账户 | 通过官方 helper 删除;查 user/session/account 实际剩余行 |
| 邀请码、未到账关系/奖励 | 邀请码撤销;未到账奖励阻止、释放持有预留 |
| 邀请观看明细及其重复 command proof、本人申诉原文、原始 IP、非必要个人设备关联 | 删除或脱敏 |
已入账奖励、共享设备已用次数、原操作收据和旧 UID 终态保留最少账务/去重事实。已到账但丢 ACK 时,仅恢复原奖励,不另发。另一方有效申诉及已结案的拒绝原因、审核时间保持原结果。相同邮箱再次注册产生新的 user.id;旧任务固定旧 UID,不会按邮箱删除新账号。
当前没有统一审计期限及压缩任务,不能宣称“全部关联记录均已物理删除”或“所有数据 N 天后自动消失”。短期 OTP/验证记录由官方用途和真实 TTL 失效;未能精确归属的换邮箱验证码不做模糊删除,以免误删另一账号。审计压缩需同时限定旧操作接受范围,后续单独验收。
源码接入点
- services/platform/src/account-deletion.mjs:可导入 createConsumerDeletion;begin、verified、beforeDelete、afterDelete、status、processPending。
- auth.mjs、runtime.mjs、platform.mjs:官方登录/删除钩子和实际身份组合。
- state.mjs、referral.mjs:幂等终态清理。搜索和模型预算复用 catalog.mjs 的现 owner 锁。
- entitlements.mjs:敏感终态命令可携带受信 authSessionId;Outbox 可按既有 kind/commandActorId/operationId 领取,不误消费普通管理停用任务。
- internal/app/consumer_account.go:网站意图和结果查询适配。
业务连接释放后才调用官方 helper;单连接池下也不会嵌套等待。成功的官方删除路由后立即处理本次 Outbox。失败恢复函数已可运行,运营定时执行器尚未挂载,不宣称后台已自动周期清理。
验证
真实 PostgreSQL 18 RAM、官方 Better Auth HTTP 与实际邮箱 OTP 路由;邮件仅在隔离环境本地截取,无真实 SMTP。
- 注销专项 15/15:14 个子场景及顶层组,包括权限确认、证明到期、个人清理、安装撤权、清理失败恢复、SDK 无声跳过删除、迟到 AI、普通管理停用保护、同邮箱新身份、未到账与已到账奖励、另一方申诉和并发确认。
- 全平台 148/148,20 个顶层组,14.644 秒。旧会话、双邮箱、额度、邀请、搜索及进度回归保留。
- Go 新接口/官方代理/原身份 4 个定向测试通过;TestConsumer、TestViewer、TestBrowser 相关回归通过。Go 接口测试为实际路由配协议替身,单列于官方 HTTP+PG 证据。
- 对抗复审发现并修复已结案邀请结果被注销重写的 P2;独立证据见注销后端复审。
历史观看证据在奖励清理测试中使用明确的隔离夹具,验证的是原账务收据恢复,不代表真实供应商签名、前台心跳或正式奖励发行已接入。
下一阶段
先接入设计稿的注销确认、验证码与结果等待页面,再处理 App 当前账号的离线许可/密钥/队列清理;未知删除结果只查询原操作。完成本机清理与运营任务接线后再开放前端入口,不把后端专项通过当成完整 A03 产品验收。