Explorar el Código

更新 content-service/disk 的分享功能

reghao hace 6 meses
padre
commit
5616f88671

+ 3 - 17
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskShareController.java

@@ -5,7 +5,6 @@ import cn.reghao.jutil.web.WebResult;
 import cn.reghao.tnb.account.api.dto.AccountAvatar;
 import cn.reghao.tnb.common.auth.AuthUser;
 import cn.reghao.tnb.content.app.disk.model.dto.ShareCreate;
-import cn.reghao.tnb.content.app.disk.model.dto.ShareRevoke;
 import cn.reghao.tnb.content.app.disk.model.vo.DiskShareInfo;
 import cn.reghao.tnb.content.app.disk.service.DiskShareService;
 import io.swagger.v3.oas.annotations.Operation;
@@ -39,28 +38,15 @@ public class DiskShareController {
 
     @Operation(summary = "获取分享列表", description = "N")
     @GetMapping("/list")
-    public String getShareList() {
-        PageList<DiskShareInfo> pageList = diskShareService.getShareList();
+    public String getShareList(@RequestParam("pn") int pageNumber) {
+        PageList<DiskShareInfo> pageList = diskShareService.getShareList(pageNumber);
         return WebResult.success(pageList);
     }
 
     @Operation(summary = "获取被分享用户列表", description = "N")
     @GetMapping("/user_list")
-    public String getShareToList(@RequestParam("shareId") int shareId) {
+    public String getShareToList(@RequestParam("shareId") long shareId) {
         List<AccountAvatar> list = diskShareService.getShareToList(shareId);
         return WebResult.success(list);
     }
-
-    @Operation(summary = "取消对用户的分享", description = "N")
-    @PostMapping("/revoke")
-    public String revokeShare(@RequestBody @Validated ShareRevoke shareRevoke) {
-        diskShareService.revokeShare(shareRevoke);
-        return WebResult.success();
-    }
-
-    @Operation(summary = "访问分享的文件", description = "N")
-    @GetMapping("/s/{shareId}")
-    public String shareFile(@PathVariable("shareId") String shareId) {
-        return WebResult.successWithMsg("尚未实现");
-    }
 }

+ 6 - 3
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/db/mapper/DiskShareMapper.java

@@ -1,6 +1,7 @@
 package cn.reghao.tnb.content.app.disk.db.mapper;
 
 import cn.reghao.jutil.jdk.db.BaseMapper;
+import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.tnb.content.app.disk.model.po.DiskShare;
 import cn.reghao.tnb.content.app.disk.model.po.DiskShareTo;
 import org.apache.ibatis.annotations.Mapper;
@@ -15,9 +16,11 @@ import java.util.List;
 @Mapper
 public interface DiskShareMapper extends BaseMapper<DiskShare> {
     void saveDiskShareTo(List<DiskShareTo> list);
-    void deleteDiskShareTo(@Param("shareId") long shareId, @Param("list") List<Long> list);
 
-    DiskShare findByShareId(@Param("shareId") long shareId, @Param("createBy") long createBy);
+    int countDiskShare(long createBy);
+    List<DiskShare> findDiskShareByPage(@Param("page") Page page, @Param("createBy") long createBy);
+
+    int countDiskShareTo(long shareId);
     List<Long> findDiskShareToList(@Param("shareId") long shareId);
-    List<Long> findSharedAlbums(@Param("userId") long userId);
+    List<DiskShare> findDiskShareList(@Param("shareTo") long shareTo);
 }

+ 2 - 2
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/dto/ShareCreate.java

@@ -14,7 +14,7 @@ import java.util.List;
 public class ShareCreate {
     @NotNull
     private Long albumId;
-    private Long expireAt;
-    @Size(min = 1, max = 100, message = "最多可分享给 100 位用户")
+    @NotNull
+    @Size(min = 1, max = 10, message = "最多可分享给 10 位用户")
     private List<String> shareToList;
 }

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

@@ -1,19 +0,0 @@
-package cn.reghao.tnb.content.app.disk.model.dto;
-
-import lombok.Getter;
-
-import javax.validation.constraints.NotNull;
-import javax.validation.constraints.Size;
-import java.util.List;
-
-/**
- * @author reghao
- * @date 2025-09-05 17:43:45
- */
-@Getter
-public class ShareRevoke {
-    @NotNull
-    private Long shareId;
-    @Size(min = 1, max = 100, message = "最多可取消 100 位用户")
-    private List<String> revokeList;
-}

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

@@ -1,6 +1,7 @@
 package cn.reghao.tnb.content.app.disk.model.po;
 
 import cn.reghao.jutil.jdk.db.BaseObject;
+import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.content.app.disk.model.dto.ShareCreate;
 import lombok.AllArgsConstructor;
 import lombok.Getter;
@@ -24,5 +25,7 @@ public class DiskShare extends BaseObject<Integer> {
     public DiskShare(long shareId, ShareCreate shareCreate) {
         this.shareId = shareId;
         this.albumId = shareCreate.getAlbumId();
+        this.createAt = System.currentTimeMillis();
+        this.createBy = UserContext.getUserId();
     }
 }

+ 14 - 1
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/model/vo/DiskShareInfo.java

@@ -1,13 +1,26 @@
 package cn.reghao.tnb.content.app.disk.model.vo;
 
+import cn.reghao.jutil.jdk.converter.DateTimeConverter;
+import cn.reghao.tnb.content.app.disk.model.po.DiskShare;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
 /**
  * @author reghao
  * @date 2025-09-05 17:04:41
  */
+@NoArgsConstructor
+@Getter
 public class DiskShareInfo {
     private long shareId;
     private String albumName;
     private String shareAt;
-    private String expireAt;
     private int num;
+
+    public DiskShareInfo(DiskShare diskShare, String albumName, int num) {
+        this.shareId = diskShare.getShareId();
+        this.albumName = albumName;
+        this.shareAt = DateTimeConverter.format(diskShare.getCreateAt());
+        this.num = num;
+    }
 }

+ 55 - 7
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskAlbumService.java

@@ -5,6 +5,8 @@ import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.jutil.jdk.db.PageList;
 import cn.reghao.jutil.jdk.result.Result;
 import cn.reghao.oss.sdk.model.constant.ObjectType;
+import cn.reghao.tnb.account.api.dto.AccountAvatar;
+import cn.reghao.tnb.account.api.iface.AccountQuery;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.common.db.SelectOption;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
@@ -30,8 +32,11 @@ import java.util.stream.Collectors;
 @Slf4j
 @Service
 public class DiskAlbumService {
+    @DubboReference(check = false, retries = 0, timeout = 60_000)
+    private AccountQuery accountQuery;
     @DubboReference(check = false, timeout = 60_000)
     private OssService ossService;
+
     private final int channelCode = 111;
     private final int albumMaxFiles = 1000;
     private final int pageSize = 12;
@@ -39,15 +44,17 @@ public class DiskAlbumService {
     private final DiskAlbumMapper diskAlbumMapper;
     private final DiskAlbumRepository diskAlbumRepository;
     private final DiskFileService diskFileService;
+    private DiskShareService diskShareService;
     private final IdService idService;
 
     public DiskAlbumService(DiskFileMapper diskFileMapper, DiskAlbumMapper diskAlbumMapper,
                             DiskAlbumRepository diskAlbumRepository, DiskFileService diskFileService,
-                            IdService idService) {
+                            DiskShareService diskShareService, IdService idService) {
         this.diskFileMapper = diskFileMapper;
         this.diskAlbumMapper = diskAlbumMapper;
         this.diskAlbumRepository = diskAlbumRepository;
         this.diskFileService = diskFileService;
+        this.diskShareService = diskShareService;
         this.idService = idService;
     }
 
@@ -70,6 +77,11 @@ public class DiskAlbumService {
             return Result.fail("album not exist");
         }
 
+        long loginUser = UserContext.getUserId();
+        if (diskAlbum.getCreateBy() != loginUser) {
+            return Result.fail("not album owner");
+        }
+
         List<String> existSha256sumList = diskAlbumMapper.findDiskAlbumFiles(albumId).stream()
                 .map(DiskAlbumFile::getSha256sum)
                 .collect(Collectors.toList());
@@ -78,7 +90,6 @@ public class DiskAlbumService {
         }
 
         Set<String> set = new HashSet<>(existSha256sumList);
-        long loginUser = UserContext.getUserId();
         int fileType = diskAlbum.getFileType();
 
         List<DiskFile> diskFileList0 = diskFileService.findByFileIds(fileIds);
@@ -137,6 +148,16 @@ public class DiskAlbumService {
      * @date 2025-09-04 17:47:19
      */
     public Result updateAlbumFilePosition(long albumId, List<String> fileIds) {
+        DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
+        if (diskAlbum == null) {
+            return Result.fail("album not exist");
+        }
+
+        long loginUser = UserContext.getUserId();
+        if (diskAlbum.getCreateBy() != loginUser) {
+            return Result.fail("not album owner");
+        }
+
         // fileId -> pos
         Map<String, Integer> positionMap = new HashMap<>();
         int startPos = 1;
@@ -171,11 +192,20 @@ public class DiskAlbumService {
      * @date 2025-09-04 17:48:05
      */
     public Result deleteAlbumFile(long albumId, List<String> fileIds) {
+        DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
+        if (diskAlbum == null) {
+            return Result.fail("album not exist");
+        }
+
+        long loginUser = UserContext.getUserId();
+        if (diskAlbum.getCreateBy() != loginUser) {
+            return Result.fail("not album owner");
+        }
+
         Set<String> deletedSha256sumSet = diskFileService.findByFileIds(fileIds).stream()
                 .map(DiskFile::getSha256sum)
                 .collect(Collectors.toSet());
 
-        DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
         int num = diskAlbum.getNum()-deletedSha256sumSet.size();
         if (!deletedSha256sumSet.isEmpty()) {
             diskAlbumRepository.deleteDiskAlbumFiles(albumId, num, deletedSha256sumSet);
@@ -210,7 +240,15 @@ public class DiskAlbumService {
 
     public List<DiskAlbumInfo> getAlbumList() {
         long loginUser = UserContext.getUserId();
-        return diskAlbumMapper.findByCreateBy(loginUser).stream().map(diskAlbum -> {
+        List<Long> albumIds = diskShareService.getSharedAlbumIds(loginUser);
+        List<DiskAlbum> sharedAlbums = albumIds.stream().map(diskAlbumMapper::findDiskAlbum)
+                .filter(Objects::nonNull)
+                .peek(this::setSharedAlbumName)
+                .collect(Collectors.toList());
+        List<DiskAlbum> userAlbums = diskAlbumMapper.findByCreateBy(loginUser);
+        userAlbums.addAll(sharedAlbums);
+
+        return userAlbums.stream().map(diskAlbum -> {
             String coverUrl = "";
             try {
                 String coverFileId = diskAlbum.getCoverFileId();
@@ -222,16 +260,26 @@ public class DiskAlbumService {
         }).collect(Collectors.toList());
     }
 
+    private void setSharedAlbumName(DiskAlbum diskAlbum) {
+        long createBy = diskAlbum.getCreateBy();
+        AccountAvatar accountAvatar = accountQuery.getAccountAvatar(createBy);
+        String username = accountAvatar.getUsername();
+        String albumName = String.format("%s(%s的分享)", diskAlbum.getAlbumName(), username);
+        diskAlbum.setAlbumName(albumName);
+    }
+
     public DiskAlbumDetail getDiskAlbumDetail(long albumId, int pageNumber) {
         long loginUser = UserContext.getUserId();
+        Set<Long> sharedAlbumSet = new HashSet<>(diskShareService.getSharedAlbumIds(loginUser));
         DiskAlbum diskAlbum = diskAlbumMapper.findDiskAlbum(albumId);
         if (diskAlbum == null) {
             return null;
+        } else if (diskAlbum.getCreateBy() != loginUser && !sharedAlbumSet.contains(albumId)) {
+            return null;
         }
 
-        long createBy = diskAlbum.getCreateBy();
-        if (createBy != loginUser) {
-            return null;
+        if (sharedAlbumSet.contains(albumId)) {
+            setSharedAlbumName(diskAlbum);
         }
 
         int total = diskAlbumMapper.countDiskAlbumFile(albumId);

+ 41 - 20
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskShareService.java

@@ -1,15 +1,18 @@
 package cn.reghao.tnb.content.app.disk.service;
 
+import cn.reghao.jutil.jdk.db.Page;
 import cn.reghao.jutil.jdk.db.PageList;
 import cn.reghao.tnb.account.api.dto.AccountAvatar;
 import cn.reghao.tnb.account.api.iface.AccountQuery;
+import cn.reghao.tnb.common.auth.UserContext;
+import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskShareMapper;
 import cn.reghao.tnb.content.app.disk.model.dto.ShareCreate;
-import cn.reghao.tnb.content.app.disk.model.dto.ShareRevoke;
 import cn.reghao.tnb.content.app.disk.model.po.DiskShare;
 import cn.reghao.tnb.content.app.disk.model.po.DiskShareTo;
 import cn.reghao.tnb.content.app.disk.model.vo.DiskShareInfo;
 import cn.reghao.tnb.content.app.util.IdService;
+import cn.reghao.tnb.user.api.iface.UserService;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
 
@@ -25,22 +28,26 @@ import java.util.stream.Collectors;
 public class DiskShareService {
     @DubboReference(check = false, retries = 0, timeout = 60_000)
     private AccountQuery accountQuery;
+    @DubboReference(check = false, retries = 0, timeout = 60_000)
+    private UserService userService;
 
+    private int pageSize = 10;
     private final IdService idService;
     private final DiskShareMapper diskShareMapper;
+    private final DiskAlbumMapper diskAlbumMapper;
 
-    public DiskShareService(IdService idService, DiskShareMapper diskShareMapper) {
+    public DiskShareService(IdService idService, DiskShareMapper diskShareMapper, DiskAlbumMapper diskAlbumMapper) {
         this.idService = idService;
         this.diskShareMapper = diskShareMapper;
+        this.diskAlbumMapper = diskAlbumMapper;
     }
 
     public void createShare(ShareCreate shareCreate) {
         long shareId = idService.getLongId();
-        DiskShare diskShare = new DiskShare();
-
+        DiskShare diskShare = new DiskShare(shareId, shareCreate);
         List<DiskShareTo> list = shareCreate.getShareToList().stream()
-                .map(userIdStr -> {
-                    long userId = accountQuery.getUserIdLong(userIdStr);
+                .map(username -> {
+                    long userId = accountQuery.getByUsername(username).getUserId();
                     return new DiskShareTo(shareId, userId);
                 })
                 .collect(Collectors.toList());
@@ -51,8 +58,19 @@ public class DiskShareService {
         }
     }
 
-    public PageList<DiskShareInfo> getShareList() {
-        return PageList.empty();
+    public PageList<DiskShareInfo> getShareList(int pageNumber) {
+        long loginUser = UserContext.getUserId();
+        Page page = new Page(pageNumber, pageSize);
+        List<DiskShareInfo> list = diskShareMapper.findDiskShareByPage(page, loginUser).stream()
+                .map(diskShare -> {
+                    String albumName = diskAlbumMapper.findDiskAlbum(diskShare.getAlbumId()).getAlbumName();
+                    int num = diskShareMapper.countDiskShareTo(diskShare.getShareId());
+                    return new DiskShareInfo(diskShare, albumName, num);
+                })
+                .collect(Collectors.toList());
+
+        int total = diskShareMapper.countDiskShare(loginUser);
+        return PageList.pageList(pageNumber, pageSize, total, list);
     }
 
     public List<AccountAvatar> getShareToList(long shareId) {
@@ -63,19 +81,22 @@ public class DiskShareService {
                 .collect(Collectors.toList());
     }
 
-    public void revokeShare(ShareRevoke shareRevoke) {
-        long shareId = shareRevoke.getShareId();
-        List<Long> userIds = shareRevoke.getRevokeList().stream()
-                .map(userIdStr -> accountQuery.getUserIdLong(userIdStr))
+    /**
+     * 获取分享给用户的合集 ID, 需要动态检测分享者与被分享者之间的关系变化
+     *
+     * @param
+     * @return
+     * @date 2025-09-06 00:09:512
+     */
+    public List<Long> getSharedAlbumIds(long shareTo) {
+        List<DiskShare> diskShareList = diskShareMapper.findDiskShareList(shareTo);
+        return diskShareList.stream()
+                .map(diskShare -> {
+                    long shareId = diskShare.getShareId();
+                    long createBy = diskShare.getCreateBy();
+                    return userService.contactContain(createBy, shareTo) ? diskShare.getAlbumId() : null;
+                })
                 .filter(Objects::nonNull)
                 .collect(Collectors.toList());
-
-        if (!userIds.isEmpty()) {
-            diskShareMapper.deleteDiskShareTo(shareId, userIds);
-        }
-    }
-
-    public void getSharedAlbums(long userId) {
-        List<Long> albumIds = diskShareMapper.findSharedAlbums(userId);
     }
 }

+ 22 - 25
content/content-service/src/main/resources/mapper/disk/DiskShareMapper.xml

@@ -4,9 +4,9 @@
 <mapper namespace="cn.reghao.tnb.content.app.disk.db.mapper.DiskShareMapper">
     <insert id="save" useGeneratedKeys="true" keyProperty="id">
         insert into my_disk_share
-        (`album_id`,`album_name`,`file_type`,`cover_file_id`,`num`,`create_at`,`create_by`)
+        (`share_id`,`album_id`,`create_at`,`create_by`)
         values
-        (#{albumId},#{albumName},#{fileType},#{coverFileId},#{num},#{createAt},#{createBy})
+        (#{shareId},#{albumId},#{createAt},#{createBy})
     </insert>
     <insert id="saveDiskShareTo" useGeneratedKeys="true" keyProperty="id">
         insert into my_disk_share_to
@@ -17,35 +17,32 @@
         </foreach>
     </insert>
 
-    <update id="updateDiskAlbum">
-        update my_disk_share
-        set update_time=now(),cover_file_id=#{coverFileId},num=#{num}
-        where album_id=#{albumId}
-    </update>
-
-    <delete id="deleteDiskShareTo">
-        delete from my_disk_share_file
-        where share_id=#{shareId} and user_id in
-        <foreach collection="list" item="id" index="index" open="(" close=")" separator=",">
-            #{id}
-        </foreach>
-    </delete>
-
-    <select id="findByShareId" resultType="cn.reghao.tnb.content.app.disk.model.po.DiskShare">
+    <select id="countDiskShare" resultType="java.lang.Integer">
+        select count(*)
+        from my_disk_share
+        where deleted=0 and create_by=#{createBy}
+    </select>
+    <select id="findDiskShareByPage" resultType="cn.reghao.tnb.content.app.disk.model.po.DiskShare">
         select *
         from my_disk_share
-        where create_by=#{createBy} and share_id=#{shareId}
+        where deleted=0 and create_by=#{createBy}
     </select>
-    <select id="findDiskShareToList" resultType="java.lang.Long">
-        select user_id
+    <select id="findDiskShareList" resultType="cn.reghao.tnb.content.app.disk.model.po.DiskShare">
+        select my_disk_share.*
+        from my_disk_share_to
+        inner join my_disk_share
+        on my_disk_share.deleted=0 and my_disk_share_to.share_id=my_disk_share.share_id
+        where user_id=#{shareTo}
+    </select>
+
+    <select id="countDiskShareTo" resultType="java.lang.Integer">
+        select count(*)
         from my_disk_share_to
         where share_id=#{shareId}
     </select>
-    <select id="findSharedAlbums" resultType="java.lang.Long">
-        select my_disk_share.album_id
+    <select id="findDiskShareToList" resultType="java.lang.Long">
+        select user_id
         from my_disk_share_to
-        inner join my_disk_share
-        on my_disk_share_to.share_id=my_disk_share.share_id
-        where user_id=#{userId}
+        where share_id=#{shareId}
     </select>
 </mapper>