feat(account): 数据保留流程落地(36 个月下限,V049)—— closed_at + 人工审核/幂等匿名化/审计 + 运营端点 + 守卫 5 用例;测试库补 user_photos,MyBatis null 更新修复
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
-- ============================================================
|
||||
-- V049: 账户数据保留 —— 注销时间落库 + 到期处置权限
|
||||
--
|
||||
-- 背景(2026-09-19 产品决策):注销后用户数据保留**不得低于 36 个月**,
|
||||
-- 到期后经人工审核执行匿名化清除。此前隐私政策 3.3 写「注销后 30 天内删除」,
|
||||
-- 与本决策冲突,政策文本已同步修订(docs/legal/privacy-policy.md §3.3)。
|
||||
--
|
||||
-- 1. users.closed_at:closeAccount 写入;保留到期 = closed_at + 36 个月
|
||||
-- (account.data-retention-months 配置,默认 36)。
|
||||
-- 此前注销时间只存在于日志,保留期计算无数据基础 —— 到期处置流程因此无法落地。
|
||||
-- 2. account.retention.purge 权限:到期数据的人工审核处置
|
||||
-- (列出到期账号 / 执行匿名化清除)。仅授予 super_admin ——
|
||||
-- 该操作不可逆,不做批量授权(Phase 22「死配置」教训:权限必须有真实读取点)。
|
||||
--
|
||||
-- 幂等:ADD COLUMN IF NOT EXISTS / ON CONFLICT DO NOTHING。
|
||||
-- ============================================================
|
||||
|
||||
ALTER TABLE users ADD COLUMN IF NOT EXISTS closed_at TIMESTAMPTZ;
|
||||
|
||||
INSERT INTO permissions (id, code, name, module, description) VALUES
|
||||
('20000000-0000-0000-0000-000000000490', 'account.retention.purge', '注销数据到期处置', 'account',
|
||||
'列出保留期已满的注销账号并执行匿名化清除(不可逆;产品 2026-09-19 确认保留期下限 36 个月)')
|
||||
ON CONFLICT (code) DO NOTHING;
|
||||
|
||||
-- super_admin 自动获得全部权限的定义在 V044 是「执行时点快照」,
|
||||
-- 本迁移新增的权限必须自行回补(V044 根因说明)。
|
||||
INSERT INTO role_permissions (role_id, permission_id)
|
||||
SELECT '00000000-0000-0000-0000-000000000001', id
|
||||
FROM permissions WHERE code = 'account.retention.purge'
|
||||
ON CONFLICT (role_id, permission_id) DO NOTHING;
|
||||
Reference in New Issue
Block a user