From ba1e0715fd780472ae00a8622b4744b3a2f65181 Mon Sep 17 00:00:00 2001 From: xudawei Date: Fri, 21 Mar 2025 14:09:23 +0800 Subject: [PATCH] =?UTF-8?q?feat:(REQ-3540)=20=E6=96=87=E4=BB=B6=E5=85=8B?= =?UTF-8?q?=E9=9A=86-=E5=8A=A0=E4=B8=8AtargetAppCode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/ServerFileController.java | 3 ++- .../oss/client/convert/ServerFileConvert.java | 25 ++++++++++++++++++ .../cn/axzo/oss/common/enums/CodeEnum.java | 1 + .../ServerFileBatchCopyObjectRequest.java | 10 +++++++ .../manager/api/dto/request/AppInfoDto.java | 10 +++++++ .../api/dto/request/CopyObjectCloudDto.java | 11 +++++--- .../oss/service/impl/FileServiceImpl.java | 26 +++++++++++++------ 7 files changed, 74 insertions(+), 12 deletions(-) create mode 100644 oss-client/src/main/java/cn/axzo/oss/client/convert/ServerFileConvert.java diff --git a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java index 5160c98..02da5a3 100644 --- a/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java +++ b/oss-client/src/main/java/cn/axzo/oss/client/controller/ServerFileController.java @@ -3,6 +3,7 @@ package cn.axzo.oss.client.controller; import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.core.utils.converter.BeanConverter; 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.http.api.ServerFileServiceApi; import cn.axzo.oss.http.model.ApiSignUrlDownloadRequest; @@ -245,7 +246,7 @@ public class ServerFileController implements ServerFileServiceApi { public CommonResponse batchCopyObject(@Valid @RequestBody ServerFileBatchCopyObjectRequest request) { AssertUtil.isFalse(Objects.isNull(request) || CollectionUtils.isEmpty(request.getCopyObjects()), "入参为空"); List fileCopyObjectDtos = BeanUtil.copyToList(request.getCopyObjects(), FileCopyObjectDto.class); - List fileCopyObjectResponses = fileService.batchCopyObject(fileCopyObjectDtos, AppInfoDto.builder().appCode(request.getAppCode()).bizScene(request.getBizScene()).build()); + List fileCopyObjectResponses = fileService.batchCopyObject(fileCopyObjectDtos, ServerFileConvert.copyObjectConvertAppInfo(request)); return CommonResponse.success(ServerFileBatchCopyObjectResponse.builder().responses(BeanUtil.copyToList(fileCopyObjectResponses, ServerFileBatchCopyObjectResponse.ServerFileCopyObjectResponse.class)).build()); } diff --git a/oss-client/src/main/java/cn/axzo/oss/client/convert/ServerFileConvert.java b/oss-client/src/main/java/cn/axzo/oss/client/convert/ServerFileConvert.java new file mode 100644 index 0000000..abc372a --- /dev/null +++ b/oss-client/src/main/java/cn/axzo/oss/client/convert/ServerFileConvert.java @@ -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(); + } + +} diff --git a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java index badc957..4d19a04 100644 --- a/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java +++ b/oss-common/src/main/java/cn/axzo/oss/common/enums/CodeEnum.java @@ -64,6 +64,7 @@ public enum CodeEnum implements EnumBase { GET_OBJECT_META_FAIL(507, "获取元文件失败"), URL_BUCKET_NAME_KEY_ALL_EMPTY(508, "url-bucketName-key同时为空"), 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; diff --git a/oss-http-api/src/main/java/cn/axzo/oss/http/model/copyobject/ServerFileBatchCopyObjectRequest.java b/oss-http-api/src/main/java/cn/axzo/oss/http/model/copyobject/ServerFileBatchCopyObjectRequest.java index 9157f4c..b4e4ac1 100644 --- a/oss-http-api/src/main/java/cn/axzo/oss/http/model/copyobject/ServerFileBatchCopyObjectRequest.java +++ b/oss-http-api/src/main/java/cn/axzo/oss/http/model/copyobject/ServerFileBatchCopyObjectRequest.java @@ -27,6 +27,16 @@ public class ServerFileBatchCopyObjectRequest { @NotBlank(message = "bizScene must not be null") private String bizScene; + /** + * 目标appCode + */ + private String targetAppCode; + + /** + * 目标bizScene + */ + private String targetBizScene; + @NotEmpty(message = "集合对象不能为空") private Set copyObjects; diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/AppInfoDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/AppInfoDto.java index e25496e..1d45f9e 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/AppInfoDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/AppInfoDto.java @@ -25,4 +25,14 @@ public class AppInfoDto { */ private String bizScene; + /** + * 目标appCode + */ + private String targetAppCode; + + /** + * 目标bizScene + */ + private String targetBizScene; + } diff --git a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/CopyObjectCloudDto.java b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/CopyObjectCloudDto.java index ee04c0d..fd01b6a 100644 --- a/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/CopyObjectCloudDto.java +++ b/oss-manager-api/src/main/java/cn/axzo/oss/manager/api/dto/request/CopyObjectCloudDto.java @@ -9,6 +9,8 @@ import lombok.Data; import lombok.NoArgsConstructor; import org.apache.commons.lang3.StringUtils; +import java.util.Objects; + /** * @author xudawei@axzo.cn * @date 2025/3/10 @@ -69,13 +71,16 @@ public class CopyObjectCloudDto { 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 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 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(); return CopyObjectCloudDto.builder() @@ -90,8 +95,8 @@ public class CopyObjectCloudDto { .targetFileName(fileName) .file(file) .fileUuid(fileCopyObjectRequest.getFileUuid()) - .appChannelBucketNo(fileBusinessScene.getAppChannelBucketNo()) - .appCode(fileBusinessScene.getAppCode()) + .appChannelBucketNo(appChannelBucketNo) + .appCode(appCode) .build(); } diff --git a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java index e70c1b9..9a2c410 100644 --- a/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java +++ b/oss-service/src/main/java/cn/axzo/oss/service/impl/FileServiceImpl.java @@ -27,7 +27,6 @@ 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.CadThirdProperty; import cn.axzo.oss.integration.s3.config.HuaWeiCloudObsConfig; import cn.axzo.oss.manager.api.AppChannelBucketManager; 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.ServerFileDownloadDto; 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.SignUrlUploadDto; 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.SignUrlDownloadResponse; 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.metafile.WithFileFactory; import cn.axzo.oss.service.metafile.WithFileService; @@ -1354,7 +1351,10 @@ public class FileServiceImpl implements FileService { */ private List doBatchCopyObjectByFiles(Map reqFileKeyMap, List fileList, AppInfoDto appInfoDto) { List returnList = Lists.newArrayList(); - FileBusinessScene fileBusinessScene = this.fetchBizSceneByAppCodeAndBizScene(appInfoDto); + // key:appCode的对象 + // value:targetAppCode的对象 + Pair pair = this.checkBatchCopyObject(appInfoDto); + for (File file : fileList) { if (Objects.isNull(reqFileKeyMap.get(file.getFileUuid()))) { continue; @@ -1363,7 +1363,7 @@ public class FileServiceImpl implements FileService { if (Objects.isNull(fileCopyObjectRequest)) { continue; } - CopyObjectCloudDto dto = CopyObjectCloudDto.create(fileCopyObjectRequest, file, fileBusinessScene); + CopyObjectCloudDto dto = CopyObjectCloudDto.create(fileCopyObjectRequest, file, pair.getKey(), pair.getValue()); this.fileManager.copyObjects(dto); returnList.add(dto); @@ -1371,10 +1371,20 @@ public class FileServiceImpl implements FileService { return returnList; } - private FileBusinessScene fetchBizSceneByAppCodeAndBizScene(AppInfoDto appInfoDto) { + private Pair 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 list = this.fileBusinessSceneManager.findByCondition(FileBusinessSceneVo.builder() - .appCode(appInfoDto.getAppCode()) - .businessScene(appInfoDto.getBizScene()) + .appCode(appCode) + .businessScene(bizScene) .build()); AssertUtil.notEmpty(list, "文件业务场景未配置"); AssertUtil.isFalse(list.size() > 1, "文件业务场景匹配多个");