From 8b807dab5b356054c1d4cac66720d2d216df7d2b Mon Sep 17 00:00:00 2001 From: jmal Date: Tue, 31 Dec 2024 21:14:19 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=8C=82=E8=BD=BD?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E6=97=A0=E6=B3=95=E9=80=9A=E8=BF=87=E4=BD=8D?= =?UTF-8?q?=E7=BD=AE=E8=B7=B3=E8=BD=AC=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/rest/ShareController.java | 7 +++ .../jmal/clouddisk/service/IShareService.java | 9 ++++ .../service/impl/ShareServiceImpl.java | 53 +++++++++++++++++-- 3 files changed, 66 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/jmal/clouddisk/controller/rest/ShareController.java b/src/main/java/com/jmal/clouddisk/controller/rest/ShareController.java index 9fd0d588..594fbb53 100644 --- a/src/main/java/com/jmal/clouddisk/controller/rest/ShareController.java +++ b/src/main/java/com/jmal/clouddisk/controller/rest/ShareController.java @@ -283,4 +283,11 @@ public ResponseResult getFileById(HttpServletRequest request, @RequestPa return ResultUtil.success(fileService.getById(fileId)); } + @Operation(summary = "挂用户获取分享文件信息") + @GetMapping("/mount/file_info") + @LogOperatingFun(logType = LogOperation.Type.BROWSE) + public ResponseResult> getMountFileInfo(@RequestParam String fileId, @RequestParam String fileUsername) { + return ResultUtil.success(shareService.getMountFileInfo(fileId, fileUsername)); + } + } diff --git a/src/main/java/com/jmal/clouddisk/service/IShareService.java b/src/main/java/com/jmal/clouddisk/service/IShareService.java index 372c196e..2cb437fd 100644 --- a/src/main/java/com/jmal/clouddisk/service/IShareService.java +++ b/src/main/java/com/jmal/clouddisk/service/IShareService.java @@ -7,6 +7,7 @@ import com.jmal.clouddisk.util.ResponseResult; import java.util.List; +import java.util.Map; /** * @Description IShareService @@ -117,4 +118,12 @@ public interface IShareService { * @return ResponseResult */ ResponseResult generateShareToken(String fileId); + + /** + * 获取挂载文件信息 + * @param fileId fileId + * @param fileUsername fileUsername + * @return ResponseResult + */ + Map getMountFileInfo(String fileId, String fileUsername); } diff --git a/src/main/java/com/jmal/clouddisk/service/impl/ShareServiceImpl.java b/src/main/java/com/jmal/clouddisk/service/impl/ShareServiceImpl.java index 08091f27..7a5fe643 100644 --- a/src/main/java/com/jmal/clouddisk/service/impl/ShareServiceImpl.java +++ b/src/main/java/com/jmal/clouddisk/service/impl/ShareServiceImpl.java @@ -31,8 +31,10 @@ import java.time.LocalDateTime; import java.util.ArrayList; import java.util.List; +import java.util.Map; import static com.jmal.clouddisk.controller.rest.ShareController.SHARE_EXPIRED; +import static com.jmal.clouddisk.webdav.MyWebdavServlet.PATH_DELIMITER; /** * @Description 分享 @@ -118,6 +120,7 @@ private void setShortId(ShareDO share, ShareDO shareDO) { /** * 生成5-8位短链接字符串 + * * @return 链接字符串 */ private String generateShortId(ShareDO share) { @@ -294,14 +297,45 @@ public ResponseResult generateShareToken(String fileId) { return ResultUtil.warning("分享不存在或不是私密分享"); } if (!fileDocument.getUserId().equals(userLoginHolder.getUserId()) && !existsMountFile(shareDO.getFileId(), userLoginHolder.getUserId())) { - return ResultUtil.error(ExceptionType.PERMISSION_DENIED); - } + return ResultUtil.error(ExceptionType.PERMISSION_DENIED); + } // 生成share-token, share-token有效期等于分享有效期 String shareToken = TokenUtil.createToken(shareDO.getId(), shareDO.getExpireDate()); return ResultUtil.success(shareToken); } + @Override + public Map getMountFileInfo(String fileId, String fileUsername) { + // 1.获取文件信息 + FileDocument fileDocument = fileService.getById(fileId); + // 2. 获取分享信息 + ShareDO shareDO = getShare(fileDocument.getShareId()); + // 3. 获取基础分享文件信息 + FileDocument shareBaseFile = fileService.getById(shareDO.getFileId()); + // 4.获取挂载信息 + FileDocument mountFile = getMountFile(shareDO.getFileId(), userLoginHolder.getUserId()); + if (mountFile == null) { + throw new CommonException(ExceptionType.WARNING.getCode(), "挂载文件不存在"); + } + // 5.获取文件上父级目录信息 + String parentName = Paths.get(fileDocument.getPath()).toFile().getName(); + String parentPath = Paths.get(fileDocument.getPath()).getParent().toString(); + if (parentPath.length() > 1) { + parentPath = parentPath + PATH_DELIMITER; + } + FileDocument folderInfo = fileService.getFileDocumentByPathAndName(parentPath, parentName, fileUsername); + if (folderInfo == null) { + return Map.of(); + } + String path = mountFile.getPath() + fileDocument.getPath().substring(shareBaseFile.getPath().length()); + String folder = folderInfo.getId(); + return Map.of( + "path", path, + "folder", folder + ); + } + public void validShare(String shareToken, ShareDO shareDO) { if (checkWhetherExpired(shareDO)) { throw new CommonException(ExceptionType.WARNING.getCode(), SHARE_EXPIRED); @@ -360,6 +394,7 @@ public void validShareCode(String shareToken, ShareDO shareDO) { /** * 分享验证失败· + * * @param shareDO 分享信息 */ private static void shareValidFailed(ShareDO shareDO) { @@ -371,10 +406,20 @@ private static void shareValidFailed(ShareDO shareDO) { } private boolean existsMountFile(String fileId, String userId) { + Query query = getMountQuery(fileId, userId); + return mongoTemplate.exists(query, FileDocument.class); + } + + private FileDocument getMountFile(String fileId, String userId) { + Query query = getMountQuery(fileId, userId); + return mongoTemplate.findOne(query, FileDocument.class); + } + + private static Query getMountQuery(String fileId, String userId) { Query query = new Query(); query.addCriteria(Criteria.where("mountFileId").is(fileId)); query.addCriteria(Criteria.where(IUserService.USER_ID).is(userId)); - return mongoTemplate.exists(query, FileDocument.class); + return query; } @Override @@ -395,6 +440,7 @@ public ShareDO getShareByFileId(String fileId) { /** * 检查是否过期 + * * @param shareDO 分享信息 * @return 是否过期 true:过期 false:未过期 */ @@ -496,6 +542,7 @@ public ResponseResult cancelShare(String[] shareId) { /** * 移除share属性 + * * @param shareDO ShareDO */ private void removeShareProperty(ShareDO shareDO) {