feat(user): 注销账号数据级联清理 + 后台删除端点 #115

Open
liujiahui wants to merge 1 commits from 7-4ljh into main
Member

注销账号:数据级联清理 + 后台删除端点

弹窗承诺「永久删除」但后端此前只软删 user 行、业务数据全残留(合规/隐私违约)。本 PR 让删除名副其实。

清理策略(按「删了是否破坏对账 / 影响别人 / 是否 PII」分类)

  • 物理删除(个人内容/行为/成绩/PII,只涉本人):比价 / 省钱 / 签到 / 领券 / 任务 / 里程碑领取 / 设备活跃 / 价格上报 / 反馈 / 引导标记 / 埋点 / 看广告时长日志 / 邀请指纹
  • 清零保留:coin_account 金币/现金/邀请金/累计收益归零,行保留(不碰资金流水外键)
  • 保留 + 匿名化解绑(动了会破坏对账/在途到账/发奖幂等/误伤邀请人):三本资金流水、提现单、微信转账授权、广告发奖幂等(ad_reward / ad_feed_reward)、广告 eCPM 对账(ad_ecpm)、邀请关系(inviter/invitee 双向)
  • 匿名化 user 行:status=deleted、phone→deleted_<id>、释放 wechat_openid / invite_code 唯一槽

资金前置闸(C 端与后台一致)

有未提现现金 / 邀请奖励金 / 在审提现单 → 409 拒绝,账号不被删、余额不清零。

改动

文件 改动
api/v1/user.py DELETE /api/v1/user 加三道资金 409 前置校验
repositories/user.py soft_delete_account 落地分类删除(补 ad_watch_log 埋点删除 + docstring 说明 ad_* 保留理由)
repositories/wallet.py 新增 get_invite_cash_balance_cents(邀请金 409 校验用)
admin/routers/users.py DELETE /admin/api/users/{id} 复用 soft_delete_account + 审计,仅 super_admin;审计与清理同一 commit 原子
admin/schemas/user.py DeleteUserRequest(必填 reason 入审计)

测试

  • test_delete_account.py:级联删除个人表删空 / 余额归零 / 保留表存活 + 匿名化 + 409 闸 + 旧 token 失效(6 测)
  • test_admin_write.py:后台删除 + 审计留痕 + operator 403 + 重复删 400 + 有钱 409(4 测)
  • 全量 pytest:除 5 个与本 PR 无关的预存失败(coupon proxy body 转发 / 返佣发币)外全绿

🤖 Generated with Claude Code

## 注销账号:数据级联清理 + 后台删除端点 弹窗承诺「永久删除」但后端此前只软删 user 行、业务数据全残留(合规/隐私违约)。本 PR 让删除名副其实。 ### 清理策略(按「删了是否破坏对账 / 影响别人 / 是否 PII」分类) - **物理删除**(个人内容/行为/成绩/PII,只涉本人):比价 / 省钱 / 签到 / 领券 / 任务 / 里程碑领取 / 设备活跃 / 价格上报 / 反馈 / 引导标记 / 埋点 / 看广告时长日志 / 邀请指纹 - **清零保留**:coin_account 金币/现金/邀请金/累计收益归零,行保留(不碰资金流水外键) - **保留 + 匿名化解绑**(动了会破坏对账/在途到账/发奖幂等/误伤邀请人):三本资金流水、提现单、微信转账授权、广告发奖幂等(ad_reward / ad_feed_reward)、广告 eCPM 对账(ad_ecpm)、邀请关系(inviter/invitee 双向) - **匿名化 user 行**:status=deleted、phone→deleted_&lt;id&gt;、释放 wechat_openid / invite_code 唯一槽 ### 资金前置闸(C 端与后台一致) 有未提现现金 / 邀请奖励金 / 在审提现单 → `409` 拒绝,账号不被删、余额不清零。 ### 改动 | 文件 | 改动 | |---|---| | `api/v1/user.py` | `DELETE /api/v1/user` 加三道资金 409 前置校验 | | `repositories/user.py` | `soft_delete_account` 落地分类删除(补 `ad_watch_log` 埋点删除 + docstring 说明 ad_* 保留理由) | | `repositories/wallet.py` | 新增 `get_invite_cash_balance_cents`(邀请金 409 校验用) | | `admin/routers/users.py` | `DELETE /admin/api/users/{id}` 复用 `soft_delete_account` + 审计,仅 `super_admin`;审计与清理同一 commit 原子 | | `admin/schemas/user.py` | `DeleteUserRequest`(必填 `reason` 入审计) | ### 测试 - `test_delete_account.py`:级联删除个人表删空 / 余额归零 / 保留表存活 + 匿名化 + 409 闸 + 旧 token 失效(6 测) - `test_admin_write.py`:后台删除 + 审计留痕 + operator 403 + 重复删 400 + 有钱 409(4 测) - 全量 `pytest`:除 5 个与本 PR 无关的预存失败(coupon proxy body 转发 / 返佣发币)外全绿 🤖 Generated with [Claude Code](https://claude.com/claude-code)
liujiahui added 1 commit 2026-07-04 15:02:14 +08:00
C 端与后台复用同一套 soft_delete_account:物理删除个人内容/行为/PII 表(比价/省钱/
签到/领券/任务/设备/价格上报/反馈/引导/埋点/看广告时长/邀请指纹)+ 清零余额 + 匿名化
user 行释放唯一约束;保留资金流水/邀请关系/广告幂等+对账表(对账/幂等/邀请人侧归属)。

- api/v1/user.py: DELETE /api/v1/user 加资金前置闸(未提现现金/邀请金 / 在审提现单 → 409)
- repositories/user.py: soft_delete_account 落地分类删除(补 ad_watch_log 埋点删除)
- repositories/wallet.py: 新增 get_invite_cash_balance_cents(邀请金 409 校验用)
- admin/routers/users.py: DELETE /admin/api/users/{id} 复用清理 + 审计,仅 super_admin
- admin/schemas/user.py: DeleteUserRequest(必填 reason 入审计)
- tests: 级联删除/余额归零/保留表存活 6 测 + admin 删除/审计/403/400/409 4 测

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Checking for merge conflicts…
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin 7-4ljh:7-4ljh
git checkout 7-4ljh
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: WonderableAI/shaguabijia-app-server#115