feat:(REQ-3540) 文件克隆-加上targetAppCode

This commit is contained in:
xudawei 2025-03-21 14:09:23 +08:00
parent 911b70631c
commit ba1e0715fd
7 changed files with 74 additions and 12 deletions

View File

@ -3,6 +3,7 @@ package cn.axzo.oss.client.controller;
import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.core.utils.converter.BeanConverter; import cn.axzo.core.utils.converter.BeanConverter;
import cn.axzo.framework.auth.domain.ContextInfo; import cn.axzo.framework.auth.domain.ContextInfo;
import cn.axzo.oss.client.convert.ServerFileConvert;
import cn.axzo.oss.common.utils.BeanConvertUtil; import cn.axzo.oss.common.utils.BeanConvertUtil;
import cn.axzo.oss.http.api.ServerFileServiceApi; import cn.axzo.oss.http.api.ServerFileServiceApi;
import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest; import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest;
@ -245,7 +246,7 @@ public class ServerFileController implements ServerFileServiceApi {
public CommonResponse<ServerFileBatchCopyObjectResponse> batchCopyObject(@Valid @RequestBody ServerFileBatchCopyObjectRequest request) { public CommonResponse<ServerFileBatchCopyObjectResponse> batchCopyObject(@Valid @RequestBody ServerFileBatchCopyObjectRequest request) {
AssertUtil.isFalse(Objects.isNull(request) || CollectionUtils.isEmpty(request.getCopyObjects()), "入参为空"); AssertUtil.isFalse(Objects.isNull(request) || CollectionUtils.isEmpty(request.getCopyObjects()), "入参为空");
List<FileCopyObjectDto> fileCopyObjectDtos = BeanUtil.copyToList(request.getCopyObjects(), FileCopyObjectDto.class); List<FileCopyObjectDto> fileCopyObjectDtos = BeanUtil.copyToList(request.getCopyObjects(), FileCopyObjectDto.class);
List<FileCopyObjectResponse> fileCopyObjectResponses = fileService.batchCopyObject(fileCopyObjectDtos, AppInfoDto.builder().appCode(request.getAppCode()).bizScene(request.getBizScene()).build()); List<FileCopyObjectResponse> fileCopyObjectResponses = fileService.batchCopyObject(fileCopyObjectDtos, ServerFileConvert.copyObjectConvertAppInfo(request));
return CommonResponse.success(ServerFileBatchCopyObjectResponse.builder().responses(BeanUtil.copyToList(fileCopyObjectResponses, ServerFileBatchCopyObjectResponse.ServerFileCopyObjectResponse.class)).build()); return CommonResponse.success(ServerFileBatchCopyObjectResponse.builder().responses(BeanUtil.copyToList(fileCopyObjectResponses, ServerFileBatchCopyObjectResponse.ServerFileCopyObjectResponse.class)).build());
} }

View File

@ -0,0 +1,25 @@
package cn.axzo.oss.client.convert;
import cn.axzo.oss.http.model.copyobject.ServerFileBatchCopyObjectRequest;
import cn.axzo.oss.manager.api.dto.request.AppInfoDto;
/**
* @author xudawei@axzo.cn
* @date 2025/3/21
* @description 对象转换
*/
public class ServerFileConvert {
/**
* 克隆对象转换成AppInfo
*/
public static AppInfoDto copyObjectConvertAppInfo(ServerFileBatchCopyObjectRequest request) {
return AppInfoDto.builder()
.appCode(request.getAppCode())
.bizScene(request.getBizScene())
.targetAppCode(request.getTargetAppCode())
.targetBizScene(request.getTargetBizScene())
.build();
}
}

View File

@ -64,6 +64,7 @@ public enum CodeEnum implements EnumBase<Integer> {
GET_OBJECT_META_FAIL(507, "获取元文件失败"), GET_OBJECT_META_FAIL(507, "获取元文件失败"),
URL_BUCKET_NAME_KEY_ALL_EMPTY(508, "url-bucketName-key同时为空"), URL_BUCKET_NAME_KEY_ALL_EMPTY(508, "url-bucketName-key同时为空"),
SIGN_URL_DOWNLOAD_FILEKEYS_EXCEEDS_MAXSIZE(509, "fileKeys exceeds the maximum size"), SIGN_URL_DOWNLOAD_FILEKEYS_EXCEEDS_MAXSIZE(509, "fileKeys exceeds the maximum size"),
FILE_TARGET_APP_IS_EMPTY(510, "target app is empty"),
; ;
private final Integer code; private final Integer code;

View File

@ -27,6 +27,16 @@ public class ServerFileBatchCopyObjectRequest {
@NotBlank(message = "bizScene must not be null") @NotBlank(message = "bizScene must not be null")
private String bizScene; private String bizScene;
/**
* 目标appCode
*/
private String targetAppCode;
/**
* 目标bizScene
*/
private String targetBizScene;
@NotEmpty(message = "集合对象不能为空") @NotEmpty(message = "集合对象不能为空")
private Set<ServerFileCopyObjectRequest> copyObjects; private Set<ServerFileCopyObjectRequest> copyObjects;

View File

@ -25,4 +25,14 @@ public class AppInfoDto {
*/ */
private String bizScene; private String bizScene;
/**
* 目标appCode
*/
private String targetAppCode;
/**
* 目标bizScene
*/
private String targetBizScene;
} }

View File

@ -9,6 +9,8 @@ import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.Objects;
/** /**
* @author xudawei@axzo.cn * @author xudawei@axzo.cn
* @date 2025/3/10 * @date 2025/3/10
@ -69,13 +71,16 @@ public class CopyObjectCloudDto {
private String appCode; private String appCode;
public static CopyObjectCloudDto create(FileCopyObjectDto fileCopyObjectRequest, File file, FileBusinessScene fileBusinessScene) { public static CopyObjectCloudDto create(FileCopyObjectDto fileCopyObjectRequest, File file, FileBusinessScene fileBusinessScene,FileBusinessScene targetFileBiz) {
// 入参中有通道则优先取入参否则取源通道 // 入参中有通道则优先取入参否则取源通道
String targetChannelCode = StringUtils.isBlank(fileCopyObjectRequest.getTargetChannelCode()) ? fileBusinessScene.getChannelCode() : fileCopyObjectRequest.getTargetChannelCode(); String targetChannelCode = StringUtils.isBlank(fileCopyObjectRequest.getTargetChannelCode()) ? fileBusinessScene.getChannelCode() : fileCopyObjectRequest.getTargetChannelCode();
String targetBucketName = StringUtils.isBlank(fileCopyObjectRequest.getTargetBucketName()) ? fileBusinessScene.getBucketName() : fileCopyObjectRequest.getTargetBucketName(); String targetBucketName = StringUtils.isBlank(fileCopyObjectRequest.getTargetBucketName()) ? fileBusinessScene.getBucketName() : fileCopyObjectRequest.getTargetBucketName();
String targetBucketDict = StringUtils.isBlank(fileCopyObjectRequest.getTargetDict()) ? fileBusinessScene.getDirectory() : fileCopyObjectRequest.getTargetDict(); String targetBucketDict = StringUtils.isBlank(fileCopyObjectRequest.getTargetDict()) ? fileBusinessScene.getDirectory() : fileCopyObjectRequest.getTargetDict();
String fileName = StringUtils.isBlank(fileCopyObjectRequest.getTargetFileName()) ? file.getFileName() : fileCopyObjectRequest.getTargetFileName(); String fileName = StringUtils.isBlank(fileCopyObjectRequest.getTargetFileName()) ? file.getFileName() : fileCopyObjectRequest.getTargetFileName();
String appCode = (Objects.isNull(targetFileBiz) || StringUtils.isBlank(targetFileBiz.getAppCode())) ? fileBusinessScene.getAppCode() : targetFileBiz.getAppCode();
String appChannelBucketNo = (Objects.isNull(targetFileBiz) || StringUtils.isBlank(targetFileBiz.getAppChannelBucketNo())) ? fileBusinessScene.getAppChannelBucketNo() : targetFileBiz.getAppChannelBucketNo();
String uuid = Utility.getUUID(); String uuid = Utility.getUUID();
return CopyObjectCloudDto.builder() return CopyObjectCloudDto.builder()
@ -90,8 +95,8 @@ public class CopyObjectCloudDto {
.targetFileName(fileName) .targetFileName(fileName)
.file(file) .file(file)
.fileUuid(fileCopyObjectRequest.getFileUuid()) .fileUuid(fileCopyObjectRequest.getFileUuid())
.appChannelBucketNo(fileBusinessScene.getAppChannelBucketNo()) .appChannelBucketNo(appChannelBucketNo)
.appCode(fileBusinessScene.getAppCode()) .appCode(appCode)
.build(); .build();
} }

View File

@ -27,7 +27,6 @@ import cn.axzo.oss.dal.entity.FileUploadConfig;
import cn.axzo.oss.dal.repository.FileAppDao; import cn.axzo.oss.dal.repository.FileAppDao;
import cn.axzo.oss.dal.repository.FileDao; import cn.axzo.oss.dal.repository.FileDao;
import cn.axzo.oss.dal.vo.FileBusinessSceneVo; import cn.axzo.oss.dal.vo.FileBusinessSceneVo;
import cn.axzo.oss.integration.s3.config.CadThirdProperty;
import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig; import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig;
import cn.axzo.oss.manager.api.AppChannelBucketManager; import cn.axzo.oss.manager.api.AppChannelBucketManager;
import cn.axzo.oss.manager.api.FileBusinessSceneManager; import cn.axzo.oss.manager.api.FileBusinessSceneManager;
@ -48,7 +47,6 @@ import cn.axzo.oss.manager.api.dto.request.MultipartUploadInitDto;
import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto; import cn.axzo.oss.manager.api.dto.request.ServerFileDeleteDto;
import cn.axzo.oss.manager.api.dto.request.ServerFileDownloadDto; import cn.axzo.oss.manager.api.dto.request.ServerFileDownloadDto;
import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto; import cn.axzo.oss.manager.api.dto.request.ServerFileUploadDto;
import cn.axzo.oss.manager.api.dto.request.SignUploadTokenDto;
import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto; import cn.axzo.oss.manager.api.dto.request.SignUrlDownloadDto;
import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto; import cn.axzo.oss.manager.api.dto.request.SignUrlUploadDto;
import cn.axzo.oss.manager.api.dto.request.file.DeleteObjectsFileDto; import cn.axzo.oss.manager.api.dto.request.file.DeleteObjectsFileDto;
@ -64,7 +62,6 @@ import cn.axzo.oss.manager.api.dto.response.ServerFileDownloadResponse;
import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse; import cn.axzo.oss.manager.api.dto.response.ServerFileUploadResponse;
import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse; import cn.axzo.oss.manager.api.dto.response.SignUrlDownloadResponse;
import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse; import cn.axzo.oss.manager.api.dto.response.SignUrlUploadResponse;
import cn.axzo.oss.manager.api.dto.response.UploadTokenResponse;
import cn.axzo.oss.service.api.FileService; import cn.axzo.oss.service.api.FileService;
import cn.axzo.oss.service.metafile.WithFileFactory; import cn.axzo.oss.service.metafile.WithFileFactory;
import cn.axzo.oss.service.metafile.WithFileService; import cn.axzo.oss.service.metafile.WithFileService;
@ -1354,7 +1351,10 @@ public class FileServiceImpl implements FileService {
*/ */
private List<CopyObjectCloudDto> doBatchCopyObjectByFiles(Map<String, FileCopyObjectDto> reqFileKeyMap, List<File> fileList, AppInfoDto appInfoDto) { private List<CopyObjectCloudDto> doBatchCopyObjectByFiles(Map<String, FileCopyObjectDto> reqFileKeyMap, List<File> fileList, AppInfoDto appInfoDto) {
List<CopyObjectCloudDto> returnList = Lists.newArrayList(); List<CopyObjectCloudDto> returnList = Lists.newArrayList();
FileBusinessScene fileBusinessScene = this.fetchBizSceneByAppCodeAndBizScene(appInfoDto); // key:appCode的对象
// value:targetAppCode的对象
Pair<FileBusinessScene, FileBusinessScene> pair = this.checkBatchCopyObject(appInfoDto);
for (File file : fileList) { for (File file : fileList) {
if (Objects.isNull(reqFileKeyMap.get(file.getFileUuid()))) { if (Objects.isNull(reqFileKeyMap.get(file.getFileUuid()))) {
continue; continue;
@ -1363,7 +1363,7 @@ public class FileServiceImpl implements FileService {
if (Objects.isNull(fileCopyObjectRequest)) { if (Objects.isNull(fileCopyObjectRequest)) {
continue; continue;
} }
CopyObjectCloudDto dto = CopyObjectCloudDto.create(fileCopyObjectRequest, file, fileBusinessScene); CopyObjectCloudDto dto = CopyObjectCloudDto.create(fileCopyObjectRequest, file, pair.getKey(), pair.getValue());
this.fileManager.copyObjects(dto); this.fileManager.copyObjects(dto);
returnList.add(dto); returnList.add(dto);
@ -1371,10 +1371,20 @@ public class FileServiceImpl implements FileService {
return returnList; return returnList;
} }
private FileBusinessScene fetchBizSceneByAppCodeAndBizScene(AppInfoDto appInfoDto) { private Pair<FileBusinessScene,FileBusinessScene> checkBatchCopyObject(AppInfoDto appInfoDto) {
FileBusinessScene fileBusinessScene = this.fetchBizSceneByAppCodeAndBizScene(appInfoDto.getAppCode(), appInfoDto.getBizScene());
FileBusinessScene targetFileBiz = null;
if (StringUtils.isNotBlank(appInfoDto.getTargetAppCode()) && StringUtils.isNotBlank(appInfoDto.getTargetBizScene())) {
targetFileBiz = this.fetchBizSceneByAppCodeAndBizScene(appInfoDto.getTargetAppCode(), appInfoDto.getTargetBizScene());
BizException.error(Utility.objIsNotNull(targetFileBiz), CodeEnum.FILE_TARGET_APP_IS_EMPTY);
}
return Pair.of(fileBusinessScene, targetFileBiz);
}
private FileBusinessScene fetchBizSceneByAppCodeAndBizScene(String appCode, String bizScene) {
List<FileBusinessScene> list = this.fileBusinessSceneManager.findByCondition(FileBusinessSceneVo.builder() List<FileBusinessScene> list = this.fileBusinessSceneManager.findByCondition(FileBusinessSceneVo.builder()
.appCode(appInfoDto.getAppCode()) .appCode(appCode)
.businessScene(appInfoDto.getBizScene()) .businessScene(bizScene)
.build()); .build());
AssertUtil.notEmpty(list, "文件业务场景未配置"); AssertUtil.notEmpty(list, "文件业务场景未配置");
AssertUtil.isFalse(list.size() > 1, "文件业务场景匹配多个"); AssertUtil.isFalse(list.size() > 1, "文件业务场景匹配多个");