Sfoglia il codice sorgente

content-service/disk 添加 DiskShareController 网盘分享接口

reghao 6 mesi fa
parent
commit
cf62c6c632

+ 0 - 21
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/controller/DiskFileController.java

@@ -119,27 +119,6 @@ public class DiskFileController {
         return WebResult.result(result);
     }
 
-    @Operation(summary = "文件分享", description = "N")
-    @GetMapping("/share/{shareId}")
-    public String disSharePage(@PathVariable("shareId") String shareId) {
-        /*model.addAttribute("siteName", "disk");
-        model.addAttribute("page", Page.empty());
-        model.addAttribute("query", "fileType=1001");*/
-        return WebResult.success();
-    }
-
-    @Operation(summary = "访问分享的文件", description = "N")
-    @GetMapping("/s/{shareId}")
-    public String shareFile(@PathVariable("shareId") String shareId) {
-        return WebResult.successWithMsg("尚未实现");
-    }
-
-    @Operation(summary = "获取分享的文件列表", description = "N")
-    @GetMapping("/share/list")
-    public String getShareList() {
-        return WebResult.successWithMsg("尚未实现");
-    }
-
     @Operation(summary = "获取回收站中的文件列表", description = "N")
     @GetMapping("/trash/list")
     public String getTrashList() {

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

@@ -0,0 +1,66 @@
+package cn.reghao.tnb.content.app.disk.controller;
+
+import cn.reghao.jutil.jdk.db.PageList;
+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;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2025-09-05 17:03:15
+ */
+@Tag(name = "网盘分享接口")
+@RestController
+@RequestMapping("/api/content/disk/share")
+@AuthUser
+public class DiskShareController {
+    private final DiskShareService diskShareService;
+
+    public DiskShareController(DiskShareService diskShareService) {
+        this.diskShareService = diskShareService;
+    }
+
+    @Operation(summary = "创建分享", description = "N")
+    @PostMapping("/create")
+    public String createShare(@RequestBody @Validated ShareCreate shareCreate) {
+        diskShareService.createShare(shareCreate);
+        return WebResult.success();
+    }
+
+    @Operation(summary = "获取分享列表", description = "N")
+    @GetMapping("/list")
+    public String getShareList() {
+        PageList<DiskShareInfo> pageList = diskShareService.getShareList();
+        return WebResult.success(pageList);
+    }
+
+    @Operation(summary = "获取被分享用户列表", description = "N")
+    @GetMapping("/user_list")
+    public String getShareToList(@RequestParam("shareId") int 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("尚未实现");
+    }
+}

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

@@ -0,0 +1,23 @@
+package cn.reghao.tnb.content.app.disk.db.mapper;
+
+import cn.reghao.jutil.jdk.db.BaseMapper;
+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;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author reghao
+ * @date 2025-09-05 17:06:28
+ */
+@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);
+    List<Long> findDiskShareToList(@Param("shareId") long shareId);
+    List<Long> findSharedAlbums(@Param("userId") long userId);
+}

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

@@ -0,0 +1,20 @@
+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:19:17
+ */
+@Getter
+public class ShareCreate {
+    @NotNull
+    private Long albumId;
+    private Long expireAt;
+    @Size(min = 1, max = 100, message = "最多可分享给 100 位用户")
+    private List<String> shareToList;
+}

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

@@ -0,0 +1,19 @@
+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;
+}

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

@@ -0,0 +1,28 @@
+package cn.reghao.tnb.content.app.disk.model.po;
+
+import cn.reghao.jutil.jdk.db.BaseObject;
+import cn.reghao.tnb.content.app.disk.model.dto.ShareCreate;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2025-09-05 17:06:14
+ */
+@NoArgsConstructor
+@AllArgsConstructor
+@Setter
+@Getter
+public class DiskShare extends BaseObject<Integer> {
+    private Long shareId;
+    private Long albumId;
+    private Long createAt;
+    private Long createBy;
+
+    public DiskShare(long shareId, ShareCreate shareCreate) {
+        this.shareId = shareId;
+        this.albumId = shareCreate.getAlbumId();
+    }
+}

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

@@ -0,0 +1,20 @@
+package cn.reghao.tnb.content.app.disk.model.po;
+
+import cn.reghao.jutil.jdk.db.BaseObject;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * @author reghao
+ * @date 2025-09-05 17:17:03
+ */
+@NoArgsConstructor
+@AllArgsConstructor
+@Setter
+@Getter
+public class DiskShareTo extends BaseObject<Integer> {
+    private Long shareId;
+    private Long userId;
+}

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

@@ -0,0 +1,13 @@
+package cn.reghao.tnb.content.app.disk.model.vo;
+
+/**
+ * @author reghao
+ * @date 2025-09-05 17:04:41
+ */
+public class DiskShareInfo {
+    private long shareId;
+    private String albumName;
+    private String shareAt;
+    private String expireAt;
+    private int num;
+}

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

@@ -4,9 +4,7 @@ import cn.reghao.file.api.iface.OssService;
 import cn.reghao.jutil.jdk.db.Page;
 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;
 import cn.reghao.tnb.common.auth.UserContext;
 import cn.reghao.tnb.common.db.SelectOption;
 import cn.reghao.tnb.content.app.disk.db.mapper.DiskAlbumMapper;
@@ -16,8 +14,8 @@ 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.query.DiskQuery;
 import cn.reghao.tnb.content.app.disk.model.vo.*;
+import cn.reghao.tnb.content.app.util.IdService;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.dubbo.config.annotation.DubboReference;
 import org.springframework.stereotype.Service;
