diff --git a/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java b/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java index 9aa8fea318..6f2b5eca02 100644 --- a/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java +++ b/backend/src/main/java/io/metersphere/api/controller/ApiDefinitionController.java @@ -7,6 +7,7 @@ import io.metersphere.api.dto.ApiTestImportRequest; import io.metersphere.api.dto.automation.ApiScenarioRequest; import io.metersphere.api.dto.automation.ReferenceDTO; import io.metersphere.api.dto.definition.*; +import io.metersphere.api.dto.definition.parse.ApiDefinitionImport; import io.metersphere.api.service.ApiDefinitionService; import io.metersphere.base.domain.ApiDefinition; import io.metersphere.commons.constants.RoleConstants; @@ -93,7 +94,7 @@ public class ApiDefinitionController { @PostMapping(value = "/import", consumes = {"multipart/form-data"}) @RequiresRoles(value = {RoleConstants.TEST_USER, RoleConstants.TEST_MANAGER}, logical = Logical.OR) - public String testCaseImport(@RequestPart(value = "file", required = false) MultipartFile file, @RequestPart("request") ApiTestImportRequest request) { + public ApiDefinitionImport testCaseImport(@RequestPart(value = "file", required = false) MultipartFile file, @RequestPart("request") ApiTestImportRequest request) { return apiDefinitionService.apiTestImport(file, request); } diff --git a/backend/src/main/java/io/metersphere/api/dto/ApiTestImportRequest.java b/backend/src/main/java/io/metersphere/api/dto/ApiTestImportRequest.java index 704dadc295..28980a6993 100644 --- a/backend/src/main/java/io/metersphere/api/dto/ApiTestImportRequest.java +++ b/backend/src/main/java/io/metersphere/api/dto/ApiTestImportRequest.java @@ -13,5 +13,7 @@ public class ApiTestImportRequest { private String projectId; private String platform; private Boolean useEnvironment; + // 来自场景的导入不需要存储 + private boolean saved = true; private String swaggerUrl; } diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java index 789009212a..5cc574d6d5 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java @@ -336,7 +336,7 @@ public class ApiDefinitionService { } - public String apiTestImport(MultipartFile file, ApiTestImportRequest request) { + public ApiDefinitionImport apiTestImport(MultipartFile file, ApiTestImportRequest request) { ApiImportParser apiImportParser = ApiImportParserFactory.getApiImportParser(request.getPlatform()); ApiDefinitionImport apiImport = null; try { @@ -345,8 +345,10 @@ public class ApiDefinitionService { LogUtil.error(e.getMessage(), e); MSException.throwException(Translator.get("parse_data_error")); } - importApiTest(request, apiImport); - return "SUCCESS"; + if (request.isSaved()) { + importApiTest(request, apiImport); + } + return apiImport; } private void importApiTest(ApiTestImportRequest importRequest, ApiDefinitionImport apiImport) { diff --git a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue index 1ecbbef22e..bc35b4f9c0 100644 --- a/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue +++ b/frontend/src/business/components/api/automation/scenario/EditApiScenario.vue @@ -267,6 +267,8 @@ + + @@ -293,6 +295,7 @@ import MsApiScenarioComponent from "./ApiScenarioComponent"; import MsApiReportDetail from "../report/ApiReportDetail"; import MsScenarioParameters from "./ScenarioParameters"; + import ApiImport from "../../definition/components/import/ApiImport"; export default { name: "EditApiScenario", @@ -301,13 +304,21 @@ currentScenario: {}, }, components: { - ApiEnvironmentConfig, MsScenarioParameters, - MsApiReportDetail, MsAddTag, MsRun, - MsApiScenarioComponent, MsImportApiScenario, - MsJsr233Processor, MsConstantTimer, - MsIfController, MsApiAssertions, - MsApiExtract, MsApiDefinition, - MsApiComponent, MsApiCustomize + ApiEnvironmentConfig, + MsScenarioParameters, + MsApiReportDetail, + MsAddTag, MsRun, + MsApiScenarioComponent, + MsImportApiScenario, + MsJsr233Processor, + MsConstantTimer, + MsIfController, + MsApiAssertions, + MsApiExtract, + MsApiDefinition, + MsApiComponent, + MsApiCustomize, + ApiImport, }, data() { return { @@ -402,6 +413,7 @@ this.scenarioVisible = true; break; default: + this.$refs.apiImport.open(); break; } this.sort(); @@ -622,36 +634,40 @@ }, setFiles(item, bodyUploadFiles, obj) { if (item.body) { - item.body.kvs.forEach(param => { - if (param.files) { - param.files.forEach(item => { - if (item.file) { - if (!item.id) { - let fileId = getUUID().substring(0, 12); - item.name = item.file.name; - item.id = fileId; + if (item.body.kvs) { + item.body.kvs.forEach(param => { + if (param.files) { + param.files.forEach(item => { + if (item.file) { + if (!item.id) { + let fileId = getUUID().substring(0, 12); + item.name = item.file.name; + item.id = fileId; + } + obj.bodyUploadIds.push(item.id); + bodyUploadFiles.push(item.file); } - obj.bodyUploadIds.push(item.id); - bodyUploadFiles.push(item.file); - } - }); - } - }); - item.body.binary.forEach(param => { - if (param.files) { - param.files.forEach(item => { - if (item.file) { - if (!item.id) { - let fileId = getUUID().substring(0, 12); - item.name = item.file.name; - item.id = fileId; + }); + } + }); + } + if (item.body.binary) { + item.body.binary.forEach(param => { + if (param.files) { + param.files.forEach(item => { + if (item.file) { + if (!item.id) { + let fileId = getUUID().substring(0, 12); + item.name = item.file.name; + item.id = fileId; + } + obj.bodyUploadIds.push(item.id); + bodyUploadFiles.push(item.file); } - obj.bodyUploadIds.push(item.id); - bodyUploadFiles.push(item.file); - } - }); - } - }); + }); + } + }); + } } }, recursiveFile(arr, bodyUploadFiles, obj) { @@ -736,6 +752,15 @@ addParameters(data) { this.currentScenario.variables = data; this.reload(); + }, + apiImport(importData) { + if (importData && importData.data) { + importData.data.forEach(item => { + this.setApiParameter(item, "API", "Copy"); + }) + this.sort(); + this.reload(); + } } } } diff --git a/frontend/src/business/components/api/definition/ApiDefinition.vue b/frontend/src/business/components/api/definition/ApiDefinition.vue index a7765697b5..57651b95f2 100644 --- a/frontend/src/business/components/api/definition/ApiDefinition.vue +++ b/frontend/src/business/components/api/definition/ApiDefinition.vue @@ -225,7 +225,7 @@ if (!this.$refs.apiList[0].tableData) { return; } - let obj = {protocol: this.currentProtocol, data: this.$refs.apiList[0].tableData} + let obj = {projectName: getCurrentProjectID(), protocol: this.currentProtocol, data: this.$refs.apiList[0].tableData} downloadFile("导出API.json", JSON.stringify(obj)); }, refresh(data) { @@ -255,7 +255,7 @@ changeProtocol(data) { this.currentProtocol = data; }, - showExecResult(row){ + showExecResult(row) { this.debug(row); }, diff --git a/frontend/src/business/components/api/definition/components/import/ApiImport.vue b/frontend/src/business/components/api/definition/components/import/ApiImport.vue index bd1f0769f5..416619781e 100644 --- a/frontend/src/business/components/api/definition/components/import/ApiImport.vue +++ b/frontend/src/business/components/api/definition/components/import/ApiImport.vue @@ -70,6 +70,12 @@ export default { name: "ApiImport", components: {MsDialogFooter}, + props: { + saved: { + type: Boolean, + default: true, + } + }, data() { return { visible: false, @@ -148,7 +154,7 @@ }, uploadValidate(file, fileList) { let suffix = file.name.substring(file.name.lastIndexOf('.') + 1); - if (!this.selectedPlatform.suffixes.has(suffix)) { + if (this.selectedPlatform.suffixes && !this.selectedPlatform.suffixes.has(suffix)) { this.$warning(this.$t('api_test.api_import.suffixFormatErr')); return false; } @@ -170,7 +176,7 @@ let res = response.data; this.$success(this.$t('test_track.case.import.success')); this.visible = false; - this.$emit('refresh'); + this.$emit('refresh', res); }); } else { return false; @@ -181,8 +187,11 @@ let param = {}; Object.assign(param, this.formData); param.platform = this.selectedPlatformValue; - param.moduleId = this.currentModule.id; - param.modulePath = this.currentModule.path; + param.saved = this.saved; + if (this.currentModule) { + param.moduleId = this.currentModule.id; + param.modulePath = this.currentModule.path; + } param.projectId = getCurrentProjectID(); if (!this.swaggerUrlEable) { param.swaggerUrl = undefined;