diff --git a/backend/framework/sdk/src/main/resources/i18n/commons.properties b/backend/framework/sdk/src/main/resources/i18n/commons.properties index 245fcc2b1b..681103ce75 100644 --- a/backend/framework/sdk/src/main/resources/i18n/commons.properties +++ b/backend/framework/sdk/src/main/resources/i18n/commons.properties @@ -123,6 +123,7 @@ module_not_null=所属模块不能为空格 user_not_exists=该项目下无该用户 test_case_already_exists=该项目下已存在该测试用例 parse_data_error=解析数据出错 +parse_empty_data=未解析到数据 missing_header_information=缺少头部信息 test_case_exist=该项目下已存在用例: node_deep_limit=节点深度不超过8层! diff --git a/backend/framework/sdk/src/main/resources/i18n/commons_en_US.properties b/backend/framework/sdk/src/main/resources/i18n/commons_en_US.properties index 84d136b030..e91388ff2f 100644 --- a/backend/framework/sdk/src/main/resources/i18n/commons_en_US.properties +++ b/backend/framework/sdk/src/main/resources/i18n/commons_en_US.properties @@ -123,6 +123,7 @@ module_starts_with=The module must start with '/' user_not_exists=The user in this project is not exists test_case_already_exists=The test case in this project is exists parse_data_error=Parse data error +parse_empty_data=Parse empty data missing_header_information=Missing header information test_case_exist=A test case already exists under this project: node_deep_limit=The node depth does not exceed 8 layers! diff --git a/backend/framework/sdk/src/main/resources/i18n/commons_zh_CN.properties b/backend/framework/sdk/src/main/resources/i18n/commons_zh_CN.properties index 04faa522a4..2b299b190e 100644 --- a/backend/framework/sdk/src/main/resources/i18n/commons_zh_CN.properties +++ b/backend/framework/sdk/src/main/resources/i18n/commons_zh_CN.properties @@ -124,6 +124,7 @@ module_starts_with=所属模块必须以'/'开始 user_not_exists=该项目下无该用户 test_case_already_exists=该项目下已存在该测试用例 parse_data_error=解析数据出错 +parse_empty_data=未解析到数据 missing_header_information=缺少头部信息 test_case_exist=该项目下已存在用例: node_deep_limit=节点深度不超过8层! diff --git a/backend/framework/sdk/src/main/resources/i18n/commons_zh_TW.properties b/backend/framework/sdk/src/main/resources/i18n/commons_zh_TW.properties index 3fbc33c567..67142c50f2 100644 --- a/backend/framework/sdk/src/main/resources/i18n/commons_zh_TW.properties +++ b/backend/framework/sdk/src/main/resources/i18n/commons_zh_TW.properties @@ -124,6 +124,7 @@ module_starts_with=所屬模塊必須以'/'開始 user_not_exists=該項目下無該用戶 test_case_already_exists=該項目下已存在該測試用例 parse_data_error=解析數據出錯 +parse_empty_data=未解析到数据 missing_header_information=缺少頭部信息 test_case_exist=該項目下已存在用例: node_deep_limit=節點深度不超過8層! diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiDefinitionController.java b/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiDefinitionController.java index d0b4f13d4c..d23c67d69f 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiDefinitionController.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/controller/definition/ApiDefinitionController.java @@ -312,7 +312,7 @@ public class ApiDefinitionController { @PostMapping(value = "/export/{type}") @Operation(summary = "接口测试-接口管理-导出接口定义") @RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_EXPORT) - public ApiExportResponse export(@RequestBody ApiDefinitionBatchRequest request, @PathVariable String type) { + public ApiExportResponse export(@RequestBody ApiDefinitionBatchExportRequest request, @PathVariable String type) { return apiDefinitionExportService.export(request, type, SessionUtils.getUserId()); } } diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/dto/converter/ApiImportDataAnalysisResult.java b/backend/services/api-test/src/main/java/io/metersphere/api/dto/converter/ApiImportDataAnalysisResult.java index 3b9828044c..5929cac7e1 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/dto/converter/ApiImportDataAnalysisResult.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/dto/converter/ApiImportDataAnalysisResult.java @@ -3,6 +3,7 @@ package io.metersphere.api.dto.converter; import io.metersphere.api.dto.definition.ApiDefinitionMockDTO; import io.metersphere.api.dto.definition.ApiTestCaseDTO; import lombok.Data; +import org.apache.commons.collections4.CollectionUtils; import java.util.ArrayList; import java.util.HashMap; @@ -17,7 +18,7 @@ public class ApiImportDataAnalysisResult { // 新增接口数据 List insertApiList = new ArrayList<>(); - // 存在的接口数据. Map<导入的接口 , 已存在的接口> + // 存在的接口数据 List existenceApiList = new ArrayList<>(); // 接口的用例数据 Map> apiIdAndTestCaseMap = new HashMap<>(); @@ -27,4 +28,8 @@ public class ApiImportDataAnalysisResult { public void addExistenceApi(ApiDefinitionDetail importApi, ApiDefinitionDetail exportApi) { this.existenceApiList.add(new ExistenceApiDefinitionDetail(importApi, exportApi)); } + + public boolean isEmpty() { + return CollectionUtils.isEmpty(insertApiList) && CollectionUtils.isEmpty(existenceApiList); + } } \ No newline at end of file diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/dto/converter/ApiImportFileParseResult.java b/backend/services/api-test/src/main/java/io/metersphere/api/dto/converter/ApiImportFileParseResult.java index e251fddbcd..78acee3bff 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/dto/converter/ApiImportFileParseResult.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/dto/converter/ApiImportFileParseResult.java @@ -20,4 +20,14 @@ public class ApiImportFileParseResult { private Map> caseMap = new HashMap<>(); // mock数据 private Map> mockMap = new HashMap<>(); + + public List getApiProtocols() { + List protocols = new ArrayList<>(); + for (ApiDefinitionDetail apiDefinitionDetail : data) { + if (!protocols.contains(apiDefinitionDetail.getProtocol())) { + protocols.add(apiDefinitionDetail.getProtocol()); + } + } + return protocols; + } } diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/dto/definition/ApiDefinitionBatchExportRequest.java b/backend/services/api-test/src/main/java/io/metersphere/api/dto/definition/ApiDefinitionBatchExportRequest.java new file mode 100644 index 0000000000..8894d20ce2 --- /dev/null +++ b/backend/services/api-test/src/main/java/io/metersphere/api/dto/definition/ApiDefinitionBatchExportRequest.java @@ -0,0 +1,50 @@ +package io.metersphere.api.dto.definition; + +import com.google.common.base.CaseFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.apache.commons.lang3.StringUtils; + +import java.io.Serial; +import java.io.Serializable; +import java.util.Map; + +/** + * @author lan + */ +@Data +@EqualsAndHashCode(callSuper = false) +public class ApiDefinitionBatchExportRequest extends ApiDefinitionBatchRequest implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + + @Schema(description = "是否同步导出接口用例") + private boolean exportApiCase; + + @Schema(description = "是否同步导出接口Mock") + private boolean exportApiMock; + + @Schema(description = "排序字段(model中的字段 : asc/desc)") + private Map<@Valid @Pattern(regexp = "^[A-Za-z]+$") String, @Valid @NotBlank String> sort; + + public String getSortString() { + if (sort == null || sort.isEmpty()) { + return null; + } + StringBuilder sb = new StringBuilder(); + for (Map.Entry entry : sort.entrySet()) { + String column = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, entry.getKey()); + sb.append(column) + .append(StringUtils.SPACE) + .append(StringUtils.equalsIgnoreCase(entry.getValue(), "DESC") ? "DESC" : "ASC") + .append(","); + } + return sb.substring(0, sb.length() - 1); + } +} diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/dto/definition/ApiDefinitionBatchRequest.java b/backend/services/api-test/src/main/java/io/metersphere/api/dto/definition/ApiDefinitionBatchRequest.java index bd29dcb4f2..7736203141 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/dto/definition/ApiDefinitionBatchRequest.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/dto/definition/ApiDefinitionBatchRequest.java @@ -32,10 +32,4 @@ public class ApiDefinitionBatchRequest extends TableBatchProcessDTO implements S @Schema(description = "模块ID(根据模块树查询时要把当前节点以及子节点都放在这里。)") private List<@NotBlank String> moduleIds; - - @Schema(description = "是否同步导出接口用例") - private boolean exportApiCase; - - @Schema(description = "是否同步导出接口Mock") - private boolean exportApiMock; } diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiDefinitionMapper.java b/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiDefinitionMapper.java index 016a2f2b36..c6ef4cf178 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiDefinitionMapper.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiDefinitionMapper.java @@ -30,6 +30,8 @@ public interface ExtApiDefinitionMapper { List getIds(@Param("request") TableBatchProcessDTO request, @Param("projectId") String projectId, @Param("protocols") List protocols, @Param("deleted") boolean deleted); + List getIdsBySort(@Param("request") TableBatchProcessDTO request, @Param("projectId") String projectId, @Param("protocols") List protocols, @Param("orderColumns") String orderColumns); + List getRefIds(@Param("ids") List ids, @Param("deleted") boolean deleted); List getIdsByRefId(@Param("refIds") List refIds, @Param("deleted") boolean deleted); diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiDefinitionMapper.xml b/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiDefinitionMapper.xml index 3701774ff2..bcb8aca31f 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiDefinitionMapper.xml +++ b/backend/services/api-test/src/main/java/io/metersphere/api/mapper/ExtApiDefinitionMapper.xml @@ -89,6 +89,28 @@ + +