|
@ -58,7 +58,32 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
|
|
|
|
|
|
@Override |
|
|
@Override |
|
|
public Long createFolder(FolderCreateReq req) { |
|
|
public Long createFolder(FolderCreateReq req) { |
|
|
AccountFileDTO accountFileDTO = AccountFileDTO.builder().accountId(req.getAccountId()) |
|
|
// 创建文件夹时,父ID必须是该用户下的
|
|
|
|
|
|
if (req.getParentId() != null) { |
|
|
|
|
|
if (req.getParentId() == 0L) { |
|
|
|
|
|
// 用户根目录不能操作
|
|
|
|
|
|
throw new BizException(BizCodeEnum.FILE_DIR_NOT_EXIST); |
|
|
|
|
|
} |
|
|
|
|
|
// 校验该用户下是否存在该父级id
|
|
|
|
|
|
Long sum = accountFileMapper.selectCount(new QueryWrapper<AccountFileDO>() |
|
|
|
|
|
.eq("id", req.getParentId()).eq("account_id", req.getAccountId())); |
|
|
|
|
|
if (sum == 0) { |
|
|
|
|
|
throw new BizException(BizCodeEnum.FILE_DIR_NOT_EXIST); |
|
|
|
|
|
} |
|
|
|
|
|
if (sum > 1) { |
|
|
|
|
|
throw new BizException(BizCodeEnum.FILE_DIR_ERROR); |
|
|
|
|
|
} |
|
|
|
|
|
} else { |
|
|
|
|
|
AccountFileDO fileUser = accountFileMapper.selectOne(new QueryWrapper<AccountFileDO>() |
|
|
|
|
|
.eq("parent_id", 0L).eq("account_id", req.getAccountId())); |
|
|
|
|
|
if (fileUser == null) { |
|
|
|
|
|
// 用户根目录不存在
|
|
|
|
|
|
throw new BizException(BizCodeEnum.FILE_DIR_ERROR); |
|
|
|
|
|
} |
|
|
|
|
|
req.setParentId(fileUser.getId()); |
|
|
|
|
|
} |
|
|
|
|
|
AccountFileDTO accountFileDTO = AccountFileDTO.builder() |
|
|
|
|
|
.accountId(req.getAccountId()) |
|
|
.parentId(req.getParentId()) |
|
|
.parentId(req.getParentId()) |
|
|
.fileName(req.getFolderName()) |
|
|
.fileName(req.getFolderName()) |
|
|
.isDir(FolderFlagEnum.YES.getCode()).build(); |
|
|
.isDir(FolderFlagEnum.YES.getCode()).build(); |
|
@ -106,7 +131,7 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
.eq("is_dir", FolderFlagEnum.YES.getCode()) |
|
|
.eq("is_dir", FolderFlagEnum.YES.getCode()) |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
if(CollectionUtils.isEmpty(folderList)){ |
|
|
if (CollectionUtils.isEmpty(folderList)) { |
|
|
return List.of(); |
|
|
return List.of(); |
|
|
} |
|
|
} |
|
|
//构建一个map, key是文件ID,value是文件对象 相当于一个数据源
|
|
|
//构建一个map, key是文件ID,value是文件对象 相当于一个数据源
|
|
@ -123,7 +148,7 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
//构建文件树,遍历数据源,为每个文件夹找到子文件夹
|
|
|
//构建文件树,遍历数据源,为每个文件夹找到子文件夹
|
|
|
for (FolderTreeNodeDTO node : folderMap.values()) { |
|
|
for (FolderTreeNodeDTO node : folderMap.values()) { |
|
|
Long parentId = node.getParentId(); |
|
|
Long parentId = node.getParentId(); |
|
|
if(parentId!=null && folderMap.containsKey(parentId)){ |
|
|
if (parentId != null && folderMap.containsKey(parentId)) { |
|
|
//获取父文件
|
|
|
//获取父文件
|
|
|
FolderTreeNodeDTO parentNode = folderMap.get(parentId); |
|
|
FolderTreeNodeDTO parentNode = folderMap.get(parentId); |
|
|
//获取父文件夹的子节点位置
|
|
|
//获取父文件夹的子节点位置
|
|
@ -141,14 +166,16 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
return rootFolderList; |
|
|
return rootFolderList; |
|
|
|
|
|
|
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 查询文件树接口 (非递归方式) |
|
|
* 查询文件树接口 (非递归方式) |
|
|
* 1、查询用户全部文件夹 |
|
|
* 1、查询用户全部文件夹 |
|
|
* 2、拼装文件树 |
|
|
* 2、拼装文件树 |
|
|
|
|
|
* |
|
|
* @param accountId |
|
|
* @param accountId |
|
|
* @return |
|
|
* @return |
|
|
*/ |
|
|
*/ |
|
|
//@Override
|
|
|
//@Override
|
|
|
public List<FolderTreeNodeDTO> folderTreeV2(Long accountId) { |
|
|
public List<FolderTreeNodeDTO> folderTreeV2(Long accountId) { |
|
|
//查询用户全部文件夹
|
|
|
//查询用户全部文件夹
|
|
|
List<AccountFileDO> folderList = accountFileMapper.selectList(new QueryWrapper<AccountFileDO>() |
|
|
List<AccountFileDO> folderList = accountFileMapper.selectList(new QueryWrapper<AccountFileDO>() |
|
@ -156,7 +183,7 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
.eq("is_dir", FolderFlagEnum.YES.getCode()) |
|
|
.eq("is_dir", FolderFlagEnum.YES.getCode()) |
|
|
); |
|
|
); |
|
|
|
|
|
|
|
|
if(CollectionUtils.isEmpty(folderList)){ |
|
|
if (CollectionUtils.isEmpty(folderList)) { |
|
|
return List.of(); |
|
|
return List.of(); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -172,10 +199,10 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
.stream().collect(Collectors.groupingBy(FolderTreeNodeDTO::getParentId)); |
|
|
.stream().collect(Collectors.groupingBy(FolderTreeNodeDTO::getParentId)); |
|
|
|
|
|
|
|
|
//处理拼装文件树
|
|
|
//处理拼装文件树
|
|
|
for(FolderTreeNodeDTO node : folderTreeNodeDTOList){ |
|
|
for (FolderTreeNodeDTO node : folderTreeNodeDTOList) { |
|
|
List<FolderTreeNodeDTO> children = folderMap.get(node.getId()); |
|
|
List<FolderTreeNodeDTO> children = folderMap.get(node.getId()); |
|
|
//判断是否为空
|
|
|
//判断是否为空
|
|
|
if(!CollectionUtils.isEmpty(children)){ |
|
|
if (!CollectionUtils.isEmpty(children)) { |
|
|
node.getChildren().addAll(children); |
|
|
node.getChildren().addAll(children); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
@ -199,7 +226,7 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
//上传到存储引擎
|
|
|
//上传到存储引擎
|
|
|
String storeFileObjectKey = storeFile(req); |
|
|
String storeFileObjectKey = storeFile(req); |
|
|
//保存文件关系 + 保存账号和文件的关系
|
|
|
//保存文件关系 + 保存账号和文件的关系
|
|
|
saveFileAndAccountFile( req,storeFileObjectKey); |
|
|
saveFileAndAccountFile(req, storeFileObjectKey); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
@ -214,7 +241,7 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
public void moveBatch(FileBatchReq req) { |
|
|
public void moveBatch(FileBatchReq req) { |
|
|
|
|
|
|
|
|
// 检查被移动的文件ID是否合法
|
|
|
// 检查被移动的文件ID是否合法
|
|
|
List<AccountFileDO> accountFileDOList = checkFileIdLegal(req.getFileIds(),req.getAccountId()); |
|
|
List<AccountFileDO> accountFileDOList = checkFileIdLegal(req.getFileIds(), req.getAccountId()); |
|
|
|
|
|
|
|
|
//检查目标文件夹ID是否合法,包括子文件夹
|
|
|
//检查目标文件夹ID是否合法,包括子文件夹
|
|
|
checkTargetParentIdLegal(req); |
|
|
checkTargetParentIdLegal(req); |
|
@ -224,10 +251,10 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
|
|
|
|
|
|
//更新文件或者文件夹的parent_id为目标文件夹的ID
|
|
|
//更新文件或者文件夹的parent_id为目标文件夹的ID
|
|
|
UpdateWrapper<AccountFileDO> updateWrapper = new UpdateWrapper<>(); |
|
|
UpdateWrapper<AccountFileDO> updateWrapper = new UpdateWrapper<>(); |
|
|
updateWrapper.in("id",req.getFileIds()) |
|
|
updateWrapper.in("id", req.getFileIds()) |
|
|
.set("parent_id",req.getTargetParentId()); |
|
|
.set("parent_id", req.getTargetParentId()); |
|
|
int updateCount = accountFileMapper.update(null, updateWrapper); |
|
|
int updateCount = accountFileMapper.update(null, updateWrapper); |
|
|
if(updateCount!=req.getFileIds().size()){ |
|
|
if (updateCount != req.getFileIds().size()) { |
|
|
throw new BizException(BizCodeEnum.FILE_BATCH_UPDATE_ERROR); |
|
|
throw new BizException(BizCodeEnum.FILE_BATCH_UPDATE_ERROR); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -238,6 +265,7 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
* 检查目标文件夹ID是否合法,包括子文件夹 |
|
|
* 检查目标文件夹ID是否合法,包括子文件夹 |
|
|
* 1、目标的文件ID不能是文件 |
|
|
* 1、目标的文件ID不能是文件 |
|
|
* 2、要操作的文件列表不能包括目标文件ID |
|
|
* 2、要操作的文件列表不能包括目标文件ID |
|
|
|
|
|
* |
|
|
* @param req |
|
|
* @param req |
|
|
*/ |
|
|
*/ |
|
|
private void checkTargetParentIdLegal(FileBatchReq req) { |
|
|
private void checkTargetParentIdLegal(FileBatchReq req) { |
|
@ -251,8 +279,10 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
throw new BizException(BizCodeEnum.FILE_TARGET_PARENT_ILLEGAL); |
|
|
throw new BizException(BizCodeEnum.FILE_TARGET_PARENT_ILLEGAL); |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 检查被移动的文件ID是否合法 |
|
|
* 检查被移动的文件ID是否合法 |
|
|
|
|
|
* |
|
|
* @param fileIds |
|
|
* @param fileIds |
|
|
* @param accountId |
|
|
* @param accountId |
|
|
* @return |
|
|
* @return |
|
@ -262,7 +292,7 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
List<AccountFileDO> accountFileDOList = accountFileMapper |
|
|
List<AccountFileDO> accountFileDOList = accountFileMapper |
|
|
.selectList(new QueryWrapper<AccountFileDO>().in("id", fileIds).eq("account_id", accountId)); |
|
|
.selectList(new QueryWrapper<AccountFileDO>().in("id", fileIds).eq("account_id", accountId)); |
|
|
|
|
|
|
|
|
if(accountFileDOList.size()!=fileIds.size()){ |
|
|
if (accountFileDOList.size() != fileIds.size()) { |
|
|
log.error("文件ID数量不合法,ids={}", fileIds); |
|
|
log.error("文件ID数量不合法,ids={}", fileIds); |
|
|
throw new BizException(BizCodeEnum.FILE_BATCH_UPDATE_ERROR); |
|
|
throw new BizException(BizCodeEnum.FILE_BATCH_UPDATE_ERROR); |
|
|
} |
|
|
} |
|
@ -273,12 +303,13 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 保存文件和账号文件的关系到数据库 |
|
|
* 保存文件和账号文件的关系到数据库 |
|
|
|
|
|
* |
|
|
* @param req |
|
|
* @param req |
|
|
* @param storeFileObjectKey |
|
|
* @param storeFileObjectKey |
|
|
*/ |
|
|
*/ |
|
|
public void saveFileAndAccountFile(FileUploadReq req, String storeFileObjectKey) { |
|
|
public void saveFileAndAccountFile(FileUploadReq req, String storeFileObjectKey) { |
|
|
//保存文件
|
|
|
//保存文件
|
|
|
FileDO fileDO = saveFile(req,storeFileObjectKey); |
|
|
FileDO fileDO = saveFile(req, storeFileObjectKey); |
|
|
|
|
|
|
|
|
//保存文件账号关系
|
|
|
//保存文件账号关系
|
|
|
AccountFileDTO accountFileDTO = AccountFileDTO.builder() |
|
|
AccountFileDTO accountFileDTO = AccountFileDTO.builder() |
|
@ -299,7 +330,7 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
FileDO fileDO = new FileDO(); |
|
|
FileDO fileDO = new FileDO(); |
|
|
fileDO.setAccountId(req.getAccountId()); |
|
|
fileDO.setAccountId(req.getAccountId()); |
|
|
fileDO.setFileName(req.getFilename()); |
|
|
fileDO.setFileName(req.getFilename()); |
|
|
fileDO.setFileSize(req.getFile() !=null ? req.getFile().getSize():req.getFileSize()); |
|
|
fileDO.setFileSize(req.getFile() != null ? req.getFile().getSize() : req.getFileSize()); |
|
|
fileDO.setFileSuffix(CommonUtil.getFileSuffix(req.getFilename())); |
|
|
fileDO.setFileSuffix(CommonUtil.getFileSuffix(req.getFilename())); |
|
|
fileDO.setObjectKey(storeFileObjectKey); |
|
|
fileDO.setObjectKey(storeFileObjectKey); |
|
|
fileDO.setIdentifier(req.getIdentifier()); |
|
|
fileDO.setIdentifier(req.getIdentifier()); |
|
@ -309,15 +340,16 @@ public class AccountFileServiceImpl implements AccountFileService { |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 上传文件到存储引擎,返回存储的文件路径 |
|
|
* 上传文件到存储引擎,返回存储的文件路径 |
|
|
|
|
|
* |
|
|
* @param req |
|
|
* @param req |
|
|
* @return |
|
|
* @return |
|
|
*/ |
|
|
*/ |
|
|
private String storeFile(FileUploadReq req) { |
|
|
private String storeFile(FileUploadReq req) { |
|
|
|
|
|
|
|
|
String objectKey = CommonUtil.getFilePath(req.getFilename()); |
|
|
String objectKey = CommonUtil.getFilePath(req.getFilename()); |
|
|
fileStoreEngine.upload(minioConfig.getBucketName(), objectKey, req.getFile()); |
|
|
fileStoreEngine.upload(minioConfig.getBucketName(), objectKey, req.getFile()); |
|
|
return objectKey; |
|
|
return objectKey; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
* 处理用户和文件的关系,存储文件和文件夹都是可以的 |
|
|
* 处理用户和文件的关系,存储文件和文件夹都是可以的 |
|
|
* <p> |
|
|
* <p> |
|
|