refactor(*): 稳定期治理 - 收敛核心架构、错误语义并修复跨项目数据竞态
This commit is contained in:
1 parent
bacd502f5c
commit
b5f3413ded
298 files changed
+12681
-26428
No files matched your search
@@ -40,43 +40,57 @@ func (s *Service) MigrateLegacyStorage() (StorageMigrationSummary, error) {
|
||||
if err != nil {
|
||||
return summary, err
|
||||
}
|
||||
// 迁移标记一旦写入,后续启动不会再次扫描旧数据。因此解析、脱敏和序列化都必须
|
||||
// 失败关闭;跳过坏记录再写 marker 会把未迁移数据永久伪装成“迁移完成”。
|
||||
for index := range tasks {
|
||||
changed := false
|
||||
if strings.Contains(tasks[index].InputJSON, "data:") {
|
||||
var input map[string]interface{}
|
||||
if json.Unmarshal([]byte(tasks[index].InputJSON), &input) == nil {
|
||||
stored, storeErr := s.persistLegacyGeneratedMediaResult(tasks[index].UserID, input)
|
||||
if storeErr != nil {
|
||||
return summary, storeErr
|
||||
}
|
||||
encoded, _ := json.Marshal(stored)
|
||||
tasks[index].InputJSON = string(encoded)
|
||||
changed = true
|
||||
if err := json.Unmarshal([]byte(tasks[index].InputJSON), &input); err != nil {
|
||||
return summary, fmt.Errorf("解析任务 %s 的旧输入失败:%w", tasks[index].ID, err)
|
||||
}
|
||||
stored, storeErr := s.persistLegacyGeneratedMediaResult(tasks[index].UserID, input)
|
||||
if storeErr != nil {
|
||||
return summary, fmt.Errorf("迁移任务 %s 的旧输入媒体失败:%w", tasks[index].ID, storeErr)
|
||||
}
|
||||
encoded, err := json.Marshal(stored)
|
||||
if err != nil {
|
||||
return summary, fmt.Errorf("序列化任务 %s 的迁移输入失败:%w", tasks[index].ID, err)
|
||||
}
|
||||
tasks[index].InputJSON = string(encoded)
|
||||
changed = true
|
||||
}
|
||||
if strings.Contains(tasks[index].ResultJSON, "data:") {
|
||||
var result map[string]interface{}
|
||||
if json.Unmarshal([]byte(tasks[index].ResultJSON), &result) == nil {
|
||||
stored, storeErr := s.persistLegacyGeneratedMediaResult(tasks[index].UserID, result)
|
||||
if storeErr != nil {
|
||||
return summary, storeErr
|
||||
}
|
||||
encoded, _ := json.Marshal(stored)
|
||||
tasks[index].ResultJSON = string(encoded)
|
||||
changed = true
|
||||
if err := json.Unmarshal([]byte(tasks[index].ResultJSON), &result); err != nil {
|
||||
return summary, fmt.Errorf("解析任务 %s 的旧结果失败:%w", tasks[index].ID, err)
|
||||
}
|
||||
stored, storeErr := s.persistLegacyGeneratedMediaResult(tasks[index].UserID, result)
|
||||
if storeErr != nil {
|
||||
return summary, fmt.Errorf("迁移任务 %s 的旧结果媒体失败:%w", tasks[index].ID, storeErr)
|
||||
}
|
||||
encoded, err := json.Marshal(stored)
|
||||
if err != nil {
|
||||
return summary, fmt.Errorf("序列化任务 %s 的迁移结果失败:%w", tasks[index].ID, err)
|
||||
}
|
||||
tasks[index].ResultJSON = string(encoded)
|
||||
changed = true
|
||||
}
|
||||
if strings.TrimSpace(tasks[index].InputJSON) != "" {
|
||||
var protected map[string]interface{}
|
||||
if json.Unmarshal([]byte(tasks[index].InputJSON), &protected) == nil {
|
||||
if err := s.protectTaskSecrets(protected); err != nil {
|
||||
return summary, err
|
||||
}
|
||||
encoded, _ := json.Marshal(protected)
|
||||
if string(encoded) != tasks[index].InputJSON {
|
||||
tasks[index].InputJSON = string(encoded)
|
||||
changed = true
|
||||
}
|
||||
var protected interface{}
|
||||
if err := json.Unmarshal([]byte(tasks[index].InputJSON), &protected); err != nil {
|
||||
return summary, fmt.Errorf("解析任务 %s 的输入以执行密钥保护失败:%w", tasks[index].ID, err)
|
||||
}
|
||||
if err := s.protectTaskSecrets(protected); err != nil {
|
||||
return summary, fmt.Errorf("保护任务 %s 的输入密钥失败:%w", tasks[index].ID, err)
|
||||
}
|
||||
encoded, err := json.Marshal(protected)
|
||||
if err != nil {
|
||||
return summary, fmt.Errorf("序列化任务 %s 的脱敏输入失败:%w", tasks[index].ID, err)
|
||||
}
|
||||
if string(encoded) != tasks[index].InputJSON {
|
||||
tasks[index].InputJSON = string(encoded)
|
||||
changed = true
|
||||
}
|
||||
}
|
||||
if tasks[index].Status == "succeeded" {
|
||||
@@ -103,14 +117,17 @@ func (s *Service) MigrateLegacyStorage() (StorageMigrationSummary, error) {
|
||||
continue
|
||||
}
|
||||
var payload map[string]interface{}
|
||||
if json.Unmarshal([]byte(assets[index].PayloadJSON), &payload) != nil {
|
||||
continue
|
||||
if err := json.Unmarshal([]byte(assets[index].PayloadJSON), &payload); err != nil {
|
||||
return summary, fmt.Errorf("解析素材 %s 的旧载荷失败:%w", assets[index].ID, err)
|
||||
}
|
||||
stored, err := s.persistLegacyGeneratedMediaResult(assets[index].UserID, payload)
|
||||
if err != nil {
|
||||
return summary, err
|
||||
return summary, fmt.Errorf("迁移素材 %s 的旧媒体失败:%w", assets[index].ID, err)
|
||||
}
|
||||
encoded, err := json.Marshal(stored)
|
||||
if err != nil {
|
||||
return summary, fmt.Errorf("序列化素材 %s 的迁移载荷失败:%w", assets[index].ID, err)
|
||||
}
|
||||
encoded, _ := json.Marshal(stored)
|
||||
assets[index].PayloadJSON = string(encoded)
|
||||
if err := s.repo.Save(&assets[index]); err != nil {
|
||||
return summary, err
|
||||
@@ -127,14 +144,17 @@ func (s *Service) MigrateLegacyStorage() (StorageMigrationSummary, error) {
|
||||
continue
|
||||
}
|
||||
var payload map[string]interface{}
|
||||
if json.Unmarshal([]byte(projects[index].PayloadJSON), &payload) != nil {
|
||||
continue
|
||||
if err := json.Unmarshal([]byte(projects[index].PayloadJSON), &payload); err != nil {
|
||||
return summary, fmt.Errorf("解析画布项目 %s 的旧载荷失败:%w", projects[index].ID, err)
|
||||
}
|
||||
stored, err := s.persistLegacyGeneratedMediaResult(projects[index].UserID, payload)
|
||||
if err != nil {
|
||||
return summary, err
|
||||
return summary, fmt.Errorf("迁移画布项目 %s 的旧媒体失败:%w", projects[index].ID, err)
|
||||
}
|
||||
encoded, err := json.Marshal(stored)
|
||||
if err != nil {
|
||||
return summary, fmt.Errorf("序列化画布项目 %s 的迁移载荷失败:%w", projects[index].ID, err)
|
||||
}
|
||||
encoded, _ := json.Marshal(stored)
|
||||
projects[index].PayloadJSON = string(encoded)
|
||||
if err := s.repo.Save(&projects[index]); err != nil {
|
||||
return summary, err
|
||||
|
||||
Reference in new issue
Block a user