createDirectoryRecord 在数据库中创建目录记录
(eid, libraryID int64, item FileStructureItem, basePath string, userID int64, createdDirs map[string]bool, originType string, originSource string, originRefID int64)
| 187 | |
| 188 | // createDirectoryRecord 在数据库中创建目录记录 |
| 189 | func (dm *DirectoryManager) createDirectoryRecord(eid, libraryID int64, item FileStructureItem, basePath string, userID int64, createdDirs map[string]bool, originType string, originSource string, originRefID int64) error { |
| 190 | // 使用basePath和relativePath组合完整路径 |
| 191 | dirPath := dm.GetDirectoryPath(basePath, item.RelativePath) |
| 192 | |
| 193 | // 检查目录是否已存在 |
| 194 | existingFile, err := model.GetFileByPathAndLibraryNotDeleted(eid, libraryID, dirPath) |
| 195 | if err == nil && existingFile != nil && existingFile.Type == model.FILE_TYPE_DIR { |
| 196 | // 目录已存在且未被删除,跳过创建,不返回错误 |
| 197 | if err := dm.backfillRecordingOriginForExistingDir(existingFile, originType, originSource, originRefID); err != nil { |
| 198 | return fmt.Errorf("回填目录来源信息失败: %v", err) |
| 199 | } |
| 200 | return nil |
| 201 | } |
| 202 | |
| 203 | // 尝试恢复已删除的目录 |
| 204 | if deletedFile, getErr := model.GetFileByPathAndLibraryWithDeleted(eid, libraryID, dirPath); getErr == nil && deletedFile != nil && deletedFile.Type == model.FILE_TYPE_DIR && deletedFile.IsDeleted { |
| 205 | // 不再自动恢复已删除的目录,而是创建一个新的同名目录 |
| 206 | // 恢复已删除目录应该通过专门的API接口操作,而不是在上传文件时自动触发 |
| 207 | // if restoreErr := model.RestoreFile(eid, deletedFile.ID); restoreErr != nil { |
| 208 | // return fmt.Errorf("恢复已删除目录失败: %v", restoreErr) |
| 209 | // } |
| 210 | |
| 211 | // 创建新的同名目录,而不是恢复已删除的目录 |
| 212 | file := &model.File{ |
| 213 | Path: dirPath, |
| 214 | Type: model.FILE_TYPE_DIR, // 目录类型 |
| 215 | LibraryID: libraryID, |
| 216 | Eid: eid, |
| 217 | UploadFileID: 0, // 目录不关联实际文件 |
| 218 | Sort: 0, |
| 219 | UserID: userID, // 设置目录创建人 |
| 220 | } |
| 221 | applyFileOriginMeta(file, originType, originSource, originRefID) |
| 222 | |
| 223 | if err := file.Save(); err != nil { |
| 224 | return fmt.Errorf("保存目录记录失败: %v", err) |
| 225 | } |
| 226 | |
| 227 | // 同步到 Elasticsearch |
| 228 | elasticsearch.SyncFileToES(file, "create") |
| 229 | |
| 230 | // 为目录创建者自动分配管理权限 |
| 231 | fps := NewFilePermissionService(eid) |
| 232 | if err := fps.AddFileCreatorPermission(file.ID, userID); err != nil { |
| 233 | // 权限分配失败不影响目录创建,只记录错误 |
| 234 | // 这里可以考虑添加日志记录 |
| 235 | } |
| 236 | return nil |
| 237 | } |
| 238 | |
| 239 | // 创建目录记录 |
| 240 | file := &model.File{ |
| 241 | Path: dirPath, |
| 242 | Type: model.FILE_TYPE_DIR, // 目录类型 |
| 243 | LibraryID: libraryID, |
| 244 | Eid: eid, |
| 245 | UploadFileID: 0, // 目录不关联实际文件 |
| 246 | Sort: 0, |
no test coverage detected