Scert/backend/internal/database/history_scope.go
xuans 0ccdb14b26 完善任务审计范围快照与身份关联并同步整改进度
新增三库第13号迁移和历史范围回填,保留已删除资源的任务与审计。补充仓储、调用链、身份来源及迁移失败重试回归,同步任务清单、支持矩阵和运维边界。项目成员授权与生产验收仍待完成。
2026-09-28 11:48:27 +08:00

43 lines
2.2 KiB
Go

package database
import (
"context"
"database/sql"
"fmt"
)
// 历史范围是不可级联删除的快照,不强行给已删除资源补默认项目或操作者。
// MySQL 的部分 DDL 重试只回填仍未知的记录,不覆盖已经保存的范围。
func backfillHistoryScope(ctx context.Context, db interface {
ExecContext(context.Context, string, ...any) (sql.Result, error)
}) error {
statements := []string{
`UPDATE tasks SET scope_type = 'system' WHERE scope_type = 'unknown'
AND task_type = 'management_renewal' AND domain_id = 'management-certificate'`,
`UPDATE tasks SET scope_type = 'project',
project_id = (SELECT d.project_id FROM domains d WHERE d.id = tasks.domain_id)
WHERE scope_type = 'unknown' AND EXISTS (SELECT 1 FROM domains d WHERE d.id = tasks.domain_id)`,
`UPDATE audit_logs SET scope_type = 'system' WHERE scope_type = 'unknown'
AND (resource_type IN ('auth', 'user', 'super_admin')
OR (resource_type = 'management_certificate' AND resource_id = 'management-certificate'))`,
`UPDATE audit_logs SET task_id = resource_id WHERE resource_type = 'task' AND task_id = ''`,
`UPDATE audit_logs SET scope_type = (SELECT t.scope_type FROM tasks t WHERE t.id = audit_logs.task_id),
project_id = (SELECT t.project_id FROM tasks t WHERE t.id = audit_logs.task_id)
WHERE scope_type = 'unknown' AND task_id <> '' AND EXISTS (SELECT 1 FROM tasks t WHERE t.id = audit_logs.task_id)`,
`UPDATE audit_logs SET scope_type = 'project',
project_id = (SELECT d.project_id FROM domains d WHERE d.id = audit_logs.resource_id)
WHERE scope_type = 'unknown' AND resource_type IN ('domain', 'certificate')
AND EXISTS (SELECT 1 FROM domains d WHERE d.id = audit_logs.resource_id)`,
`UPDATE audit_logs SET scope_type = 'project',
project_id = (SELECT s.project_id FROM servers s WHERE s.id = audit_logs.resource_id)
WHERE scope_type = 'unknown' AND resource_type = 'server'
AND EXISTS (SELECT 1 FROM servers s WHERE s.id = audit_logs.resource_id)`,
}
for _, statement := range statements {
if _, err := db.ExecContext(ctx, statement); err != nil {
return fmt.Errorf("回填任务审计历史范围失败:%w", err)
}
}
return nil
}