feat:(REQ-3540) 文件克隆-加上bizScene,不传目标桶与key,则按照appCode与bizScene的为准
This commit is contained in:
parent
54d8ffb985
commit
6a5e42c653
@ -35,6 +35,7 @@ import cn.axzo.oss.http.model.file.FileRenameRequest;
|
||||
import cn.axzo.oss.http.model.file.FileRenameResponse;
|
||||
import cn.axzo.oss.http.model.file.UpdateFileInfoRequest;
|
||||
import cn.axzo.oss.http.model.file.UpdateFileInfoResponse;
|
||||
import cn.axzo.oss.manager.api.dto.request.AppInfoDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.FileCopyObjectDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.FindFileUrlDto;
|
||||
@ -244,7 +245,7 @@ public class ServerFileController implements ServerFileServiceApi {
|
||||
public CommonResponse<ServerFileBatchCopyObjectResponse> batchCopyObject(@Valid @RequestBody ServerFileBatchCopyObjectRequest request) {
|
||||
AssertUtil.isFalse(Objects.isNull(request) || CollectionUtils.isEmpty(request.getCopyObjects()), "入参为空");
|
||||
List<FileCopyObjectDto> fileCopyObjectDtos = BeanUtil.copyToList(request.getCopyObjects(), FileCopyObjectDto.class);
|
||||
List<FileCopyObjectResponse> fileCopyObjectResponses = fileService.batchCopyObject(fileCopyObjectDtos, request.getAppCode());
|
||||
List<FileCopyObjectResponse> fileCopyObjectResponses = fileService.batchCopyObject(fileCopyObjectDtos, AppInfoDto.builder().appCode(request.getAppCode()).bizScene(request.getBizScene()).build());
|
||||
return CommonResponse.success(ServerFileBatchCopyObjectResponse.builder().responses(BeanUtil.copyToList(fileCopyObjectResponses, ServerFileBatchCopyObjectResponse.ServerFileCopyObjectResponse.class)).build());
|
||||
}
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package cn.axzo.oss.dal.repository;
|
||||
|
||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
@ -30,4 +31,6 @@ public interface FileBusinessSceneDao extends IService<FileBusinessScene> {
|
||||
* 根据bucketNo与场景,获取批量FileBusinessScene对象
|
||||
*/
|
||||
List<FileBusinessScene> queryByBucketNoAndScene(Set<String> bucketNoList, String bizScen);
|
||||
|
||||
List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo);
|
||||
}
|
||||
|
||||
@ -4,6 +4,7 @@ import cn.axzo.oss.common.enums.IsDeleteEnum;
|
||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||
import cn.axzo.oss.dal.mapper.FileBusinessSceneMapper;
|
||||
import cn.axzo.oss.dal.repository.FileBusinessSceneDao;
|
||||
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.google.common.collect.Lists;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
@ -50,4 +51,12 @@ public class FileBusinessSceneDaoImpl extends
|
||||
.eq(StringUtils.isNotBlank(bizScene), FileBusinessScene::getBusinessScene, StringUtils.isNotBlank(bizScene) ? bizScene : StringUtils.EMPTY)
|
||||
.eq(FileBusinessScene::getIsDelete, IsDeleteEnum.NO.getCode()).list();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo) {
|
||||
return lambdaQuery().eq(FileBusinessScene::getAppCode, vo.getAppCode())
|
||||
.eq(FileBusinessScene::getBusinessScene,vo.getBusinessScene())
|
||||
.eq(FileBusinessScene::getIsDelete, IsDeleteEnum.NO.getCode()).list();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -0,0 +1,20 @@
|
||||
package cn.axzo.oss.dal.vo;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author xudawei@axzo.cn
|
||||
* @date 2025/3/20
|
||||
* @description FileBusinessSceneVo
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class FileBusinessSceneVo {
|
||||
private String appCode;
|
||||
private String businessScene;
|
||||
}
|
||||
@ -24,6 +24,9 @@ public class ServerFileBatchCopyObjectRequest {
|
||||
@NotBlank(message = "appCode must not be null")
|
||||
private String appCode;
|
||||
|
||||
@NotBlank(message = "bizScene must not be null")
|
||||
private String bizScene;
|
||||
|
||||
@NotEmpty(message = "集合对象不能为空")
|
||||
private Set<ServerFileCopyObjectRequest> copyObjects;
|
||||
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package cn.axzo.oss.manager.api;
|
||||
|
||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
@ -25,4 +26,6 @@ public interface FileBusinessSceneManager {
|
||||
* 指定appcode文件业务场景
|
||||
*/
|
||||
List<FileBusinessScene> queryByBucketNoAndScene(Set<String> bucketNoList, String bizScene);
|
||||
|
||||
List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo);
|
||||
}
|
||||
|
||||
@ -0,0 +1,28 @@
|
||||
package cn.axzo.oss.manager.api.dto.request;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author xudawei@axzo.cn
|
||||
* @date 2025/3/20
|
||||
* @description app
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
public class AppInfoDto {
|
||||
|
||||
/**
|
||||
* appCode
|
||||
*/
|
||||
private String appCode;
|
||||
/**
|
||||
* bizScene
|
||||
*/
|
||||
private String bizScene;
|
||||
|
||||
}
|
||||
@ -2,6 +2,7 @@ package cn.axzo.oss.manager.api.dto.request;
|
||||
|
||||
import cn.axzo.oss.common.utils.Utility;
|
||||
import cn.axzo.oss.dal.entity.File;
|
||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
@ -64,11 +65,11 @@ public class CopyObjectCloudDto {
|
||||
private File file;
|
||||
private String fileUuid;
|
||||
|
||||
public static CopyObjectCloudDto create(FileCopyObjectDto fileCopyObjectRequest, File file) {
|
||||
public static CopyObjectCloudDto create(FileCopyObjectDto fileCopyObjectRequest, File file, FileBusinessScene fileBusinessScene) {
|
||||
// 入参中有通道,则优先取入参;否则取源通道
|
||||
String targetChannelCode = StringUtils.isBlank(fileCopyObjectRequest.getTargetChannelCode()) ? file.getChannelCode() : fileCopyObjectRequest.getTargetChannelCode();
|
||||
String targetBucketName = StringUtils.isBlank(fileCopyObjectRequest.getTargetBucketName()) ? file.getBucketName() : fileCopyObjectRequest.getTargetBucketName();
|
||||
String targetBucketDict = StringUtils.isBlank(fileCopyObjectRequest.getTargetDict()) ? file.getDirectory() : fileCopyObjectRequest.getTargetDict();
|
||||
String targetChannelCode = StringUtils.isBlank(fileCopyObjectRequest.getTargetChannelCode()) ? fileBusinessScene.getChannelCode() : fileCopyObjectRequest.getTargetChannelCode();
|
||||
String targetBucketName = StringUtils.isBlank(fileCopyObjectRequest.getTargetBucketName()) ? fileBusinessScene.getBucketName() : fileCopyObjectRequest.getTargetBucketName();
|
||||
String targetBucketDict = StringUtils.isBlank(fileCopyObjectRequest.getTargetDict()) ? fileBusinessScene.getDirectory() : fileCopyObjectRequest.getTargetDict();
|
||||
String fileName = StringUtils.isBlank(fileCopyObjectRequest.getTargetFileName()) ? file.getFileName() : fileCopyObjectRequest.getTargetFileName();
|
||||
|
||||
String uuid = Utility.getUUID();
|
||||
|
||||
@ -0,0 +1,30 @@
|
||||
package cn.axzo.oss.manager.api.dto.request;
|
||||
|
||||
import com.baomidou.mybatisplus.annotation.TableField;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Builder;
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* @author xudawei@axzo.cn
|
||||
* @date 2025/3/20
|
||||
* @description FileBusinessSceneDto
|
||||
*/
|
||||
@Data
|
||||
@Builder
|
||||
@NoArgsConstructor
|
||||
@AllArgsConstructor
|
||||
public class FileBusinessSceneDto {
|
||||
|
||||
/**
|
||||
* 应用编码
|
||||
*/
|
||||
private String appCode;
|
||||
|
||||
/**
|
||||
* 业务场景
|
||||
*/
|
||||
private String businessScene;
|
||||
|
||||
}
|
||||
@ -4,10 +4,10 @@ import cn.axzo.oss.common.enums.CodeEnum;
|
||||
import cn.axzo.oss.common.exception.BizException;
|
||||
import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||
import cn.axzo.oss.dal.repository.FileBusinessSceneDao;
|
||||
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
|
||||
import cn.axzo.oss.manager.api.FileBusinessSceneManager;
|
||||
import com.google.common.collect.Lists;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.apache.commons.lang3.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.util.CollectionUtils;
|
||||
@ -53,4 +53,9 @@ public class FileBusinessSceneManagerImpl implements FileBusinessSceneManager {
|
||||
return fileBusinessSceneDao
|
||||
.queryByBucketNoAndScene(bucketNoList, bizScene);
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<FileBusinessScene> findByCondition(FileBusinessSceneVo vo) {
|
||||
return fileBusinessSceneDao.findByCondition(vo);
|
||||
}
|
||||
}
|
||||
|
||||
@ -3,6 +3,7 @@ package cn.axzo.oss.service.api;
|
||||
import cn.axzo.framework.auth.domain.ContextInfo;
|
||||
import cn.axzo.oss.dal.entity.AppChannelBucket;
|
||||
import cn.axzo.oss.dal.entity.FileUploadConfig;
|
||||
import cn.axzo.oss.manager.api.dto.request.AppInfoDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.DeleteFileDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.FileCopyObjectDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.FindFileKeyDto;
|
||||
@ -127,7 +128,7 @@ public interface FileService {
|
||||
* 1 不同通道,则通过url进行复制
|
||||
* 2 相同通道,则直接调用复制方法
|
||||
*/
|
||||
List<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, String appCode);
|
||||
List<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, AppInfoDto appInfoDto);
|
||||
|
||||
/**
|
||||
* 更新文件信息
|
||||
|
||||
@ -26,12 +26,14 @@ import cn.axzo.oss.dal.entity.FileBusinessScene;
|
||||
import cn.axzo.oss.dal.entity.FileUploadConfig;
|
||||
import cn.axzo.oss.dal.repository.FileAppDao;
|
||||
import cn.axzo.oss.dal.repository.FileDao;
|
||||
import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
|
||||
import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig;
|
||||
import cn.axzo.oss.manager.api.AppChannelBucketManager;
|
||||
import cn.axzo.oss.manager.api.FileBusinessSceneManager;
|
||||
import cn.axzo.oss.manager.api.FileManager;
|
||||
import cn.axzo.oss.manager.api.FileUploadConfigManager;
|
||||
import cn.axzo.oss.manager.api.dto.PartETag;
|
||||
import cn.axzo.oss.manager.api.dto.request.AppInfoDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.CopyObjectCloudDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.DeleteFileDto;
|
||||
import cn.axzo.oss.manager.api.dto.request.FileCopyObjectDto;
|
||||
@ -1268,12 +1270,12 @@ public class FileServiceImpl implements FileService {
|
||||
* 1 不同通道,则通过url进行复制
|
||||
* 2 相同通道,则直接调用复制方法
|
||||
*/
|
||||
public List<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, String appCode) {
|
||||
public List<FileCopyObjectResponse> batchCopyObject(List<FileCopyObjectDto> dtoList, AppInfoDto appInfoDto) {
|
||||
AssertUtil.isFalse(CollectionUtils.isEmpty(dtoList), "请求入参为空");
|
||||
//校验appCode
|
||||
this.checkAppCode(appCode);
|
||||
this.checkAppCode(appInfoDto.getAppCode());
|
||||
//通过fileKeys复制文件
|
||||
List<CopyObjectCloudDto> cloudDtos = this.batchCopyObjectByFileKeys(dtoList);
|
||||
List<CopyObjectCloudDto> cloudDtos = this.batchCopyObjectByFileKeys(dtoList, appInfoDto);
|
||||
//保存文件表
|
||||
return this.saveFiles(cloudDtos);
|
||||
}
|
||||
@ -1324,7 +1326,7 @@ public class FileServiceImpl implements FileService {
|
||||
/**
|
||||
* 通过fileKeys复制文件
|
||||
*/
|
||||
private List<CopyObjectCloudDto> batchCopyObjectByFileKeys(List<FileCopyObjectDto> dtoList) {
|
||||
private List<CopyObjectCloudDto> batchCopyObjectByFileKeys(List<FileCopyObjectDto> dtoList, AppInfoDto appInfoDto) {
|
||||
List<String> fileKeys = dtoList.stream()
|
||||
.filter(item -> StringUtils.isNotBlank(item.getSrcFileKey()))
|
||||
.map(FileCopyObjectDto::getSrcFileKey).collect(Collectors.toList());
|
||||
@ -1339,7 +1341,7 @@ public class FileServiceImpl implements FileService {
|
||||
return Lists.newArrayList();
|
||||
}
|
||||
//通过文件表,完成文件对象复制
|
||||
return this.doBatchCopyObjectByFiles(reqFileKeyMap, fileList);
|
||||
return this.doBatchCopyObjectByFiles(reqFileKeyMap, fileList, appInfoDto);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1347,8 +1349,9 @@ public class FileServiceImpl implements FileService {
|
||||
* 注意,此方法是根据业务文件复制
|
||||
* 底层通用方法fileManager.copyObjects(dto);
|
||||
*/
|
||||
private List<CopyObjectCloudDto> doBatchCopyObjectByFiles(Map<String, FileCopyObjectDto> reqFileKeyMap, List<File> fileList) {
|
||||
private List<CopyObjectCloudDto> doBatchCopyObjectByFiles(Map<String, FileCopyObjectDto> reqFileKeyMap, List<File> fileList, AppInfoDto appInfoDto) {
|
||||
List<CopyObjectCloudDto> returnList = Lists.newArrayList();
|
||||
FileBusinessScene fileBusinessScene = this.fetchBizSceneByAppCodeAndBizScene(appInfoDto);
|
||||
for (File file : fileList) {
|
||||
if (Objects.isNull(reqFileKeyMap.get(file.getFileUuid()))) {
|
||||
continue;
|
||||
@ -1357,7 +1360,7 @@ public class FileServiceImpl implements FileService {
|
||||
if (Objects.isNull(fileCopyObjectRequest)) {
|
||||
continue;
|
||||
}
|
||||
CopyObjectCloudDto dto = CopyObjectCloudDto.create(fileCopyObjectRequest, file);
|
||||
CopyObjectCloudDto dto = CopyObjectCloudDto.create(fileCopyObjectRequest, file, fileBusinessScene);
|
||||
|
||||
this.fileManager.copyObjects(dto);
|
||||
returnList.add(dto);
|
||||
@ -1365,6 +1368,16 @@ public class FileServiceImpl implements FileService {
|
||||
return returnList;
|
||||
}
|
||||
|
||||
private FileBusinessScene fetchBizSceneByAppCodeAndBizScene(AppInfoDto appInfoDto) {
|
||||
List<FileBusinessScene> list = this.fileBusinessSceneManager.findByCondition(FileBusinessSceneVo.builder()
|
||||
.appCode(appInfoDto.getAppCode())
|
||||
.businessScene(appInfoDto.getBizScene())
|
||||
.build());
|
||||
AssertUtil.notEmpty(list, "文件业务场景未配置");
|
||||
AssertUtil.isFalse(list.size() > 1, "文件业务场景匹配多个");
|
||||
return list.get(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* 更新文件信息
|
||||
*/
|
||||
|
||||
Loading…
Reference in New Issue
Block a user