MCPcopy Create free account
hub / github.com/53AI/53AIHub / CreateDirectoryTree

Method CreateDirectoryTree

api/service/directory_manager.go:40–125  ·  view source on GitHub ↗

CreateDirectoryTree 在数据库中创建目录结构记录

(eid, libraryID int64, structure []FileStructureItem, basePath string, userID int64, originType string, originSource string, originRefID int64)

Source from the content-addressed store, hash-verified

38
39// CreateDirectoryTree 在数据库中创建目录结构记录
40func (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 }

Callers 1

CreateBatchMethod · 0.95

Calls 11

SaveMethod · 0.95
GetDirectoryPathMethod · 0.95
createDirectoryRecordMethod · 0.95
applyFileOriginMetaFunction · 0.85
NewFilePermissionServiceFunction · 0.85
ErrorfMethod · 0.80
UnlockMethod · 0.65
copyFunction · 0.50

Tested by

no test coverage detected