@@ -41,19 +39,20 @@ public class DiskAlbumService {
     private final DiskAlbumMapper diskAlbumMapper;
     private final DiskAlbumRepository diskAlbumRepository;
     private final DiskFileService diskFileService;
-    private final SnowFlake idGenerator;
+    private final IdService idService;
 
     public DiskAlbumService(DiskFileMapper diskFileMapper, DiskAlbumMapper diskAlbumMapper,
-                            DiskAlbumRepository diskAlbumRepository, DiskFileService diskFileService) {
+                            DiskAlbumRepository diskAlbumRepository, DiskFileService diskFileService,
+                            IdService idService) {
         this.diskFileMapper = diskFileMapper;
         this.diskAlbumMapper = diskAlbumMapper;
         this.diskAlbumRepository = diskAlbumRepository;
         this.diskFileService = diskFileService;
-        this.idGenerator = new SnowFlake(1, 1);
+        this.idService = idService;
     }
 
     public void createAlbum(AlbumCreate albumCreate) {
-        long albumId = idGenerator.nextId();
+        long albumId = idService.getLongId();
         DiskAlbum diskAlbum = new DiskAlbum(albumId, albumCreate);
         diskAlbumMapper.save(diskAlbum);
     }

+ 81 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/disk/service/DiskShareService.java

@@ -0,0 +1,81 @@
+package cn.reghao.tnb.content.app.disk.service;
+
+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.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 org.apache.dubbo.config.annotation.DubboReference;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/**
+ * @author reghao
+ * @date 2025-09-05 17:03:48
+ */
+@Service
+public class DiskShareService {
+    @DubboReference(check = false, retries = 0, timeout = 60_000)
+    private AccountQuery accountQuery;
+
+    private final IdService idService;
+    private final DiskShareMapper diskShareMapper;
+
+    public DiskShareService(IdService idService, DiskShareMapper diskShareMapper) {
+        this.idService = idService;
+        this.diskShareMapper = diskShareMapper;
+    }
+
+    public void createShare(ShareCreate shareCreate) {
+        long shareId = idService.getLongId();
+        DiskShare diskShare = new DiskShare();
+
+        List<DiskShareTo> list = shareCreate.getShareToList().stream()
+                .map(userIdStr -> {
+                    long userId = accountQuery.getUserIdLong(userIdStr);
+                    return new DiskShareTo(shareId, userId);
+                })
+                .collect(Collectors.toList());
+
+        diskShareMapper.save(diskShare);
+        if (!list.isEmpty()) {
+            diskShareMapper.saveDiskShareTo(list);
+        }
+    }
+
+    public PageList<DiskShareInfo> getShareList() {
+        return PageList.empty();
+    }
+
+    public List<AccountAvatar> getShareToList(long shareId) {
+        List<Long> userIds = diskShareMapper.findDiskShareToList(shareId);
+        return userIds.stream()
+                .map(userId -> accountQuery.getAccountAvatar(userId))
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+    }
+
+    public void revokeShare(ShareRevoke shareRevoke) {
+        long shareId = shareRevoke.getShareId();
+        List<Long> userIds = shareRevoke.getRevokeList().stream()
+                .map(userIdStr -> accountQuery.getUserIdLong(userIdStr))
+                .filter(Objects::nonNull)
+                .collect(Collectors.toList());
+
+        if (!userIds.isEmpty()) {
+            diskShareMapper.deleteDiskShareTo(shareId, userIds);
+        }
+    }
+
+    public void getSharedAlbums(long userId) {
+        List<Long> albumIds = diskShareMapper.findSharedAlbums(userId);
+    }
+}

+ 35 - 0
content/content-service/src/main/java/cn/reghao/tnb/content/app/util/IdService.java

@@ -0,0 +1,35 @@
+package cn.reghao.tnb.content.app.util;
+
+import cn.reghao.jutil.tool.id.SnowFlake;
+import org.springframework.stereotype.Component;
+
+import java.util.UUID;
+
+/**
+ * ID 生成服务
+ *
+ * @author reghao
+ * @date 2025-09-05 17:07:53
+ */
+@Component
+public class IdService {
+    private final SnowFlake idGenerator;
+    private int dcId = 1;
+    private int machineId = 1;
+
+    public IdService() {
+        this.idGenerator = new SnowFlake(dcId, machineId);
+    }
+
+    public long getLongId() {
+        return idGenerator.nextId();
+    }
+
+    public String getStringId() {
+        return null;
+    }
+
+    public String getFileId() {
+        return UUID.randomUUID().toString().replace("-", "");
+    }
+}

+ 51 - 0
content/content-service/src/main/resources/mapper/disk/DiskShareMapper.xml

@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<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`)
+        values
+        (#{albumId},#{albumName},#{fileType},#{coverFileId},#{num},#{createAt},#{createBy})
+    </insert>
+    <insert id="saveDiskShareTo" useGeneratedKeys="true" keyProperty="id">
+        insert into my_disk_share_to
+        (`share_id`,`user_id`)
+        values
+        <foreach collection="list" item="item" index="index" separator=",">
+            (#{item.shareId},#{item.userId})
+        </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 *
+        from my_disk_share
+        where create_by=#{createBy} and share_id=#{shareId}
+    </select>
+    <select id="findDiskShareToList" resultType="java.lang.Long">
+        select user_id
+        from my_disk_share_to
+        where share_id=#{shareId}
+    </select>
+    <select id="findSharedAlbums" resultType="java.lang.Long">
+        select my_disk_share.album_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}
+    </select>
+</mapper>