diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiDefinitionImportUtilService.java b/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiDefinitionImportUtilService.java index 5d5856aee8..7f124fe580 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiDefinitionImportUtilService.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/service/definition/ApiDefinitionImportUtilService.java @@ -247,6 +247,51 @@ public class ApiDefinitionImportUtilService { currentApiCaseOrder.remove(); currentApiOrder.remove(); currentModuleOrder.remove(); + //获取需要新增的模块 + getNeedAddModule(modulePathMap, idModuleMap, differenceSet, addModuleList); + + SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); + ApiDefinitionModuleMapper moduleMapper = sqlSession.getMapper(ApiDefinitionModuleMapper.class); + ApiDefinitionMapper apiMapper = sqlSession.getMapper(ApiDefinitionMapper.class); + ApiDefinitionBlobMapper apiBlobMapper = sqlSession.getMapper(ApiDefinitionBlobMapper.class); + + //创建模块 + insertModule(request, addModuleList, moduleMapper); + + //取出需要更新的数据的id + List updateModuleLists = updateModuleData.stream().map(ApiDefinitionImportDetail::getId).toList(); + + //更新模块数据 + updateApiModule(modulePathMap, request, updateModuleData, apiMapper); + + List operationLogs = new ArrayList<>(); + List updateRequestData = apiDetailWithDataUpdate.getUpdateRequestData(); + + //更新接口请求数据 + updateApiRequest(request, updateRequestData, updateModuleLists, apiMapper, apiBlobMapper); + + Map logData = apiDetailWithDataUpdate.getLogData(); + Project project = projectMapper.selectByPrimaryKey(request.getProjectId()); + List updateLists = new ArrayList<>(); + //获取更新的日志 + getUpdateLog(request, logData, updateLists, project, operationLogs); + + List createLists = new ArrayList<>(); + //获取新增的数据和日志 + addApiAndLog(modulePathMap, request, addModuleData, apiMapper, apiBlobMapper, project, operationLogs, createLists); + + sqlSession.flushStatements(); + SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory); + SubListUtils.dealForSubList(operationLogs, 500, operationLogService::batchAdd); + //发送通知 + List createResources = new ArrayList<>(JSON.parseArray(JSON.toJSONString(createLists), Map.class)); + User user = userMapper.selectByPrimaryKey(request.getUserId()); + commonNoticeSendService.sendNotice(NoticeConstants.TaskType.API_DEFINITION_TASK, NoticeConstants.Event.CREATE, createResources, user, request.getProjectId()); + List updateResources = new ArrayList<>(JSON.parseArray(JSON.toJSONString(updateLists), Map.class)); + commonNoticeSendService.sendNotice(NoticeConstants.TaskType.API_DEFINITION_TASK, NoticeConstants.Event.UPDATE, updateResources, user, request.getProjectId()); + } + + private static void getNeedAddModule(Map modulePathMap, Map idModuleMap, Set differenceSet, List addModuleList) { differenceSet.forEach(item -> { //解析modulePath 格式为/a/b/c String[] split = item.split("/"); @@ -271,82 +316,9 @@ public class ApiDefinitionImportUtilService { } } }); + } - //创建模块 - SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); - ApiDefinitionModuleMapper moduleMapper = sqlSession.getMapper(ApiDefinitionModuleMapper.class); - ApiDefinitionMapper apiMapper = sqlSession.getMapper(ApiDefinitionMapper.class); - ApiDefinitionBlobMapper apiBlobMapper = sqlSession.getMapper(ApiDefinitionBlobMapper.class); - - addModuleList.forEach(t -> { - ApiDefinitionModule module = new ApiDefinitionModule(); - module.setId(t.getId()); - module.setName(t.getName()); - module.setParentId(t.getParentId()); - module.setProjectId(request.getProjectId()); - module.setCreateUser(request.getUserId()); - module.setPos(getImportNextModuleOrder(request.getProjectId())); - module.setCreateTime(System.currentTimeMillis()); - module.setUpdateUser(request.getUserId()); - module.setUpdateTime(System.currentTimeMillis()); - moduleMapper.insertSelective(module); - }); - - //取出需要更新的数据的id - List updateModuleLists = updateModuleData.stream().map(ApiDefinitionImportDetail::getId).toList(); - - //更新模块数据 - updateModuleData.forEach(t -> { - ApiDefinition apiDefinition = new ApiDefinition(); - apiDefinition.setId(t.getId()); - apiDefinition.setModuleId(modulePathMap.get(t.getModulePath()).getId()); - apiDefinition.setUpdateUser(request.getUserId()); - apiDefinition.setUpdateTime(System.currentTimeMillis()); - apiMapper.updateByPrimaryKeySelective(apiDefinition); - }); - List operationLogs = new ArrayList<>(); - List updateRequestData = apiDetailWithDataUpdate.getUpdateRequestData(); - updateRequestData.forEach(t -> { - ApiDefinition apiDefinition = new ApiDefinition(); - if (CollectionUtils.isNotEmpty(updateModuleLists) && updateModuleLists.contains(t.getId())) { - apiDefinition.setId(t.getId()); - apiDefinition.setUpdateUser(request.getUserId()); - } - apiDefinition.setUpdateTime(System.currentTimeMillis()); - apiMapper.updateByPrimaryKeySelective(apiDefinition); - //更新blob数据 - ApiDefinitionBlob apiDefinitionBlob = new ApiDefinitionBlob(); - apiDefinitionBlob.setId(t.getId()); - apiDefinitionBlob.setRequest(JSON.toJSONBytes(t.getRequest())); - apiDefinitionBlob.setResponse(JSON.toJSONBytes(t.getResponse())); - apiBlobMapper.updateByPrimaryKeySelective(apiDefinitionBlob); - }); - Map logData = apiDetailWithDataUpdate.getLogData(); - Project project = projectMapper.selectByPrimaryKey(request.getProjectId()); - List updateLists = new ArrayList<>(); - if (MapUtils.isNotEmpty(logData)) { - logData.forEach((k, v) -> { - ApiDefinitionDTO apiDefinitionDTO = new ApiDefinitionDTO(); - BeanUtils.copyBean(apiDefinitionDTO, v); - ApiDefinitionCaseDTO apiDefinitionCaseDTO = new ApiDefinitionCaseDTO(); - BeanUtils.copyBean(apiDefinitionCaseDTO, v); - updateLists.add(apiDefinitionCaseDTO); - LogDTO dto = new LogDTO( - project.getId(), - project.getOrganizationId(), - v.getId(), - request.getUserId(), - OperationLogType.UPDATE.name(), - OperationLogModule.API_TEST_MANAGEMENT_DEFINITION, - v.getName()); - dto.setHistory(true); - dto.setPath("/api/definition/import"); - dto.setMethod(HttpMethodConstants.POST.name()); - dto.setOriginalValue(JSON.toJSONBytes(apiDefinitionDTO)); - operationLogs.add(dto); - }); - } - List createLists = new ArrayList<>(); + private void addApiAndLog(Map modulePathMap, ImportRequest request, List addModuleData, ApiDefinitionMapper apiMapper, ApiDefinitionBlobMapper apiBlobMapper, Project project, List operationLogs, List createLists) { addModuleData.forEach(t -> { ApiDefinition apiDefinition = new ApiDefinition(); BeanUtils.copyBean(apiDefinition, t); @@ -391,16 +363,76 @@ public class ApiDefinitionImportUtilService { BeanUtils.copyBean(apiDefinitionCaseDTO, t); createLists.add(apiDefinitionCaseDTO); }); + } - sqlSession.flushStatements(); - SqlSessionUtils.closeSqlSession(sqlSession, sqlSessionFactory); - SubListUtils.dealForSubList(operationLogs, 500, operationLogService::batchAdd); - //发送通知 - List createResources = new ArrayList<>(JSON.parseArray(JSON.toJSONString(createLists), Map.class)); - User user = userMapper.selectByPrimaryKey(request.getUserId()); - commonNoticeSendService.sendNotice(NoticeConstants.TaskType.API_DEFINITION_TASK, NoticeConstants.Event.CREATE, createResources, user, request.getProjectId()); - List updateResources = new ArrayList<>(JSON.parseArray(JSON.toJSONString(updateLists), Map.class)); - commonNoticeSendService.sendNotice(NoticeConstants.TaskType.API_DEFINITION_TASK, NoticeConstants.Event.UPDATE, updateResources, user, request.getProjectId()); + private static void getUpdateLog(ImportRequest request, Map logData, List updateLists, Project project, List operationLogs) { + if (MapUtils.isNotEmpty(logData)) { + logData.forEach((k, v) -> { + ApiDefinitionDTO apiDefinitionDTO = new ApiDefinitionDTO(); + BeanUtils.copyBean(apiDefinitionDTO, v); + ApiDefinitionCaseDTO apiDefinitionCaseDTO = new ApiDefinitionCaseDTO(); + BeanUtils.copyBean(apiDefinitionCaseDTO, v); + updateLists.add(apiDefinitionCaseDTO); + LogDTO dto = new LogDTO( + project.getId(), + project.getOrganizationId(), + v.getId(), + request.getUserId(), + OperationLogType.UPDATE.name(), + OperationLogModule.API_TEST_MANAGEMENT_DEFINITION, + v.getName()); + dto.setHistory(true); + dto.setPath("/api/definition/import"); + dto.setMethod(HttpMethodConstants.POST.name()); + dto.setOriginalValue(JSON.toJSONBytes(apiDefinitionDTO)); + operationLogs.add(dto); + }); + } + } + + private static void updateApiRequest(ImportRequest request, List updateRequestData, List updateModuleLists, ApiDefinitionMapper apiMapper, ApiDefinitionBlobMapper apiBlobMapper) { + updateRequestData.forEach(t -> { + ApiDefinition apiDefinition = new ApiDefinition(); + if (CollectionUtils.isNotEmpty(updateModuleLists) && updateModuleLists.contains(t.getId())) { + apiDefinition.setId(t.getId()); + apiDefinition.setUpdateUser(request.getUserId()); + } + apiDefinition.setUpdateTime(System.currentTimeMillis()); + apiMapper.updateByPrimaryKeySelective(apiDefinition); + //更新blob数据 + ApiDefinitionBlob apiDefinitionBlob = new ApiDefinitionBlob(); + apiDefinitionBlob.setId(t.getId()); + apiDefinitionBlob.setRequest(JSON.toJSONBytes(t.getRequest())); + apiDefinitionBlob.setResponse(JSON.toJSONBytes(t.getResponse())); + apiBlobMapper.updateByPrimaryKeySelective(apiDefinitionBlob); + }); + } + + private static void updateApiModule(Map modulePathMap, ImportRequest request, List updateModuleData, ApiDefinitionMapper apiMapper) { + updateModuleData.forEach(t -> { + ApiDefinition apiDefinition = new ApiDefinition(); + apiDefinition.setId(t.getId()); + apiDefinition.setModuleId(modulePathMap.get(t.getModulePath()).getId()); + apiDefinition.setUpdateUser(request.getUserId()); + apiDefinition.setUpdateTime(System.currentTimeMillis()); + apiMapper.updateByPrimaryKeySelective(apiDefinition); + }); + } + + private void insertModule(ImportRequest request, List addModuleList, ApiDefinitionModuleMapper moduleMapper) { + addModuleList.forEach(t -> { + ApiDefinitionModule module = new ApiDefinitionModule(); + module.setId(t.getId()); + module.setName(t.getName()); + module.setParentId(t.getParentId()); + module.setProjectId(request.getProjectId()); + module.setCreateUser(request.getUserId()); + module.setPos(getImportNextModuleOrder(request.getProjectId())); + module.setCreateTime(System.currentTimeMillis()); + module.setUpdateUser(request.getUserId()); + module.setUpdateTime(System.currentTimeMillis()); + moduleMapper.insertSelective(module); + }); } private void getNeedUpdateData(ImportRequest request, ApiDetailWithData apiDetailWithData, ApiDetailWithDataUpdate apiDetailWithDataUpdate) { diff --git a/backend/services/api-test/src/main/java/io/metersphere/api/service/scenario/ApiScenarioService.java b/backend/services/api-test/src/main/java/io/metersphere/api/service/scenario/ApiScenarioService.java index 6be2c1bee4..bdbcc015f6 100644 --- a/backend/services/api-test/src/main/java/io/metersphere/api/service/scenario/ApiScenarioService.java +++ b/backend/services/api-test/src/main/java/io/metersphere/api/service/scenario/ApiScenarioService.java @@ -2212,7 +2212,9 @@ public class ApiScenarioService extends MoveNodeService { // 将 config 转换成对象 steps.forEach(step -> { if (step.getConfig() != null && StringUtils.isNotBlank(step.getConfig().toString())) { - step.setConfig(JSON.parseObject(step.getConfig().toString())); + if (step.getConfig() instanceof String configVal) { + step.setConfig(JSON.parseObject(configVal)); + } } }); @@ -2595,74 +2597,86 @@ public class ApiScenarioService extends MoveNodeService { ScenarioSystemRequest scenarioRequest = request.getScenarioRequest(); if (ObjectUtils.isNotEmpty(apiRequest)) { - if (CollectionUtils.isNotEmpty(apiRequest.getModuleIds())) { - apiRequest.getSelectedIds().addAll(extApiDefinitionMapper.getIdsByModules(apiRequest)); - } - apiRequest.getSelectedIds().removeAll(apiRequest.getUnselectedIds()); - List<@NotBlank String> allApiIds = apiRequest.getSelectedIds().stream().distinct().toList(); - SubListUtils.dealForSubList(allApiIds, 100, sublist -> { - ApiDefinitionExample example = new ApiDefinitionExample(); - example.createCriteria().andIdIn(sublist); - List apiDefinitions = apiDefinitionMapper.selectByExample(example); - apiDefinitions.forEach(item -> { - ApiScenarioStepDTO step = new ApiScenarioStepDTO(); - step.setStepType(ApiScenarioStepType.API.name()); - step.setName(item.getName()); - step.setResourceId(item.getId()); - step.setRefType(request.getRefType()); - step.setProjectId(item.getProjectId()); - step.setResourceNum(item.getNum().toString()); - step.setVersionId(item.getVersionId()); - steps.add(step); - }); - }); + getApiStep(request, apiRequest, steps); } if (ObjectUtils.isNotEmpty(caseRequest)) { - if (CollectionUtils.isNotEmpty(caseRequest.getModuleIds())) { - caseRequest.getSelectedIds().addAll(extApiTestCaseMapper.getIdsByModules(caseRequest)); - } - caseRequest.getSelectedIds().removeAll(caseRequest.getUnselectedIds()); - List<@NotBlank String> allCaseIds = caseRequest.getSelectedIds().stream().distinct().toList(); - SubListUtils.dealForSubList(allCaseIds, 100, sublist -> { - ApiTestCaseExample example = new ApiTestCaseExample(); - example.createCriteria().andIdIn(sublist); - List apiTestCases = apiTestCaseMapper.selectByExample(example); - apiTestCases.forEach(item -> { - ApiScenarioStepDTO step = new ApiScenarioStepDTO(); - step.setStepType(ApiScenarioStepType.API_CASE.name()); - step.setName(item.getName()); - step.setResourceId(item.getId()); - step.setRefType(request.getRefType()); - step.setProjectId(item.getProjectId()); - step.setResourceNum(item.getNum().toString()); - step.setVersionId(item.getVersionId()); - steps.add(step); - }); - }); + getCaseStep(request, caseRequest, steps); } if (ObjectUtils.isNotEmpty(scenarioRequest)) { - if (CollectionUtils.isNotEmpty(scenarioRequest.getModuleIds())) { - scenarioRequest.getSelectedIds().addAll(extApiScenarioMapper.getIdsByModules(scenarioRequest)); - } - scenarioRequest.getSelectedIds().removeAll(scenarioRequest.getUnselectedIds()); - List<@NotBlank String> allScenario = scenarioRequest.getSelectedIds().stream().distinct().toList(); - allScenario.forEach(item -> { - ApiScenarioDetail apiScenarioDetail = get(item); - ApiScenarioStepDTO step = new ApiScenarioStepDTO(); - step.setStepType(ApiScenarioStepType.API_SCENARIO.name()); - step.setName(apiScenarioDetail.getName()); - step.setResourceId(apiScenarioDetail.getId()); - step.setRefType(request.getRefType()); - step.setProjectId(apiScenarioDetail.getProjectId()); - step.setResourceNum(apiScenarioDetail.getNum().toString()); - step.setVersionId(apiScenarioDetail.getVersionId()); - step.setChildren(apiScenarioDetail.getSteps()); - steps.add(step); - }); + getScenarioStep(request, scenarioRequest, steps); } return steps; } + private void getScenarioStep(ApiScenarioSystemRequest request, ScenarioSystemRequest scenarioRequest, List steps) { + if (CollectionUtils.isNotEmpty(scenarioRequest.getModuleIds())) { + scenarioRequest.getSelectedIds().addAll(extApiScenarioMapper.getIdsByModules(scenarioRequest)); + } + scenarioRequest.getSelectedIds().removeAll(scenarioRequest.getUnselectedIds()); + List<@NotBlank String> allScenario = scenarioRequest.getSelectedIds().stream().distinct().toList(); + allScenario.forEach(item -> { + ApiScenarioDetail apiScenarioDetail = get(item); + ApiScenarioStepDTO step = new ApiScenarioStepDTO(); + step.setStepType(ApiScenarioStepType.API_SCENARIO.name()); + step.setName(apiScenarioDetail.getName()); + step.setResourceId(apiScenarioDetail.getId()); + step.setRefType(request.getRefType()); + step.setProjectId(apiScenarioDetail.getProjectId()); + step.setResourceNum(apiScenarioDetail.getNum().toString()); + step.setVersionId(apiScenarioDetail.getVersionId()); + step.setChildren(apiScenarioDetail.getSteps()); + steps.add(step); + }); + } + + private void getCaseStep(ApiScenarioSystemRequest request, ScenarioSystemRequest caseRequest, List steps) { + if (CollectionUtils.isNotEmpty(caseRequest.getModuleIds())) { + caseRequest.getSelectedIds().addAll(extApiTestCaseMapper.getIdsByModules(caseRequest)); + } + caseRequest.getSelectedIds().removeAll(caseRequest.getUnselectedIds()); + List<@NotBlank String> allCaseIds = caseRequest.getSelectedIds().stream().distinct().toList(); + SubListUtils.dealForSubList(allCaseIds, 100, sublist -> { + ApiTestCaseExample example = new ApiTestCaseExample(); + example.createCriteria().andIdIn(sublist); + List apiTestCases = apiTestCaseMapper.selectByExample(example); + apiTestCases.forEach(item -> { + ApiScenarioStepDTO step = new ApiScenarioStepDTO(); + step.setStepType(ApiScenarioStepType.API_CASE.name()); + step.setName(item.getName()); + step.setResourceId(item.getId()); + step.setRefType(request.getRefType()); + step.setProjectId(item.getProjectId()); + step.setResourceNum(item.getNum().toString()); + step.setVersionId(item.getVersionId()); + steps.add(step); + }); + }); + } + + private void getApiStep(ApiScenarioSystemRequest request, ScenarioSystemRequest apiRequest, List steps) { + if (CollectionUtils.isNotEmpty(apiRequest.getModuleIds())) { + apiRequest.getSelectedIds().addAll(extApiDefinitionMapper.getIdsByModules(apiRequest)); + } + apiRequest.getSelectedIds().removeAll(apiRequest.getUnselectedIds()); + List<@NotBlank String> allApiIds = apiRequest.getSelectedIds().stream().distinct().toList(); + SubListUtils.dealForSubList(allApiIds, 100, sublist -> { + ApiDefinitionExample example = new ApiDefinitionExample(); + example.createCriteria().andIdIn(sublist); + List apiDefinitions = apiDefinitionMapper.selectByExample(example); + apiDefinitions.forEach(item -> { + ApiScenarioStepDTO step = new ApiScenarioStepDTO(); + step.setStepType(ApiScenarioStepType.API.name()); + step.setName(item.getName()); + step.setResourceId(item.getId()); + step.setRefType(request.getRefType()); + step.setProjectId(item.getProjectId()); + step.setResourceNum(item.getNum().toString()); + step.setVersionId(item.getVersionId()); + steps.add(step); + }); + }); + } + @Override public void updatePos(String id, long pos) { extApiScenarioMapper.updatePos(id, pos);