refactor(*): 平台架构 - 拆分后端领域模块与画布前端组件并补充测试
This commit is contained in:
1 parent
e0a2697c60
commit
7f5d87ef1a
186 files changed
+33727
-29905
No files matched your search
@@ -43,10 +43,18 @@ func (s *Service) deleteUserAssetsWithResources(userID string, ids []string, pur
|
||||
if len(assetRecords) != len(assetIDs) {
|
||||
return NotFound("素材不存在或无权删除")
|
||||
}
|
||||
// 删除语义(产品约定,勿收紧):
|
||||
// - purge=true 是用户在素材库确认后的「彻底删除」(单个 DELETE、批量删除、清空回收站),
|
||||
// 不因画布、任务、项目或画布历史快照仍引用而拒绝;旧引用随之失效,画布保存时由
|
||||
// repairMissingResources 修复断链。
|
||||
// - purge=false 是内部普通删除:回收站(archived)素材同样直接删除,其余素材保留引用保护。
|
||||
// - 无论哪种,被其他素材复用的资源与物理对象都保留,物理删除一律经 Outbox 异步执行。
|
||||
deleteReferencedResources := purge
|
||||
if !purge {
|
||||
if len(assetRecords) != 1 {
|
||||
return BadAuthRequest("普通删除仅支持单个素材")
|
||||
}
|
||||
deleteReferencedResources = assetRecords[0].Status == model.AssetVersionStatusArchived
|
||||
}
|
||||
versions, representations, err := s.repo.AssetsResourceRecords(assetIDs)
|
||||
if err != nil {
|
||||
@@ -86,17 +94,26 @@ func (s *Service) deleteUserAssetsWithResources(userID string, ids []string, pur
|
||||
}
|
||||
|
||||
usages := make([]resourceUsage, 0)
|
||||
for _, assetID := range assetIDs {
|
||||
assetReferences, referenceErr := s.repo.AssetBusinessReferences(userID, assetID)
|
||||
if referenceErr != nil {
|
||||
return referenceErr
|
||||
}
|
||||
for _, reference := range assetReferences {
|
||||
usages = append(usages, resourceUsage{Kind: reference.Kind, ID: reference.ID, Title: reference.Title})
|
||||
if !deleteReferencedResources {
|
||||
for _, assetID := range assetIDs {
|
||||
assetReferences, referenceErr := s.repo.AssetBusinessReferences(userID, assetID)
|
||||
if referenceErr != nil {
|
||||
return referenceErr
|
||||
}
|
||||
for _, reference := range assetReferences {
|
||||
usages = append(usages, resourceUsage{Kind: reference.Kind, ID: reference.ID, Title: reference.Title})
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(ownedIDs) > 0 {
|
||||
snapshot, snapshotErr := s.repo.ResourceReferenceSnapshotExcludingAssets(userID, assetIDs, ownedIDs)
|
||||
var snapshot repository.ResourceReferenceSnapshot
|
||||
var snapshotErr error
|
||||
if deleteReferencedResources {
|
||||
// 彻底删除只需要知道哪些资源仍被「其他素材」复用(这些资源要保留),不扫描任务和画布。
|
||||
snapshot, snapshotErr = s.repo.OtherAssetResourceReferences(userID, assetIDs)
|
||||
} else {
|
||||
snapshot, snapshotErr = s.repo.ResourceReferenceSnapshotExcludingAssets(userID, assetIDs, ownedIDs)
|
||||
}
|
||||
if snapshotErr != nil {
|
||||
return snapshotErr
|
||||
}
|
||||
@@ -107,7 +124,9 @@ func (s *Service) deleteUserAssetsWithResources(userID string, ids []string, pur
|
||||
sharedAssetResourceIDs[reference.ResourceID] = struct{}{}
|
||||
continue
|
||||
}
|
||||
usages = append(usages, resourceUsage{Kind: reference.Kind, ID: reference.ID, Title: reference.Title})
|
||||
if !deleteReferencedResources {
|
||||
usages = append(usages, resourceUsage{Kind: reference.Kind, ID: reference.ID, Title: reference.Title})
|
||||
}
|
||||
}
|
||||
}
|
||||
for _, document := range snapshot.Documents {
|
||||
@@ -133,7 +152,9 @@ func (s *Service) deleteUserAssetsWithResources(userID string, ids []string, pur
|
||||
}
|
||||
continue
|
||||
}
|
||||
usages = append(usages, resourceUsage{Kind: document.Kind, ID: document.ID, Title: document.Title})
|
||||
if !deleteReferencedResources {
|
||||
usages = append(usages, resourceUsage{Kind: document.Kind, ID: document.ID, Title: document.Title})
|
||||
}
|
||||
}
|
||||
}
|
||||
if len(sharedAssetResourceIDs) > 0 {
|
||||
@@ -166,7 +187,7 @@ func (s *Service) deleteUserAssetsWithResources(userID string, ids []string, pur
|
||||
deletionJobs := resourceDeletionJobs(userID, physicalObjects)
|
||||
// 业务记录和 Outbox 必须在同一事务提交。事务失败时物理文件完全不动;
|
||||
// 提交成功后由幂等 worker 清理,进程退出或对象存储暂时失败都可继续重试。
|
||||
if err := s.repo.DeleteAssetsAndResources(userID, assetIDs, ownedIDs, deletionJobs, false); err != nil {
|
||||
if err := s.repo.DeleteAssetsAndResources(userID, assetIDs, ownedIDs, deletionJobs, deleteReferencedResources); err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return NotFound("素材不存在或无权删除")
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user