refactor(功能用例): 附件接口优化

This commit is contained in:
WangXu10 2023-12-15 16:52:37 +08:00 committed by f2c-ci-robot[bot]
parent 4125570930
commit 255bd60725
17 changed files with 73 additions and 25 deletions

View File

@ -164,4 +164,4 @@ case_review.multiple=Multiple reviewers
case_review.not.exist=Case review does not exist
case_review_content.not.exist = Review comments cannot be empty
case_review_history.system=System trigger
case_review.viewFlag.not_blank=View flag cannot be empty

View File

@ -163,4 +163,4 @@ case_review.multiple=多人评审
case_review.not.exist=用例评审不存在
case_review_content.not.exist = 评审意见不能为空
case_review_history.system=系统触发
case_review.viewFlag.not_blank=查看标识不能为空

View File

@ -164,4 +164,4 @@ case_review.multiple=多人評審
case_review.not.exist=用例評審不存在
case_review_content.not.exist = 評審意見不能為空
case_review_history.system=系統觸發
case_review.viewFlag.not_blank=查看標誌不能為空

View File

@ -1,6 +1,7 @@
package io.metersphere.functional.controller;
import io.metersphere.functional.domain.FunctionalCaseAttachment;
import io.metersphere.functional.request.AttachmentTransferRequest;
import io.metersphere.functional.request.FunctionalCaseAssociationFileRequest;
import io.metersphere.functional.request.FunctionalCaseDeleteFileRequest;
import io.metersphere.functional.request.FunctionalCaseFileRequest;
@ -112,7 +113,7 @@ public class FunctionalCaseAttachmentController {
@PostMapping("/transfer")
@Operation(summary = "用例管理-功能用例-附件-文件转存")
@RequiresPermissions(PermissionConstants.FUNCTIONAL_CASE_READ)
public String transfer(@Validated @RequestBody FunctionalCaseFileRequest request) {
public String transfer(@Validated @RequestBody AttachmentTransferRequest request) {
byte[] fileByte = functionalCaseAttachmentService.getFileByte(request);
FunctionalCaseAttachment attachment = functionalCaseAttachmentService.getAttachment(request);
FileLogRecord fileLogRecord = FileLogRecord.builder()

View File

@ -15,11 +15,11 @@ public class FunctionalCaseAttachmentDTO implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
@Schema(description = "ID")
@Schema(description = "文件ID")
private String id;
@Schema(description = "文件ID")
private String fileId;
@Schema(description = "关联ID")
private String associationId;
@Schema(description = "文件名称")
private String fileName;

View File

@ -0,0 +1,17 @@
package io.metersphere.functional.request;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
* @author wx
*/
@Data
public class AttachmentTransferRequest extends FunctionalCaseFileRequest{
@Schema(description = "转存的模块id",requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{functional_case.module_id.not_blank}")
private String moduleId;
}

View File

@ -2,6 +2,7 @@ package io.metersphere.functional.request;
import io.metersphere.system.dto.table.TableBatchProcessDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
@ -17,6 +18,7 @@ public class BaseReviewCaseBatchRequest extends TableBatchProcessDTO implements
private static final long serialVersionUID = 1L;
@Schema(description = "评审id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{case_review_user.review_id.not_blank}")
private String reviewId;

View File

@ -1,6 +1,7 @@
package io.metersphere.functional.request;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
@ -19,8 +20,10 @@ public class FunctionalCaseAssociationFileRequest implements Serializable {
private List<String> fileIds;
@Schema(description = "用例id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{functional_case_comment.case_id.not_blank}")
private String caseId;
@Schema(description = "项目id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{functional_case.project_id.not_blank}")
private String projectId;
}

View File

@ -3,6 +3,7 @@ package io.metersphere.functional.request;
import io.metersphere.functional.dto.BaseFunctionalCaseBatchDTO;
import io.metersphere.functional.dto.CaseCustomFieldDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.util.List;
@ -15,9 +16,10 @@ public class FunctionalCaseBatchEditRequest extends BaseFunctionalCaseBatchDTO {
@Schema(description = "项目ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{functional_case.project_id.not_blank}")
private String projectId;
@Schema(description = "是否追加", requiredMode = Schema.RequiredMode.REQUIRED)
@Schema(description = "是否追加")
private boolean append;
@Schema(description = "标签")

View File

@ -1,6 +1,7 @@
package io.metersphere.functional.request;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
@ -10,5 +11,6 @@ import lombok.Data;
public class FunctionalCaseBatchMoveRequest extends FunctionalCaseBatchRequest {
@Schema(description = "模块ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{functional_case.module_id.not_blank}")
private String moduleId;
}

View File

@ -2,6 +2,7 @@ package io.metersphere.functional.request;
import io.metersphere.functional.dto.BaseFunctionalCaseBatchDTO;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
/**
@ -12,6 +13,7 @@ public class FunctionalCaseBatchRequest extends BaseFunctionalCaseBatchDTO {
@Schema(description = "项目ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{functional_case.project_id.not_blank}")
private String projectId;
@Schema(description = "删除列表版本/删除全部版本")

View File

@ -1,6 +1,7 @@
package io.metersphere.functional.request;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
@ -21,8 +22,10 @@ public class FunctionalCaseDeleteFileRequest implements Serializable {
private Boolean local;
@Schema(description = "用例id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{functional_case_comment.case_id.not_blank}")
private String caseId;
@Schema(description = "项目id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{functional_case.project_id.not_blank}")
private String projectId;
}

View File

@ -1,6 +1,7 @@
package io.metersphere.functional.request;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
@ -16,18 +17,19 @@ public class FunctionalCaseFileRequest implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "项目id",requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{case_review.project_id.not_blank}")
private String projectId;
@Schema(description = "用例id",requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{case_review_functional_case.case_id.not_blank}")
private String caseId;
@Schema(description = "文件id",requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{functional_case_attachment.file_id.not_blank}")
private String fileId;
@Schema(description = "是否本地",requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean local;
@Schema(description = "转存的模块id",requiredMode = Schema.RequiredMode.REQUIRED)
private String moduleId;
}

View File

@ -2,6 +2,7 @@ package io.metersphere.functional.request;
import io.metersphere.system.dto.sdk.BasePageRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serial;
@ -16,6 +17,7 @@ public class ReviewFunctionalCasePageRequest extends BasePageRequest implements
private static final long serialVersionUID = 1L;
@Schema(description = "评审id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{case_review_user.review_id.not_blank}")
private String reviewId;

View File

@ -18,9 +18,9 @@ import io.metersphere.project.service.FileService;
import io.metersphere.sdk.constants.DefaultRepositoryDir;
import io.metersphere.sdk.constants.StorageType;
import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.file.FileRequest;
import io.metersphere.sdk.util.BeanUtils;
import io.metersphere.sdk.util.FileAssociationSourceUtil;
import io.metersphere.sdk.file.FileRequest;
import io.metersphere.system.log.constants.OperationLogModule;
import io.metersphere.system.uid.IDGenerator;
import jakarta.annotation.Resource;
@ -122,6 +122,8 @@ public class FunctionalCaseAttachmentService {
List<FunctionalCaseAttachmentDTO> attachmentDTOs = new ArrayList<>(Lists.transform(caseAttachments, (functionalCaseAttachment) -> {
FunctionalCaseAttachmentDTO attachmentDTO = new FunctionalCaseAttachmentDTO();
BeanUtils.copyBean(attachmentDTO, functionalCaseAttachment);
attachmentDTO.setId(functionalCaseAttachment.getFileId());
attachmentDTO.setAssociationId(functionalCaseAttachment.getId());
return attachmentDTO;
}));
@ -130,6 +132,8 @@ public class FunctionalCaseAttachmentService {
List<FunctionalCaseAttachmentDTO> filesDTOs = new ArrayList<>(Lists.transform(files, (fileInfo) -> {
FunctionalCaseAttachmentDTO attachmentDTO = new FunctionalCaseAttachmentDTO();
BeanUtils.copyBean(attachmentDTO, fileInfo);
attachmentDTO.setId(fileInfo.getFileId());
attachmentDTO.setAssociationId(fileInfo.getId());
return attachmentDTO;
}));
attachmentDTOs.addAll(filesDTOs);
@ -145,7 +149,7 @@ public class FunctionalCaseAttachmentService {
*/
public void deleteCaseAttachment(List<String> deleteFileMetaIds, String caseId, String projectId) {
FunctionalCaseAttachmentExample example = new FunctionalCaseAttachmentExample();
example.createCriteria().andIdIn(deleteFileMetaIds).andCaseIdEqualTo(caseId).andLocalEqualTo(true);
example.createCriteria().andFileIdIn(deleteFileMetaIds).andCaseIdEqualTo(caseId).andLocalEqualTo(true);
List<FunctionalCaseAttachment> delAttachment = functionalCaseAttachmentMapper.selectByExample(example);
example.clear();
example.createCriteria().andIdIn(deleteFileMetaIds);
@ -217,13 +221,14 @@ public class FunctionalCaseAttachmentService {
/**
* 取消关联 删除文件库文件和用例关联关系
*
* @param sourceId sourceId
* @param unLinkFilesIds unLinkFilesIds
* @param logUrl logUrl
* @param userId userId
* @param projectId projectId
*/
public void unAssociation(List<String> unLinkFilesIds, String logUrl, String userId, String projectId) {
fileAssociationService.deleteByIds(unLinkFilesIds, createFileLogRecord(logUrl, userId, projectId));
public void unAssociation(String sourceId, List<String> unLinkFilesIds, String logUrl, String userId, String projectId) {
fileAssociationService.deleteBySourceIdAndFileIds(sourceId, unLinkFilesIds, createFileLogRecord(logUrl, userId, projectId));
}
@ -234,7 +239,7 @@ public class FunctionalCaseAttachmentService {
*/
public ResponseEntity<byte[]> downloadPreviewImgById(FunctionalCaseFileRequest request) {
FunctionalCaseAttachmentExample example = new FunctionalCaseAttachmentExample();
example.createCriteria().andIdEqualTo(request.getFileId()).andCaseIdEqualTo(request.getCaseId());
example.createCriteria().andFileIdEqualTo(request.getFileId()).andCaseIdEqualTo(request.getCaseId());
List<FunctionalCaseAttachment> caseAttachments = functionalCaseAttachmentMapper.selectByExample(example);
if (CollectionUtils.isNotEmpty(caseAttachments)) {
FunctionalCaseAttachment attachment = caseAttachments.get(0);
@ -258,7 +263,7 @@ public class FunctionalCaseAttachmentService {
public byte[] getFileByte(FunctionalCaseFileRequest request) {
FunctionalCaseAttachmentExample example = new FunctionalCaseAttachmentExample();
example.createCriteria().andIdEqualTo(request.getFileId()).andCaseIdEqualTo(request.getCaseId());
example.createCriteria().andFileIdEqualTo(request.getFileId()).andCaseIdEqualTo(request.getCaseId());
List<FunctionalCaseAttachment> caseAttachments = functionalCaseAttachmentMapper.selectByExample(example);
byte[] bytes = null;
if (CollectionUtils.isNotEmpty(caseAttachments)) {
@ -278,7 +283,7 @@ public class FunctionalCaseAttachmentService {
public FunctionalCaseAttachment getAttachment(FunctionalCaseFileRequest request) {
FunctionalCaseAttachmentExample example = new FunctionalCaseAttachmentExample();
example.createCriteria().andIdEqualTo(request.getFileId()).andCaseIdEqualTo(request.getCaseId());
example.createCriteria().andFileIdEqualTo(request.getFileId()).andCaseIdEqualTo(request.getCaseId());
List<FunctionalCaseAttachment> caseAttachments = functionalCaseAttachmentMapper.selectByExample(example);
if (CollectionUtils.isNotEmpty(caseAttachments)) {
return caseAttachments.get(0);
@ -307,7 +312,7 @@ public class FunctionalCaseAttachmentService {
if (BooleanUtils.isTrue(request.getLocal())) {
this.deleteCaseAttachment(Arrays.asList(request.getId()), request.getCaseId(), userId);
} else {
this.unAssociation(Arrays.asList(request.getId()), DELETED_FILE, userId, request.getProjectId());
this.unAssociation(request.getCaseId(), Arrays.asList(request.getId()), DELETED_FILE, userId, request.getProjectId());
}
}
}

View File

@ -292,7 +292,7 @@ public class FunctionalCaseService {
//处理取消关联文件id
if (CollectionUtils.isNotEmpty(request.getUnLinkFilesIds())) {
functionalCaseAttachmentService.unAssociation(request.getUnLinkFilesIds(), UPDATE_FUNCTIONAL_CASE_FILE_LOG_URL, userId, request.getProjectId());
functionalCaseAttachmentService.unAssociation(request.getId(), request.getUnLinkFilesIds(), UPDATE_FUNCTIONAL_CASE_FILE_LOG_URL, userId, request.getProjectId());
}
//上传新文件

View File

@ -1,9 +1,11 @@
package io.metersphere.functional.controller;
import io.metersphere.functional.dto.FunctionalCaseAttachmentDTO;
import io.metersphere.functional.request.AttachmentTransferRequest;
import io.metersphere.functional.request.FunctionalCaseAssociationFileRequest;
import io.metersphere.functional.request.FunctionalCaseDeleteFileRequest;
import io.metersphere.functional.request.FunctionalCaseFileRequest;
import io.metersphere.functional.service.FunctionalCaseAttachmentService;
import io.metersphere.functional.utils.FileBaseUtils;
import io.metersphere.project.dto.filemanagement.request.FileMetadataTableRequest;
import io.metersphere.project.dto.filemanagement.request.FileUploadRequest;
@ -12,10 +14,10 @@ import io.metersphere.project.service.FileService;
import io.metersphere.sdk.constants.DefaultRepositoryDir;
import io.metersphere.sdk.constants.StorageType;
import io.metersphere.sdk.exception.MSException;
import io.metersphere.sdk.file.FileRequest;
import io.metersphere.sdk.util.JSON;
import io.metersphere.system.base.BaseTest;
import io.metersphere.system.controller.handler.ResultHolder;
import io.metersphere.sdk.file.FileRequest;
import jakarta.annotation.Resource;
import org.junit.jupiter.api.*;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
@ -29,6 +31,7 @@ import org.springframework.util.LinkedMultiValueMap;
import java.nio.charset.StandardCharsets;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
@ -46,6 +49,8 @@ public class FunctionalCaseAttachmentControllerTests extends BaseTest {
@Resource
private FileMetadataService fileMetadataService;
@Resource
private FunctionalCaseAttachmentService functionalCaseAttachmentService;
public static final String ATTACHMENT_PAGE_URL = "/attachment/page";
public static final String ATTACHMENT_PREVIEW_URL = "/attachment/preview";
@ -80,7 +85,7 @@ public class FunctionalCaseAttachmentControllerTests extends BaseTest {
FunctionalCaseFileRequest request = new FunctionalCaseFileRequest();
request.setProjectId("WX_TEST_PROJECT_ID");
request.setLocal(true);
request.setFileId("TEST_ATTACHMENT_ID");
request.setFileId("TEST_ATTACHMENT_FILE_ID");
request.setCaseId("TEST_FUNCTIONAL_CASE_ATTACHMENT_ID");
uploadLocalFile();
this.downloadFile(ATTACHMENT_PREVIEW_URL, request);
@ -138,7 +143,7 @@ public class FunctionalCaseAttachmentControllerTests extends BaseTest {
//覆盖controller
FunctionalCaseFileRequest request = new FunctionalCaseFileRequest();
request.setProjectId("WX_TEST_PROJECT_ID");
request.setFileId("TEST_ATTACHMENT_ID");
request.setFileId("TEST_ATTACHMENT_FILE_ID");
request.setCaseId("TEST_FUNCTIONAL_CASE_ATTACHMENT_ID");
request.setLocal(true);
this.downloadFile(ATTACHMENT_DOWNLOAD_URL, request);
@ -166,14 +171,16 @@ public class FunctionalCaseAttachmentControllerTests extends BaseTest {
@Order(6)
public void testAttachmentTransfer() throws Exception {
//覆盖controller
FunctionalCaseFileRequest request = new FunctionalCaseFileRequest();
AttachmentTransferRequest request = new AttachmentTransferRequest();
request.setLocal(false);
request.setProjectId(DEFAULT_PROJECT_ID);
request.setFileId(FILE_ID);
request.setCaseId("TEST_FUNCTIONAL_CASE_ATTACHMENT_ID");
request.setModuleId("root");
this.requestPost(ATTACHMENT_TRANSFER_URL, request);
request.setFileId("TEST_ATTACHMENT_ID");
request.setFileId("TEST_ATTACHMENT_FILE_ID");
this.requestPost(ATTACHMENT_TRANSFER_URL, request);
functionalCaseAttachmentService.deleteCaseAttachment(List.of("TEST_ATTACHMENT_FILE_ID"), "TEST_FUNCTIONAL_CASE_ATTACHMENT_ID", "WX_TEST_PROJECT_ID");
}
@ -211,7 +218,7 @@ public class FunctionalCaseAttachmentControllerTests extends BaseTest {
request.setLocal(false);
this.requestPost(DELETE_FILE_URL, request);
attachmentDTO.setId("TEST_ATTACHMENT_ID");
attachmentDTO.setId("TEST_ATTACHMENT_FILE_ID");
attachmentDTO.setLocal(true);
this.requestPost(DELETE_FILE_URL, request);
}