Bladeren bron

update content-service/disk DiskAlbumController

reghao 6 maanden geleden
bovenliggende
commit
3e51dbbed3

+ 10 - 6
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskAlbumController.java

@@ -1,13 +1,13 @@
 package cn.reghao.tnb.content.app.disk.controller;
 
-import cn.reghao.jutil.jdk.db.PageList;
+import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.common.db.SelectOption;
 import cn.reghao.tnb.content.app.disk.model.dto.AlbumAdd;
 import cn.reghao.tnb.content.app.disk.model.dto.AlbumCreate;
 import cn.reghao.tnb.content.app.disk.model.po.DiskAlbum;
-import cn.reghao.tnb.content.app.disk.model.vo.DiskFileDetail;
+import cn.reghao.tnb.content.app.disk.model.vo.DiskAlbumDetail;
 import cn.reghao.tnb.content.app.disk.service.DiskAlbumService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
@@ -42,8 +42,8 @@ public class DiskAlbumController {
     @Operation(summary = "添加文件到相册", description = "N")
     @PostMapping(value = "/add", produces = MediaType.APPLICATION_JSON_VALUE)
     public String addToDiskAlbum(@RequestBody @Validated AlbumAdd albumAdd) {
-        diskAlbumService.addAlbumFile(albumAdd);
-        return WebResult.success();
+        Result result = diskAlbumService.addAlbumFile(albumAdd);
+        return WebResult.result(result);
     }
 
     @Operation(summary = "获取相册 KV 列表", description = "N")
@@ -63,7 +63,11 @@ public class DiskAlbumController {
     @Operation(summary = "获取相册详情", description = "N")
     @GetMapping(value = "/detail/{albumId}", produces = MediaType.APPLICATION_JSON_VALUE)
     public String getDiskAlbumDetail(@PathVariable("albumId") long albumId) {
-        PageList<DiskFileDetail> pageList = diskAlbumService.getDiskAlbumDetail(albumId);
-        return WebResult.success(pageList);
+        DiskAlbumDetail diskAlbumDetail = diskAlbumService.getDiskAlbumDetail(albumId);
+        if (diskAlbumDetail != null) {
+            return WebResult.success(diskAlbumDetail);
+        }
+
+        return WebResult.fail();
     }
 }

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

@@ -20,5 +20,5 @@ public interface DiskAlbumMapper extends BaseMapper<DiskAlbum> {
 
     DiskAlbum findDiskAlbum(long albumId);
     List<DiskAlbum> findByCreateBy(long createBy);
-    List<DiskAlbumFile> findByAlbumId(long albumId);
+    List<DiskAlbumFile> findDiskAlbumFiles(long albumId);
 }

+ 32 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/db/repository/DiskAlbumRepository.java

@@ -0,0 +1,32 @@
+package cn.reghao.tnb.content.app.disk.db.repository;
+
+import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
+import cn.reghao.tnb.content.app.disk.db.mapper.DiskFileMapper;
+import cn.reghao.tnb.content.app.disk.model.po.DiskAlbumFile;
+import org.springframework.stereotype.Repository;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2025-09-02 22:42:28
+ */
+@Repository
+public class DiskAlbumRepository {
+    private final DiskAlbumMapper diskAlbumMapper;
+
+    public DiskAlbumRepository(DiskAlbumMapper diskAlbumMapper) {
+        this.diskAlbumMapper = diskAlbumMapper;
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void saveDiskAlbum(long albumId, String coverUrl, int num, List<DiskAlbumFile> list) {
+        if (!coverUrl.isBlank()) {
+            diskAlbumMapper.updateCoverUrl(albumId, coverUrl);
+        }
+
+        diskAlbumMapper.updateNum(albumId, num);
+        diskAlbumMapper.saveAlbumFiles(list);
+    }
+}

+ 8 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/po/DiskAlbumFile.java

@@ -18,4 +18,12 @@ public class DiskAlbumFile extends BaseObject<Integer> {
     private Long albumId;
     private String fileId;
     private Integer fileType;
+    private Integer pos;
+
+    public DiskAlbumFile(long albumId, DiskFile diskFile, int pos) {
+        this.albumId = albumId;
+        this.fileId = diskFile.getFileId();
+        this.fileType = diskFile.getFileType();
+        this.pos = pos;
+    }
 }

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

@@ -0,0 +1,21 @@
+package cn.reghao.tnb.content.app.disk.model.vo;
+
+import cn.reghao.tnb.content.app.disk.model.po.DiskAlbum;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2025-09-02 23:18:19
+ */
+public class DiskAlbumDetail {
+    private long albumId;
+    private String albumName;
+    private List<DiskFileDetail> diskFileList;
+
+    public DiskAlbumDetail(DiskAlbum diskAlbum, List<DiskFileDetail> diskFileList) {
+        this.albumId = diskAlbum.getAlbumId();
+        this.albumName = diskAlbum.getAlbumName();
+        this.diskFileList = diskFileList;
+    }
+}

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

@@ -1,20 +0,0 @@
-package cn.reghao.tnb.content.app.disk.model.vo;
-
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-
-/**
- * @author reghao
- * @date 2024-10-30 17:37:17
- */
-@AllArgsConstructor
-@Getter
-public class DiskFileInfo {
-    private String fileId;
-    private String filename;
-    private String url;
-
-    public void setUrl(String url) {
-        this.url = url;
-    }
-}

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

@@ -21,15 +21,6 @@ public class FileInfo {
     private int fileType;
     private String fileTypeStr;
 
-    public FileInfo(ObjectInfo objectInfo, String size) {
-        this.fileId = objectInfo.getObjectId();
-        this.filename = objectInfo.getFilename();
-        this.updateTime = objectInfo.getUpdateTime();
-        this.size = size;
-        this.fileType = objectInfo.getFileType();
-        this.fileTypeStr = ObjectType.getDescByCode(objectInfo.getFileType());
-    }
-
     public FileInfo(DiskFile diskFile, String size) {
         this.fileId = diskFile.getFileId();
         this.filename = diskFile.getFilename();

+ 68 - 36
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskAlbumService.java

@@ -2,6 +2,7 @@ package cn.reghao.tnb.content.app.disk.service;
 
 import cn.reghao.file.api.iface.OssService;
 import cn.reghao.jutil.jdk.db.PageList;
+import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.jutil.tool.id.SnowFlake;
 import cn.reghao.oss.sdk.model.constant.ObjectType;
 import cn.reghao.oss.sdk.model.dto.ObjectInfo;
@@ -9,18 +10,18 @@ import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.common.db.SelectOption;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskFileMapper;
+import cn.reghao.tnb.content.app.disk.db.repository.DiskAlbumRepository;
 import cn.reghao.tnb.content.app.disk.model.dto.AlbumAdd;
 import cn.reghao.tnb.content.app.disk.model.dto.AlbumCreate;
 import cn.reghao.tnb.content.app.disk.model.po.DiskAlbum;
 import cn.reghao.tnb.content.app.disk.model.po.DiskAlbumFile;
+import cn.reghao.tnb.content.app.disk.model.po.DiskFile;
 import cn.reghao.tnb.content.app.disk.model.vo.*;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
 
-import java.util.List;
-import java.util.Objects;
-import java.util.Set;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -33,15 +34,18 @@ public class DiskAlbumService {
     @DubboReference(check = false, timeout = 60_000)
     private OssService ossService;
     private final int channelCode = 111;
+    private final int albumMaxFiles = 1000;
     private final DiskFileMapper diskFileMapper;
     private final DiskAlbumMapper diskAlbumMapper;
+    private final DiskAlbumRepository diskAlbumRepository;
     private final DiskFileService diskFileService;
     private final SnowFlake idGenerator;
 
     public DiskAlbumService(DiskFileMapper diskFileMapper, DiskAlbumMapper diskAlbumMapper,
-                            DiskFileService diskFileService) {
+                            DiskAlbumRepository diskAlbumRepository, DiskFileService diskFileService) {
         this.diskFileMapper = diskFileMapper;
         this.diskAlbumMapper = diskAlbumMapper;
+        this.diskAlbumRepository = diskAlbumRepository;
         this.diskFileService = diskFileService;
         this.idGenerator = new SnowFlake(1, 1);
     }
@@ -52,43 +56,61 @@ public class DiskAlbumService {
         diskAlbumMapper.save(diskAlbum);
     }
 
-    public void addAlbumFile(AlbumAdd albumAdd) {
+    public Result addAlbumFile(AlbumAdd albumAdd) {
         long albumId = albumAdd.getAlbumId();
-        Set<String> existFileIds = diskAlbumMapper.findByAlbumId(albumId).stream()
+        Set<String> existFileIds = diskAlbumMapper.findDiskAlbumFiles(albumId).stream()
                 .map(DiskAlbumFile::getFileId)
                 .collect(Collectors.toSet());
+        if (existFileIds.size() >= albumMaxFiles) {
+            return Result.fail(String.format("单个相册最多能容纳 %s 张照片", albumMaxFiles));
+        }
+
+        Set<String> existSha256sums = new HashSet<>();
+        if (!existFileIds.isEmpty()) {
+            existSha256sums = diskFileMapper.findByFileIds(new ArrayList<>(existFileIds)).stream()
+                    .map(DiskFile::getSha256sum)
+                    .collect(Collectors.toSet());
+        }
+
         List<String> fileIds = albumAdd.getFileIds().stream()
                 .filter(fileId -> !existFileIds.contains(fileId))
                 .collect(Collectors.toList());
         if (fileIds.isEmpty()) {
-            return;
+            return Result.fail("添加的照片在当前相册中已存在");
         }
 
         long loginUser = UserContext.getUserId();
-        List<DiskAlbumFile> list = diskFileMapper.findByFileIds(fileIds).stream()
+        List<DiskFile> diskFileList = diskFileMapper.findByFileIds(fileIds).stream()
+                .filter(diskFile -> diskFile.getOwner() == loginUser)
                 .filter(diskFile -> diskFile.getFileType() == ObjectType.Image.getCode()
                         || diskFile.getFileType() == ObjectType.Video.getCode())
-                .filter(diskFile -> diskFile.getOwner() == loginUser)
-                .map(diskFile -> {
-                    String fileId = diskFile.getFileId();
-                    int fileType = diskFile.getFileType();
-                    return new DiskAlbumFile(albumId, fileId, fileType);
-                })
                 .collect(Collectors.toList());
 
-        if (!list.isEmpty()) {
-            DiskAlbumFile diskAlbumFile = list.get(0);
-            String objectId = diskAlbumFile.getFileId();
-            try {
-                ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, objectId);
-                String url = objectInfo.getUrl();
-                diskAlbumMapper.updateCoverUrl(albumId, url);
-            } catch (Exception e) {
-                e.printStackTrace();
+        int startPos = existFileIds.size()+1;
+        List<DiskAlbumFile> list = new ArrayList<>();
+        for (DiskFile diskFile : diskFileList) {
+            if (existSha256sums.add(diskFile.getSha256sum())) {
+                list.add(new DiskAlbumFile(albumId, diskFile, startPos));
+                startPos++;
             }
+        }
 
-            diskAlbumMapper.saveAlbumFiles(list);
+        if (list.isEmpty()) {
+            return Result.fail("添加的照片在当前相册中已存在");
         }
+
+        DiskAlbumFile diskAlbumFile = list.get(0);
+        String objectId = diskAlbumFile.getFileId();
+        String coverUrl = "";
+        try {
+            ObjectInfo objectInfo = ossService.getObjectInfo(channelCode, objectId);
+            coverUrl = objectInfo.getUrl();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        diskAlbumRepository.saveDiskAlbum(albumId, coverUrl, existSha256sums.size(), list);
+        return Result.successWithMsg(String.format("当前相册中新添加了 %s 张照片", list.size()));
     }
 
     public List<SelectOption> getAlbumKeyValues() {
@@ -116,26 +138,36 @@ public class DiskAlbumService {
         return diskAlbumList;
     }
 
-    public PageList<DiskFileDetail> getDiskAlbumDetail(long albumId) {
+    public DiskAlbumDetail getDiskAlbumDetail(long albumId) {
         long loginUser = UserContext.getUserId();
         DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
+        if (diskAlbum == null) {
+            return null;
+        }
+
         long createBy = diskAlbum.getCreateBy();
         if (createBy != loginUser) {
-            return PageList.empty();
+            return null;
         }
 
-        List<DiskAlbumFile> diskAlbumFileList = diskAlbumMapper.findByAlbumId(albumId);
+        List<DiskAlbumFile> diskAlbumFileList = diskAlbumMapper.findDiskAlbumFiles(albumId);
         List<String> fileIds = diskAlbumFileList.stream().map(DiskAlbumFile::getFileId).collect(Collectors.toList());
-        if (!fileIds.isEmpty()) {
-            List<DiskFileDetail> diskFileDetailList = diskFileMapper.findByFileIds(fileIds).stream().map(diskFile -> {
-                String objectId = diskFile.getFileId();
-                return diskFileService.getDiskFileDetail(channelCode, objectId);
-            }).filter(Objects::nonNull).collect(Collectors.toList());
-
-            int total = diskFileDetailList.size();
-            return PageList.pageList(1, 10, total, diskFileDetailList);
+        if (fileIds.isEmpty()) {
+            return null;
+        }
+        Map<String, Integer> map = new HashMap<>();
+        for (DiskAlbumFile diskAlbumFile : diskAlbumFileList) {
+            map.put(diskAlbumFile.getFileId(), diskAlbumFile.getPos());
         }
 
-        return PageList.empty();
+        List<DiskFileDetail> diskFileDetailList = diskFileMapper.findByFileIds(fileIds).stream().
+                map(diskFile -> {
+                    String objectId = diskFile.getFileId();
+                    return diskFileService.getDiskFileDetail(channelCode, objectId);
+                })
+                .filter(Objects::nonNull)
+                .sorted(Comparator.comparingInt(o -> map.get(o.getFileId())))
+                .collect(Collectors.toList());
+        return new DiskAlbumDetail(diskAlbum, diskFileDetailList);
     }
 }

+ 4 - 3
content/content-service/src/main/resources/mapper/disk/DiskAlbumMapper.xml

@@ -10,10 +10,10 @@
     </insert>
     <insert id="saveAlbumFiles" useGeneratedKeys="true" keyProperty="id">
         insert into my_disk_album_file
-        (`album_id`,`file_id`,`file_type`)
+        (`album_id`,`file_id`,`file_type`,`pos`)
         values
         <foreach collection="list" item="item" index="index" separator=",">
-            (#{item.albumId},#{item.fileId},#{item.fileType})
+            (#{item.albumId},#{item.fileId},#{item.fileType},#{item.pos})
         </foreach>
     </insert>
 
@@ -38,9 +38,10 @@
         from my_disk_album
         where create_by=#{createBy}
     </select>
-    <select id="findByAlbumId" resultType="cn.reghao.tnb.content.app.disk.model.po.DiskAlbumFile">
+    <select id="findDiskAlbumFiles" resultType="cn.reghao.tnb.content.app.disk.model.po.DiskAlbumFile">
         select *
         from my_disk_album_file
         where album_id=#{albumId}
+        order by pos asc
     </select>
 </mapper>