CreateDirectoryTree 在数据库中创建目录结构记录
(eid, libraryID int64, structure []FileStructureItem, basePath string, userID int64, originType string, originSource string, originRefID int64)
| 38 | |
| 39 | // CreateDirectoryTree 在数据库中创建目录结构记录 |
| 40 | func (dm *DirectoryManager) CreateDirectoryTree(eid, libraryID int64, structure []FileStructureItem, basePath string, userID int64, originType string, originSource string, originRefID int64) error { |
| 41 | dm.mu.Lock() |
| 42 | defer dm.mu.Unlock() |
| 43 | |
| 44 | // 按深度排序,确保父目录先创建 |
| 45 | sortedStructure := make([]FileStructureItem, len(structure)) |
| 46 | copy(sortedStructure, structure) |
| 47 | sort.Slice(sortedStructure, func(i, j int) bool { |
| 48 | return sortedStructure[i].Depth < sortedStructure[j].Depth |
| 49 | }) |
| 50 | |
| 51 | // 创建一个映射来存储已创建的目录路径 |
| 52 | createdDirs := make(map[string]bool) |
| 53 | |
| 54 | // 如果有basePath,先创建basePath目录(若已存在则跳过) |
| 55 | if basePath != "" { |
| 56 | if !strings.HasPrefix(basePath, "/") { |
| 57 | basePath = "/" + basePath |
| 58 | } |
| 59 | |
| 60 | // 递归创建basePath的所有父目录 |
| 61 | dm.createParentDirectories(eid, libraryID, basePath, userID, createdDirs, originType, originSource, originRefID) |
| 62 | |
| 63 | // 检查基础目录是否已存在且未被删除,已存在则标记为已创建 |
| 64 | if existing, err := model.GetFileByPathAndLibraryNotDeleted(eid, libraryID, basePath); err == nil && existing != nil && existing.Type == model.FILE_TYPE_DIR { |
| 65 | if err := dm.backfillRecordingOriginForExistingDir(existing, originType, originSource, originRefID); err != nil { |
| 66 | return fmt.Errorf("回填基础目录来源信息失败: %v", err) |
| 67 | } |
| 68 | createdDirs[basePath] = true |
| 69 | } else { |
| 70 | // 检查是否已有同名但已删除的目录,如果有则直接创建新目录而不恢复已删除的目录 |
| 71 | // 注意:这里我们不恢复已删除的目录,而是创建一个新目录 |
| 72 | baseDir := &model.File{ |
| 73 | Path: basePath, |
| 74 | Type: model.FILE_TYPE_DIR, |
| 75 | LibraryID: libraryID, |
| 76 | Eid: eid, |
| 77 | UploadFileID: 0, |
| 78 | Sort: 0, |
| 79 | UserID: userID, |
| 80 | } |
| 81 | applyFileOriginMeta(baseDir, originType, originSource, originRefID) |
| 82 | |
| 83 | if err := baseDir.Save(); err != nil { |
| 84 | // 如果目录已存在,忽略错误 |
| 85 | if existingFile, getErr := model.GetFileByPathAndLibraryNotDeleted(eid, libraryID, basePath); getErr != nil || existingFile == nil || existingFile.Type != model.FILE_TYPE_DIR { |
| 86 | return fmt.Errorf("保存基础目录记录失败: %v", err) |
| 87 | } |
| 88 | // 目录已存在且未被删除,标记为已创建 |
| 89 | createdDirs[basePath] = true |
| 90 | } else { |
| 91 | // 同步到 Elasticsearch |
| 92 | elasticsearch.SyncFileToES(baseDir, "create") |
| 93 | // 为目录创建者自动分配管理权限 |
| 94 | fps := NewFilePermissionService(eid) |
| 95 | if err := fps.AddFileCreatorPermission(baseDir.ID, userID); err != nil { |
| 96 | // 权限分配失败不影响目录创建,只记录错误 |
| 97 | } |
no test coverage detected