浏览代码

完成 DiskSyncController#putFile 磁盘上的文件上传功能

reghao 6 月之前
父节点
当前提交
635a44a83b

+ 5 - 4
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskSyncController.java

@@ -2,7 +2,7 @@ package cn.reghao.tnb.content.app.disk.controller;
 
 import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.common.auth.AuthUser;
-import cn.reghao.tnb.content.app.disk.model.dto.UploadedFile;
+import cn.reghao.tnb.content.app.disk.model.dto.SyncedFile;
 import cn.reghao.tnb.content.app.disk.service.DiskSyncService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -19,7 +19,7 @@ import org.springframework.web.bind.annotation.*;
 @RequestMapping("/api/content/disk/sync")
 @AuthUser
 public class DiskSyncController {
-    private DiskSyncService diskSyncService;
+    private final DiskSyncService diskSyncService;
 
     public DiskSyncController(DiskSyncService diskSyncService) {
         this.diskSyncService = diskSyncService;
@@ -37,9 +37,10 @@ public class DiskSyncController {
         return WebResult.success();
     }
 
-    @Operation(summary = "添加文件(或目录)", description = "N")
+    @Operation(summary = "同步磁盘上的文件(或目录)", description = "N")
     @PostMapping(value = "/put", produces = MediaType.APPLICATION_JSON_VALUE)
-    public String putFile(@RequestBody @Validated UploadedFile uploadedFile) {
+    public String putFile(@RequestBody @Validated SyncedFile syncedFile) {
+        diskSyncService.putFile(syncedFile);
         return WebResult.success();
     }
 }

+ 1 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/db/mapper/DiskFileMapper.java

@@ -22,4 +22,5 @@ public interface DiskFileMapper extends BaseMapper<DiskFile> {
     int countByDiskQuery(DiskQuery diskQuery);
     List<DiskFile> findDiskQueryByPage(@Param("page") Page page, @Param("diskQuery") DiskQuery diskQuery);
     List<DiskFile> findByFileIds(List<String> list);
+    DiskFile findRoot();
 }

+ 4 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/CreateFolder.java

@@ -1,6 +1,8 @@
 package cn.reghao.tnb.content.app.disk.model.dto;
 
+import lombok.AllArgsConstructor;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 import lombok.Setter;
 import org.hibernate.validator.constraints.Length;
 
@@ -10,6 +12,8 @@ import javax.validation.constraints.NotBlank;
  * @author reghao
  * @date 2025-09-01 10:19:24
  */
+@AllArgsConstructor
+@NoArgsConstructor
 @Setter
 @Getter
 public class CreateFolder {

+ 20 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/SyncedFile.java

@@ -0,0 +1,20 @@
+package cn.reghao.tnb.content.app.disk.model.dto;
+
+import lombok.Getter;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author reghao
+ * @date 2025-09-03 14:27:39
+ */
+@Getter
+public class SyncedFile {
+    @NotNull
+    private Integer channelCode;
+    @NotBlank
+    private String uploadId;
+    @NotBlank
+    private String path;
+}

+ 4 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/UploadedFile.java

@@ -1,6 +1,8 @@
 package cn.reghao.tnb.content.app.disk.model.dto;
 
+import lombok.AllArgsConstructor;
 import lombok.Getter;
+import lombok.NoArgsConstructor;
 
 import javax.validation.constraints.NotBlank;
 import javax.validation.constraints.NotNull;
@@ -9,6 +11,8 @@ import javax.validation.constraints.NotNull;
  * @author reghao
  * @date 2025-09-01 10:31:44
  */
+@AllArgsConstructor
+@NoArgsConstructor
 @Getter
 public class UploadedFile {
     @NotNull

+ 2 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/vo/FolderTree.java

@@ -2,6 +2,7 @@ package cn.reghao.tnb.content.app.disk.model.vo;
 
 import cn.reghao.tnb.content.app.disk.model.po.DiskFile;
 import lombok.Getter;
+import lombok.Setter;
 
 import java.util.ArrayList;
 import java.util.List;
@@ -10,6 +11,7 @@ import java.util.List;
  * @author reghao
  * @date 2023-11-14 10:55:43
  */
+@Setter
 @Getter
 public class FolderTree {
     private String pid;

+ 6 - 4
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskFileService.java

@@ -35,12 +35,10 @@ public class DiskFileService {
     @DubboReference(check = false, timeout = 60_000)
     private OssService ossService;
     private final DiskFileMapper diskFileMapper;
-    private final DiskSyncService diskSyncService;
     private final ByteConverter byteConverter;
 
-    public DiskFileService(DiskFileMapper diskFileMapper, DiskSyncService diskSyncService) {
+    public DiskFileService(DiskFileMapper diskFileMapper) {
         this.diskFileMapper = diskFileMapper;
-        this.diskSyncService = diskSyncService;
         this.byteConverter = new ByteConverter();
     }
 
@@ -57,7 +55,7 @@ public class DiskFileService {
             ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, uploadId);
             String filename = objectInfo.getFilename();
             String path = String.format("%s/%s", parentPath, filename);
-            DiskFile diskFile2 = diskSyncService.checkFile(path);
+            DiskFile diskFile2 = findByPath(path);
             if (diskFile2 != null) {
                 return Result.fail("file exist");
             }
@@ -469,6 +467,10 @@ public class DiskFileService {
     }
 
     public DiskFile findByFileId(String fileId) {
+        if (fileId.equals("0")) {
+            return diskFileMapper.findRoot();
+        }
+
         long owner = UserContext.getUserId();
         DiskQuery diskQuery = new DiskQuery.Builder()
                 .fileId(fileId)

+ 27 - 22
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskFolderService.java

@@ -9,6 +9,7 @@ import cn.reghao.tnb.content.app.disk.model.dto.CreateFolder;
 import cn.reghao.tnb.content.app.disk.model.po.DiskFile;
 import cn.reghao.tnb.content.app.disk.model.query.DiskQuery;
 import cn.reghao.tnb.content.app.disk.model.vo.FolderTree;
+import cn.reghao.tnb.content.app.disk.util.FileUtil;
 import org.springframework.stereotype.Service;
 
 import java.io.File;
@@ -28,7 +29,7 @@ public class DiskFolderService {
     }
 
     public synchronized Result createFolder(CreateFolder createFolder) {
-        String parentPath = getCanonicalPath(createFolder.getParentPath());
+        String parentPath = FileUtil.getCanonicalPath(createFolder.getParentPath());
         DiskFile parentDiskFile = findByPath(parentPath);
         if (parentDiskFile == null) {
             return Result.fail("parent dir not exit");
@@ -37,13 +38,13 @@ public class DiskFolderService {
 
         String folderName = createFolder.getFolderName();
         String folderPath = String.format("%s/%s", parentPath, folderName);
-        String folderPath0 = getCanonicalPath(folderPath);
+        String folderPath0 = FileUtil.getCanonicalPath(folderPath);
         DiskFile diskFile = findByPath(folderPath0);
         if (diskFile != null) {
             return Result.fail("current dir exit");
         }
 
-        DiskFile folder = new DiskFile(getFileId(), pid, folderPath0, folderName);
+        DiskFile folder = new DiskFile(FileUtil.getFileId(), pid, folderPath0, folderName);
         diskFileMapper.save(folder);
         return Result.success();
     }
@@ -59,16 +60,7 @@ public class DiskFolderService {
         return diskFileList.isEmpty() ? null : diskFileList.get(0);
     }
 
-    private String getCanonicalPath(String path) {
-        //return new File(path).getCanonicalPath();
-        return new File(path).getAbsolutePath();
-    }
-
-    private String getFileId() {
-        return UUID.randomUUID().toString().replace("-", "");
-    }
-
-    private String createFolders(String folderPath, long owner) {
+    public synchronized String createFolders(String folderPath, long owner) {
         File file = new File(folderPath);
         String dirPath = file.getAbsolutePath();
 
@@ -105,7 +97,7 @@ public class DiskFolderService {
             if (!diskFileList.isEmpty()) {
                 pid = diskFileList.get(0).getFileId();
             } else {
-                String fileId = getFileId();
+                String fileId = FileUtil.getFileId();
                 String path = parent;
                 String dirname = parent.substring(parent.lastIndexOf("/")+1);
                 diskFileMapper.save(new DiskFile(fileId, pid, path, dirname));
@@ -119,6 +111,12 @@ public class DiskFolderService {
     }
 
     public List<FolderTree> getFolderTree() {
+        DiskFile root = diskFileMapper.findRoot();
+        if (root == null) {
+            return Collections.emptyList();
+        }
+        FolderTree treeRoot = new FolderTree(root);
+
         long loginUser = UserContext.getUserId();
         DiskQuery diskQuery = new DiskQuery.Builder()
                 .fileType(ObjectType.Dir.getCode())
@@ -126,13 +124,20 @@ public class DiskFolderService {
                 .build();
 
         Page page = new Page(1, 1000);
-        List<DiskFile> netDiskList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
-        Map<String, FolderTree> map = netDiskList.stream()
+        List<DiskFile> diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
+        Map<String, List<FolderTree>> map = diskFileList.stream()
                 .map(FolderTree::new)
-                .collect(Collectors.toMap(FolderTree::getFileId, diskFile -> diskFile));
+                .collect(Collectors.groupingBy(FolderTree::getPid));
+
+
+        String rootId = treeRoot.getFileId();
+        List<FolderTree> list = map.get(rootId);
+        if (list != null) {
+            treeRoot.setChildren(list);
+        }
 
         Map<String, FolderTree> tree = new TreeMap<>();
-        netDiskList.forEach(diskFile -> {
+        /*diskFileList.forEach(diskFile -> {
             String pid = diskFile.getPid();
             String fileId = diskFile.getFileId();
             FolderTree folderTree = map.get(fileId);
@@ -143,10 +148,10 @@ public class DiskFolderService {
                 FolderTree parent = map.get(pid);
                 parent.getChildren().add(folderTree);
             }
-        });
+        });*/
+        /*String key = tree.keySet().iterator().next();
+        FolderTree folderTree = tree.get(key);*/
 
-        String key = tree.keySet().iterator().next();
-        FolderTree root = tree.get(key);
-        return List.of(root);
+        return List.of(treeRoot);
     }
 }

+ 26 - 52
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskSyncService.java

@@ -1,72 +1,46 @@
 package cn.reghao.tnb.content.app.disk.service;
 
-import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.tnb.common.auth.UserContext;
-import cn.reghao.tnb.content.app.disk.db.mapper.DiskFileMapper;
+import cn.reghao.tnb.content.app.disk.model.dto.SyncedFile;
+import cn.reghao.tnb.content.app.disk.model.dto.UploadedFile;
 import cn.reghao.tnb.content.app.disk.model.po.DiskFile;
-import cn.reghao.tnb.content.app.disk.model.query.DiskQuery;
-import cn.reghao.tnb.content.app.disk.model.vo.FileTree;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-import java.util.stream.Collectors;
+import java.io.File;
 
 /**
  * @author reghao
  * @date 2025-09-01 11:46:01
  */
+@Slf4j
 @Service
 public class DiskSyncService {
-    private final DiskFileMapper diskFileMapper;
+    private final DiskFolderService diskFolderService;
+    private final DiskFileService diskFileService;
 
-    public DiskSyncService(DiskFileMapper diskFileMapper) {
-        this.diskFileMapper = diskFileMapper;
+    public DiskSyncService(DiskFolderService diskFolderService, DiskFileService diskFileService) {
+        this.diskFolderService = diskFolderService;
+        this.diskFileService = diskFileService;
     }
 
-    public DiskFile checkFile(String path) {
-        long loginUser = UserContext.getUserId();
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .path(path)
-                .owner(loginUser)
-                .build();
-        Page page = new Page(1, 1);
-        List<DiskFile> diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
-        return diskFileList.isEmpty() ? null : diskFileList.get(0);
-    }
-
-    public List<FileTree> getFileTree() {
-        String rootId = "0";
-        long loginUser = UserContext.getUserId();
-        DiskQuery diskQuery = new DiskQuery.Builder()
-                .pid(rootId)
-                .owner(loginUser)
-                .build();
+    public synchronized void putFile(SyncedFile syncedFile) {
+        File file = new File(syncedFile.getPath());
+        String path = file.getAbsolutePath();
+        File parentFile = file.getParentFile();
 
-        int total = diskFileMapper.countByDiskQuery(diskQuery);
-        Page page = new Page(1, total);
-        List<DiskFile> diskFileList = diskFileMapper.findDiskQueryByPage(page, diskQuery);
-        Map<String, FileTree> map = diskFileList.stream()
-                .map(FileTree::new)
-                .collect(Collectors.toMap(FileTree::getFileId, diskFile -> diskFile));
+        DiskFile diskFile = diskFileService.findByPath(path);
+        if (diskFile != null) {
+            log.error("DiskFile {} exist", path);
+            return;
+        }
 
-        Map<String, FileTree> tree = new TreeMap<>();
-        diskFileList.forEach(diskFile -> {
-            String pid = diskFile.getPid();
-            String fileId = diskFile.getFileId();
-            FileTree fileTree = map.get(fileId);
-
-            if (pid.equals(rootId)) {
-                tree.put(fileId, fileTree);
-            } else {
-                FileTree parent = map.get(pid);
-                parent.getChildren().add(fileTree);
-            }
-        });
-
-        String key = tree.keySet().iterator().next();
-        FileTree root = tree.get(key);
-        return List.of(root);
+        String parentPath = parentFile.getAbsolutePath();
+        long loginUser = UserContext.getUserId();
+        String pid = diskFolderService.createFolders(parentPath, loginUser);
+        int channelCode = syncedFile.getChannelCode();
+        String uploadId = syncedFile.getUploadId();
+        UploadedFile uploadedFile = new UploadedFile(channelCode, uploadId, pid);
+        diskFileService.addDiskFile(uploadedFile);
     }
 }

+ 19 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/util/FileUtil.java

@@ -0,0 +1,19 @@
+package cn.reghao.tnb.content.app.disk.util;
+
+import java.io.File;
+import java.util.UUID;
+
+/**
+ * @author reghao
+ * @date 2025-09-03 14:30:26
+ */
+public class FileUtil {
+    public static String getFileId() {
+        return UUID.randomUUID().toString().replace("-", "");
+    }
+
+    public static String getCanonicalPath(String path) {
+        //return new File(path).getCanonicalPath();
+        return new File(path).getAbsolutePath();
+    }
+}

+ 5 - 0
content/content-service/src/main/resources/mapper/disk/DiskFileMapper.xml

@@ -94,4 +94,9 @@
             #{id}
         </foreach>
     </select>
+    <select id="findRoot" resultType="cn.reghao.tnb.content.app.disk.model.po.DiskFile">
+        select *
+        from my_disk_file
+        where file_id='0'
+    </select>
 </mapper>