新增三库第13号迁移和历史范围回填,保留已删除资源的任务与审计。补充仓储、调用链、身份来源及迁移失败重试回归,同步任务清单、支持矩阵和运维边界。项目成员授权与生产验收仍待完成。
43 lines
2.2 KiB
Go
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
|
|
}
|