diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/ApiDefinitionRequest.java b/backend/src/main/java/io/metersphere/api/dto/definition/ApiDefinitionRequest.java index 81c7d5b30b..5c3e44b2fd 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/ApiDefinitionRequest.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/ApiDefinitionRequest.java @@ -28,4 +28,6 @@ public class ApiDefinitionRequest extends BaseQueryRequest { // 测试计划是否允许重复 private boolean repeatCase; + //是否进入待更新列表 + private Boolean toBeUpdated; } diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/ApiSyncCaseRequest.java b/backend/src/main/java/io/metersphere/api/dto/definition/ApiSyncCaseRequest.java new file mode 100644 index 0000000000..d535b80306 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/dto/definition/ApiSyncCaseRequest.java @@ -0,0 +1,35 @@ +package io.metersphere.api.dto.definition; + +import lombok.*; + +import java.util.List; + +@Getter +@Setter +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ApiSyncCaseRequest { + + private Boolean protocol; + + private Boolean method; + + private Boolean path; + + private Boolean headers; + + private Boolean query; + + private Boolean rest; + + private Boolean body; + + private Boolean delNotSame; + + private Boolean runError; + + private Boolean unRun; + + private List ids; +} diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/ApiTestCaseRequest.java b/backend/src/main/java/io/metersphere/api/dto/definition/ApiTestCaseRequest.java index 5d2cb7c796..5850fe4a0a 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/ApiTestCaseRequest.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/ApiTestCaseRequest.java @@ -37,6 +37,10 @@ public class ApiTestCaseRequest extends BaseQueryRequest { * 检查待更新的(近三天有更新的或者状态为error的) */ private boolean toUpdate; + /** + * 是否进入待更新列表 + */ + private Boolean toBeUpdated; /** * 是否需要查询环境字段 */ diff --git a/backend/src/main/java/io/metersphere/api/dto/definition/SaveApiDefinitionRequest.java b/backend/src/main/java/io/metersphere/api/dto/definition/SaveApiDefinitionRequest.java index 620c1fce5b..413999b38f 100644 --- a/backend/src/main/java/io/metersphere/api/dto/definition/SaveApiDefinitionRequest.java +++ b/backend/src/main/java/io/metersphere/api/dto/definition/SaveApiDefinitionRequest.java @@ -68,4 +68,7 @@ public class SaveApiDefinitionRequest { private boolean newVersionMock; // 复制的请求Id private String sourceId; + //是否进入待更新列表 + private Boolean toBeUpdated; + } diff --git a/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java b/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java index 4bf3da7904..ed57a2ed7b 100644 --- a/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java +++ b/backend/src/main/java/io/metersphere/api/exec/api/ApiExecuteService.java @@ -20,6 +20,7 @@ import io.metersphere.api.service.ApiTestEnvironmentService; import io.metersphere.api.service.TcpApiParamService; import io.metersphere.base.domain.*; import io.metersphere.base.mapper.ApiDefinitionExecResultMapper; +import io.metersphere.base.mapper.ApiDefinitionMapper; import io.metersphere.base.mapper.ApiTestCaseMapper; import io.metersphere.base.mapper.TestPlanApiCaseMapper; import io.metersphere.base.mapper.ext.ExtApiTestCaseMapper; @@ -54,6 +55,8 @@ public class ApiExecuteService { @Resource private ApiDefinitionExecResultMapper apiDefinitionExecResultMapper; @Resource + private ApiDefinitionMapper apiDefinitionMapper; + @Resource private TestPlanApiCaseMapper testPlanApiCaseMapper; @Resource private ApiTestEnvironmentService environmentService; @@ -129,6 +132,11 @@ public class ApiExecuteService { ApiTestCaseWithBLOBs caseWithBLOBs = apiTestCaseMapper.selectByPrimaryKey(request.getCaseId()); caseWithBLOBs.setStatus("error"); apiTestCaseMapper.updateByPrimaryKey(caseWithBLOBs); + ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = apiDefinitionMapper.selectByPrimaryKey(caseWithBLOBs.getApiDefinitionId()); + if (apiDefinitionWithBLOBs.getProtocol().equals("HTTP")) { + apiDefinitionWithBLOBs.setToBeUpdated(true); + apiDefinitionMapper.updateByPrimaryKey(apiDefinitionWithBLOBs); + } } LogUtil.error(ex.getMessage(), ex); } 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 6699105e70..9d028ec385 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionService.java @@ -3,6 +3,9 @@ package io.metersphere.api.service; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.parser.Feature; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import com.github.pagehelper.Page; import com.github.pagehelper.PageHelper; import io.metersphere.api.dto.APIReportResult; @@ -342,6 +345,12 @@ public class ApiDefinitionService { if (StringUtils.equals(request.getProtocol(), "DUBBO")) { request.setMethod("dubbo://"); } + // 存储依赖关系 + ApiDefinitionSyncService apiDefinitionSyncService = CommonBeanFactory.getBean(ApiDefinitionSyncService.class); + if (apiDefinitionSyncService != null) { + apiDefinitionSyncService.syncApi(request); + } + ApiDefinitionWithBLOBs returnModel = updateTest(request); MockConfigService mockConfigService = CommonBeanFactory.getBean(MockConfigService.class); mockConfigService.updateMockReturnMsgByApi(returnModel); @@ -535,30 +544,30 @@ public class ApiDefinitionService { } } - private List getSameRequest(SaveApiDefinitionRequest request) { + private List getSameRequest(SaveApiDefinitionRequest request) { ApiDefinitionExample example = new ApiDefinitionExample(); if (request.getProtocol().equals(RequestType.HTTP)) { example.createCriteria().andMethodEqualTo(request.getMethod()).andStatusNotEqualTo("Trash") .andPathEqualTo(request.getPath()) .andProjectIdEqualTo(request.getProjectId()).andIdNotEqualTo(request.getId()); - return apiDefinitionMapper.selectByExample(example); + return apiDefinitionMapper.selectByExampleWithBLOBs(example); } else { example.createCriteria().andProtocolEqualTo(request.getProtocol()).andStatusNotEqualTo("Trash") .andNameEqualTo(request.getName()).andProjectIdEqualTo(request.getProjectId()) .andIdNotEqualTo(request.getId()); - return apiDefinitionMapper.selectByExample(example); + return apiDefinitionMapper.selectByExampleWithBLOBs(example); } } - private List getSameRequestById(String id, String projectId) { + private List getSameRequestById(String id, String projectId) { ApiDefinitionExample example = new ApiDefinitionExample(); example.createCriteria().andStatusNotEqualTo("Trash") .andProjectIdEqualTo(projectId) .andIdEqualTo(id); - return apiDefinitionMapper.selectByExample(example); + return apiDefinitionMapper.selectByExampleWithBLOBs(example); } - private List getSameRequestWithName(SaveApiDefinitionRequest request) { + private List getSameRequestWithName(SaveApiDefinitionRequest request) { ApiDefinitionExample example = new ApiDefinitionExample(); if (request.getProtocol().equals(RequestType.HTTP)) { example.createCriteria() @@ -576,7 +585,7 @@ public class ApiDefinitionService { .andIdNotEqualTo(request.getId()); } - return apiDefinitionMapper.selectByExample(example); + return apiDefinitionMapper.selectByExampleWithBLOBs(example); } @@ -606,6 +615,9 @@ public class ApiDefinitionService { test.setEnvironmentId(request.getEnvironmentId()); test.setUserId(request.getUserId()); test.setRemark(request.getRemark()); + if (request.getToBeUpdated() != null && request.getToBeUpdated()) { + test.setToBeUpdated(request.getToBeUpdated()); + } if (StringUtils.isNotEmpty(request.getTags()) && !StringUtils.equals(request.getTags(), "[]")) { test.setTags(request.getTags()); } else { @@ -637,7 +649,11 @@ public class ApiDefinitionService { if (StringUtils.equals(test.getProtocol(), "HTTP")) { List ids = new ArrayList<>(); ids.add(request.getId()); - apiTestCaseService.updateByApiDefinitionId(ids, test.getPath(), test.getMethod(), test.getProtocol()); + Boolean toBeUpdated = null; + if(request.getToBeUpdated()!=null) { + toBeUpdated = request.getToBeUpdated(); + } + apiTestCaseService.updateByApiDefinitionId(ids, test.getPath(), test.getMethod(), test.getProtocol(),toBeUpdated); } // ApiDefinitionWithBLOBs result = apiDefinitionMapper.selectByPrimaryKey(test.getId()); @@ -801,7 +817,7 @@ public class ApiDefinitionService { } apiDefinition.setDescription(apiDefinition.getDescription()); - List sameRequest; + List sameRequest; if (repeatable == null || !repeatable) { sameRequest = getSameRequest(saveReq); } else { @@ -868,7 +884,7 @@ public class ApiDefinitionService { return order; } - private void _importCreate(List sameRequest, ApiDefinitionMapper batchMapper, ApiDefinitionWithBLOBs apiDefinition, + private void _importCreate(List sameRequest, ApiDefinitionMapper batchMapper, ApiDefinitionWithBLOBs apiDefinition, ApiTestCaseMapper apiTestCaseMapper, ExtApiDefinitionMapper extApiDefinitionMapper, ApiTestImportRequest apiTestImportRequest, List cases, List mocks) { String originId = apiDefinition.getId(); @@ -905,7 +921,7 @@ public class ApiDefinitionService { if (StringUtils.isEmpty(apiTestImportRequest.getUpdateVersionId())) { apiTestImportRequest.setUpdateVersionId(apiTestImportRequest.getDefaultVersion()); } - Optional apiOp = sameRequest.stream() + Optional apiOp = sameRequest.stream() .filter(api -> StringUtils.equals(api.getVersionId(), apiTestImportRequest.getUpdateVersionId())) .findFirst(); @@ -920,7 +936,7 @@ public class ApiDefinitionService { } batchMapper.insert(apiDefinition); } else { - ApiDefinition existApi = apiOp.get(); + ApiDefinitionWithBLOBs existApi = apiOp.get(); apiDefinition.setStatus(existApi.getStatus()); apiDefinition.setOriginalState(existApi.getOriginalState()); apiDefinition.setCaseStatus(existApi.getCaseStatus()); @@ -930,9 +946,17 @@ public class ApiDefinitionService { if (existApi.getUserId() != null) { apiDefinition.setUserId(existApi.getUserId()); } + //Check whether the content has changed, if not, do not change the creation time + Boolean toChangeTime = checkIsSynchronize(existApi, apiDefinition); + if (!toChangeTime) { + apiDefinition.setUpdateTime(existApi.getUpdateTime()); + } // case 设置版本 cases.forEach(c -> { c.setVersionId(apiDefinition.getVersionId()); + if (apiDefinition.getToBeUpdated() != null && apiDefinition.getToBeUpdated()) { + c.setToBeUpdated(true); + } }); if (!StringUtils.equalsIgnoreCase(apiTestImportRequest.getPlatform(), ApiImportPlatform.Metersphere.name())) { apiDefinition.setTags(existApi.getTags()); // 其他格式 tag 不变,MS 格式替换 @@ -965,6 +989,89 @@ public class ApiDefinitionService { } } + private Boolean checkIsSynchronize(ApiDefinitionWithBLOBs existApi,ApiDefinitionWithBLOBs apiDefinition) { + + ApiDefinition exApi; + ApiDefinition api; + exApi = existApi; + api = apiDefinition; + ObjectMapper objectMapper = new ObjectMapper(); + String exApiString = null; + String apiString = null; + try { + exApiString = objectMapper.writeValueAsString(exApi); + apiString = objectMapper.writeValueAsString(api); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + + //Compare the basic information of the API. If it contains the comparison that needs to be done for the synchronization information, + // put the data into the to-be-synchronized + if (!StringUtils.equals(exApiString,apiString)) { + if (!StringUtils.equals(apiDefinition.getMethod(), existApi.getMethod())) { + apiDefinition.setToBeUpdated(true); + return true; + } + if (!StringUtils.equals(apiDefinition.getProtocol(), existApi.getProtocol())) { + apiDefinition.setToBeUpdated(true); + return true; + } + + if (!StringUtils.equals(apiDefinition.getPath(), existApi.getPath())) { + apiDefinition.setToBeUpdated(true); + return true; + } + + return true; + } + + if (!StringUtils.equals(existApi.getRemark(),apiDefinition.getRemark())) { + return true; + } + + if (!StringUtils.equals(existApi.getDescription(),apiDefinition.getDescription())) { + return true; + } + + if (!StringUtils.equals(existApi.getResponse(),apiDefinition.getResponse())) { + return true; + } + + JsonNode exApiRequest = null; + JsonNode apiRequest = null; + try { + exApiRequest = objectMapper.readTree(existApi.getRequest()); + apiRequest = objectMapper.readTree(apiDefinition.getRequest()); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + + if (exApiRequest == null || apiRequest == null) { + return false; + } + if (!StringUtils.equals(exApiRequest.get("headers").toString(),apiRequest.get("headers").toString())){ + apiDefinition.setToBeUpdated(true); + return true; + } + + if (!StringUtils.equals(exApiRequest.get("arguments").toString(),apiRequest.get("arguments").toString())){ + apiDefinition.setToBeUpdated(true); + return true; + } + + if (!StringUtils.equals(exApiRequest.get("rest").toString(),apiRequest.get("rest").toString())){ + apiDefinition.setToBeUpdated(true); + return true; + } + + if (!StringUtils.equals(exApiRequest.get("body").toString(), apiRequest.get("body").toString())){ + apiDefinition.setToBeUpdated(true); + return true; + } + + return false; + } + /** * 如果是MS格式,带用例导出,最后创建用例,重新设置接口id * diff --git a/backend/src/main/java/io/metersphere/api/service/ApiDefinitionSyncService.java b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionSyncService.java new file mode 100644 index 0000000000..4d1b3ef109 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/service/ApiDefinitionSyncService.java @@ -0,0 +1,9 @@ +package io.metersphere.api.service; + +import io.metersphere.api.dto.definition.SaveApiDefinitionRequest; + +public interface ApiDefinitionSyncService { + + void syncApi(SaveApiDefinitionRequest request); + +} diff --git a/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java b/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java index d28b7a9967..48004ee95a 100644 --- a/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java +++ b/backend/src/main/java/io/metersphere/api/service/ApiTestCaseService.java @@ -707,6 +707,12 @@ public class ApiTestCaseService { apiDefinitionWithBLOBs.setUpdateTime(System.currentTimeMillis()); apiTestCaseMapper.updateByExampleSelective(apiDefinitionWithBLOBs, apiDefinitionExample); } + if (StringUtils.isNotEmpty(request.getCaseStatus())) { + ApiTestCaseWithBLOBs apiDefinitionWithBLOBs = new ApiTestCaseWithBLOBs(); + apiDefinitionWithBLOBs.setCaseStatus(request.getCaseStatus()); + apiDefinitionWithBLOBs.setUpdateTime(System.currentTimeMillis()); + apiTestCaseMapper.updateByExampleSelective(apiDefinitionWithBLOBs, apiDefinitionExample); + } if (StringUtils.isNotEmpty(request.getEnvId())) { List bloBs = apiTestCaseMapper.selectByExampleWithBLOBs(apiDefinitionExample); SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); @@ -758,7 +764,7 @@ public class ApiTestCaseService { } } - public void updateByApiDefinitionId(List ids, String path, String method, String protocol) { + public void updateByApiDefinitionId(List ids, String path, String method, String protocol,Boolean toBeUpdated) { if ((StringUtils.isNotEmpty(method) || StringUtils.isNotEmpty(path) && RequestType.HTTP.equals(protocol))) { ApiTestCaseExample apiDefinitionExample = new ApiTestCaseExample(); apiDefinitionExample.createCriteria().andApiDefinitionIdIn(ids); @@ -788,6 +794,9 @@ public class ApiTestCaseService { } String requestStr = JSON.toJSONString(req); apiTestCase.setRequest(requestStr); + if(toBeUpdated!=null){ + apiTestCase.setToBeUpdated(toBeUpdated); + } batchMapper.updateByPrimaryKeySelective(apiTestCase); }); sqlSession.flushStatements(); diff --git a/backend/src/main/java/io/metersphere/api/service/ApiTestCaseSyncService.java b/backend/src/main/java/io/metersphere/api/service/ApiTestCaseSyncService.java new file mode 100644 index 0000000000..796a71bf03 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/service/ApiTestCaseSyncService.java @@ -0,0 +1,10 @@ +package io.metersphere.api.service; + +import io.metersphere.base.domain.ApiTestCaseWithBLOBs; + + +public interface ApiTestCaseSyncService { + + void setApiCaseUpdate(ApiTestCaseWithBLOBs test); + +} diff --git a/backend/src/main/java/io/metersphere/api/service/ProjectApplicationSyncService.java b/backend/src/main/java/io/metersphere/api/service/ProjectApplicationSyncService.java new file mode 100644 index 0000000000..3a84841755 --- /dev/null +++ b/backend/src/main/java/io/metersphere/api/service/ProjectApplicationSyncService.java @@ -0,0 +1,9 @@ +package io.metersphere.api.service; + +import com.fasterxml.jackson.core.JsonProcessingException; +import io.metersphere.base.domain.ProjectApplication; + +public interface ProjectApplicationSyncService { + // 初始化引用关系 + ProjectApplication initProjectApplicationAboutWorkstation(ProjectApplication projectApplication ) throws JsonProcessingException; +} diff --git a/backend/src/main/java/io/metersphere/api/service/RemakeReportService.java b/backend/src/main/java/io/metersphere/api/service/RemakeReportService.java index afab9a8cdf..5931286d1b 100644 --- a/backend/src/main/java/io/metersphere/api/service/RemakeReportService.java +++ b/backend/src/main/java/io/metersphere/api/service/RemakeReportService.java @@ -28,6 +28,8 @@ public class RemakeReportService { @Resource private ApiTestCaseMapper apiTestCaseMapper; @Resource + private ApiDefinitionMapper apiDefinitionMapper; + @Resource private ApiDefinitionExecResultMapper execResultMapper; @Resource private TestPlanApiCaseMapper testPlanApiCaseMapper; @@ -70,6 +72,11 @@ public class RemakeReportService { apiTestCase.setStatus("error"); apiTestCase.setUpdateTime(System.currentTimeMillis()); apiTestCaseMapper.updateByPrimaryKeySelective(apiTestCase); + ApiDefinitionWithBLOBs apiDefinitionWithBLOBs = apiDefinitionMapper.selectByPrimaryKey(apiTestCase.getApiDefinitionId()); + if (apiDefinitionWithBLOBs.getProtocol().equals("HTTP")) { + apiDefinitionWithBLOBs.setToBeUpdated(true); + apiDefinitionMapper.updateByPrimaryKey(apiDefinitionWithBLOBs); + } } } } else if (StringUtils.equals(request.getRunMode(), ApiRunMode.SCENARIO_PLAN.name())) { diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiDefinition.java b/backend/src/main/java/io/metersphere/base/domain/ApiDefinition.java index 6edb0c98ad..dded3ac9e8 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiDefinition.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiDefinition.java @@ -1,8 +1,7 @@ package io.metersphere.base.domain; -import lombok.Data; - import java.io.Serializable; +import lombok.Data; @Data public class ApiDefinition implements Serializable { @@ -60,5 +59,7 @@ public class ApiDefinition implements Serializable { private Boolean latest; + private Boolean toBeUpdated; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiDefinitionExample.java b/backend/src/main/java/io/metersphere/base/domain/ApiDefinitionExample.java index d46f3ac8c5..7fd4f1648a 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiDefinitionExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiDefinitionExample.java @@ -1933,6 +1933,66 @@ public class ApiDefinitionExample { addCriterion("latest not between", value1, value2, "latest"); return (Criteria) this; } + + public Criteria andToBeUpdatedIsNull() { + addCriterion("to_be_updated is null"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedIsNotNull() { + addCriterion("to_be_updated is not null"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedEqualTo(Boolean value) { + addCriterion("to_be_updated =", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedNotEqualTo(Boolean value) { + addCriterion("to_be_updated <>", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedGreaterThan(Boolean value) { + addCriterion("to_be_updated >", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedGreaterThanOrEqualTo(Boolean value) { + addCriterion("to_be_updated >=", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedLessThan(Boolean value) { + addCriterion("to_be_updated <", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedLessThanOrEqualTo(Boolean value) { + addCriterion("to_be_updated <=", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedIn(List values) { + addCriterion("to_be_updated in", values, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedNotIn(List values) { + addCriterion("to_be_updated not in", values, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedBetween(Boolean value1, Boolean value2) { + addCriterion("to_be_updated between", value1, value2, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedNotBetween(Boolean value1, Boolean value2) { + addCriterion("to_be_updated not between", value1, value2, "toBeUpdated"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiTestCase.java b/backend/src/main/java/io/metersphere/base/domain/ApiTestCase.java index b6fbb252e7..861f06d195 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiTestCase.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiTestCase.java @@ -45,5 +45,7 @@ public class ApiTestCase implements Serializable { private String versionId; + private Boolean toBeUpdated; + private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/domain/ApiTestCaseExample.java b/backend/src/main/java/io/metersphere/base/domain/ApiTestCaseExample.java index a01dddaa78..b2cf29c7cf 100644 --- a/backend/src/main/java/io/metersphere/base/domain/ApiTestCaseExample.java +++ b/backend/src/main/java/io/metersphere/base/domain/ApiTestCaseExample.java @@ -1443,6 +1443,66 @@ public class ApiTestCaseExample { addCriterion("version_id not between", value1, value2, "versionId"); return (Criteria) this; } + + public Criteria andToBeUpdatedIsNull() { + addCriterion("to_be_updated is null"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedIsNotNull() { + addCriterion("to_be_updated is not null"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedEqualTo(Boolean value) { + addCriterion("to_be_updated =", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedNotEqualTo(Boolean value) { + addCriterion("to_be_updated <>", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedGreaterThan(Boolean value) { + addCriterion("to_be_updated >", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedGreaterThanOrEqualTo(Boolean value) { + addCriterion("to_be_updated >=", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedLessThan(Boolean value) { + addCriterion("to_be_updated <", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedLessThanOrEqualTo(Boolean value) { + addCriterion("to_be_updated <=", value, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedIn(List values) { + addCriterion("to_be_updated in", values, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedNotIn(List values) { + addCriterion("to_be_updated not in", values, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedBetween(Boolean value1, Boolean value2) { + addCriterion("to_be_updated between", value1, value2, "toBeUpdated"); + return (Criteria) this; + } + + public Criteria andToBeUpdatedNotBetween(Boolean value1, Boolean value2) { + addCriterion("to_be_updated not between", value1, value2, "toBeUpdated"); + return (Criteria) this; + } } public static class Criteria extends GeneratedCriteria { diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiDefinitionMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ApiDefinitionMapper.xml index abd2e8796f..35f80335de 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ApiDefinitionMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ApiDefinitionMapper.xml @@ -29,6 +29,7 @@ + @@ -98,7 +99,7 @@ id, project_id, `name`, `method`, module_path, environment_id, schedule, `status`, module_id, user_id, create_time, update_time, protocol, `path`, num, tags, original_state, create_user, case_total, case_status, case_passing_rate, delete_time, delete_user_id, - `order`, ref_id, version_id, latest + `order`, ref_id, version_id, latest, to_be_updated description, request, response, remark @@ -152,7 +153,7 @@ - INSERT INTO api_definition (id, project_id, `name`, + insert into api_definition (id, project_id, `name`, `method`, module_path, environment_id, schedule, `status`, module_id, user_id, create_time, update_time, @@ -161,9 +162,9 @@ case_total, case_status, case_passing_rate, delete_time, delete_user_id, `order`, ref_id, version_id, latest, - description, request, response, - remark) - VALUES (#{id,jdbcType=VARCHAR}, #{projectId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, + to_be_updated, description, request, + response, remark) + values (#{id,jdbcType=VARCHAR}, #{projectId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{method,jdbcType=VARCHAR}, #{modulePath,jdbcType=VARCHAR}, #{environmentId,jdbcType=VARCHAR}, #{schedule,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{moduleId,jdbcType=VARCHAR}, #{userId,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT}, @@ -172,8 +173,8 @@ #{caseTotal,jdbcType=VARCHAR}, #{caseStatus,jdbcType=VARCHAR}, #{casePassingRate,jdbcType=VARCHAR}, #{deleteTime,jdbcType=BIGINT}, #{deleteUserId,jdbcType=VARCHAR}, #{order,jdbcType=BIGINT}, #{refId,jdbcType=VARCHAR}, #{versionId,jdbcType=VARCHAR}, #{latest,jdbcType=BIT}, - #{description,jdbcType=LONGVARCHAR}, #{request,jdbcType=LONGVARCHAR}, #{response,jdbcType=LONGVARCHAR}, - #{remark,jdbcType=LONGVARCHAR}) + #{toBeUpdated,jdbcType=BIT}, #{description,jdbcType=LONGVARCHAR}, #{request,jdbcType=LONGVARCHAR}, + #{response,jdbcType=LONGVARCHAR}, #{remark,jdbcType=LONGVARCHAR}) insert into api_definition @@ -259,6 +260,9 @@ latest, + + to_be_updated, + description, @@ -354,6 +358,9 @@ #{latest,jdbcType=BIT}, + + #{toBeUpdated,jdbcType=BIT}, + #{description,jdbcType=LONGVARCHAR}, @@ -458,6 +465,9 @@ latest = #{record.latest,jdbcType=BIT}, + + to_be_updated = #{record.toBeUpdated,jdbcType=BIT}, + description = #{record.description,jdbcType=LONGVARCHAR}, @@ -504,6 +514,7 @@ ref_id = #{record.refId,jdbcType=VARCHAR}, version_id = #{record.versionId,jdbcType=VARCHAR}, latest = #{record.latest,jdbcType=BIT}, + to_be_updated = #{record.toBeUpdated,jdbcType=BIT}, description = #{record.description,jdbcType=LONGVARCHAR}, request = #{record.request,jdbcType=LONGVARCHAR}, response = #{record.response,jdbcType=LONGVARCHAR}, @@ -540,7 +551,8 @@ `order` = #{record.order,jdbcType=BIGINT}, ref_id = #{record.refId,jdbcType=VARCHAR}, version_id = #{record.versionId,jdbcType=VARCHAR}, - latest = #{record.latest,jdbcType=BIT} + latest = #{record.latest,jdbcType=BIT}, + to_be_updated = #{record.toBeUpdated,jdbcType=BIT} @@ -626,6 +638,9 @@ latest = #{latest,jdbcType=BIT}, + + to_be_updated = #{toBeUpdated,jdbcType=BIT}, + description = #{description,jdbcType=LONGVARCHAR}, @@ -669,6 +684,7 @@ ref_id = #{refId,jdbcType=VARCHAR}, version_id = #{versionId,jdbcType=VARCHAR}, latest = #{latest,jdbcType=BIT}, + to_be_updated = #{toBeUpdated,jdbcType=BIT}, description = #{description,jdbcType=LONGVARCHAR}, request = #{request,jdbcType=LONGVARCHAR}, response = #{response,jdbcType=LONGVARCHAR}, @@ -702,7 +718,8 @@ `order` = #{order,jdbcType=BIGINT}, ref_id = #{refId,jdbcType=VARCHAR}, version_id = #{versionId,jdbcType=VARCHAR}, - latest = #{latest,jdbcType=BIT} + latest = #{latest,jdbcType=BIT}, + to_be_updated = #{toBeUpdated,jdbcType=BIT} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ApiTestCaseMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ApiTestCaseMapper.xml index 9c7f761e59..3a708b339b 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ApiTestCaseMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ApiTestCaseMapper.xml @@ -22,6 +22,7 @@ + @@ -88,7 +89,7 @@ id, project_id, `name`, priority, api_definition_id, create_user_id, update_user_id, create_time, update_time, num, tags, last_result_id, `status`, original_status, delete_time, - delete_user_id, version, `order`, case_status, version_id + delete_user_id, version, `order`, case_status, version_id, to_be_updated description, request @@ -148,16 +149,16 @@ num, tags, last_result_id, `status`, original_status, delete_time, delete_user_id, version, `order`, - case_status, version_id, description, - request) + case_status, version_id, to_be_updated, + description, request) values (#{id,jdbcType=VARCHAR}, #{projectId,jdbcType=VARCHAR}, #{name,jdbcType=VARCHAR}, #{priority,jdbcType=VARCHAR}, #{apiDefinitionId,jdbcType=VARCHAR}, #{createUserId,jdbcType=VARCHAR}, #{updateUserId,jdbcType=VARCHAR}, #{createTime,jdbcType=BIGINT}, #{updateTime,jdbcType=BIGINT}, #{num,jdbcType=INTEGER}, #{tags,jdbcType=VARCHAR}, #{lastResultId,jdbcType=VARCHAR}, #{status,jdbcType=VARCHAR}, #{originalStatus,jdbcType=VARCHAR}, #{deleteTime,jdbcType=BIGINT}, #{deleteUserId,jdbcType=VARCHAR}, #{version,jdbcType=INTEGER}, #{order,jdbcType=BIGINT}, - #{caseStatus,jdbcType=VARCHAR}, #{versionId,jdbcType=VARCHAR}, #{description,jdbcType=LONGVARCHAR}, - #{request,jdbcType=LONGVARCHAR}) + #{caseStatus,jdbcType=VARCHAR}, #{versionId,jdbcType=VARCHAR}, #{toBeUpdated,jdbcType=BIT}, + #{description,jdbcType=LONGVARCHAR}, #{request,jdbcType=LONGVARCHAR}) insert into api_test_case @@ -222,6 +223,9 @@ version_id, + + to_be_updated, + description, @@ -290,6 +294,9 @@ #{versionId,jdbcType=VARCHAR}, + + #{toBeUpdated,jdbcType=BIT}, + #{description,jdbcType=LONGVARCHAR}, @@ -367,6 +374,9 @@ version_id = #{record.versionId,jdbcType=VARCHAR}, + + to_be_updated = #{record.toBeUpdated,jdbcType=BIT}, + description = #{record.description,jdbcType=LONGVARCHAR}, @@ -400,6 +410,7 @@ `order` = #{record.order,jdbcType=BIGINT}, case_status = #{record.caseStatus,jdbcType=VARCHAR}, version_id = #{record.versionId,jdbcType=VARCHAR}, + to_be_updated = #{record.toBeUpdated,jdbcType=BIT}, description = #{record.description,jdbcType=LONGVARCHAR}, request = #{record.request,jdbcType=LONGVARCHAR} @@ -427,7 +438,8 @@ version = #{record.version,jdbcType=INTEGER}, `order` = #{record.order,jdbcType=BIGINT}, case_status = #{record.caseStatus,jdbcType=VARCHAR}, - version_id = #{record.versionId,jdbcType=VARCHAR} + version_id = #{record.versionId,jdbcType=VARCHAR}, + to_be_updated = #{record.toBeUpdated,jdbcType=BIT} @@ -492,6 +504,9 @@ version_id = #{versionId,jdbcType=VARCHAR}, + + to_be_updated = #{toBeUpdated,jdbcType=BIT}, + description = #{description,jdbcType=LONGVARCHAR}, @@ -522,6 +537,7 @@ `order` = #{order,jdbcType=BIGINT}, case_status = #{caseStatus,jdbcType=VARCHAR}, version_id = #{versionId,jdbcType=VARCHAR}, + to_be_updated = #{toBeUpdated,jdbcType=BIT}, description = #{description,jdbcType=LONGVARCHAR}, request = #{request,jdbcType=LONGVARCHAR} where id = #{id,jdbcType=VARCHAR} @@ -546,7 +562,8 @@ version = #{version,jdbcType=INTEGER}, `order` = #{order,jdbcType=BIGINT}, case_status = #{caseStatus,jdbcType=VARCHAR}, - version_id = #{versionId,jdbcType=VARCHAR} + version_id = #{versionId,jdbcType=VARCHAR}, + to_be_updated = #{toBeUpdated,jdbcType=BIT} where id = #{id,jdbcType=VARCHAR} \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.java b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.java index b088e3b601..72ca903375 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.java +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.java @@ -89,4 +89,7 @@ public interface ExtApiDefinitionMapper { List selectRefIdsForVersionChange(@Param("versionId") String versionId, @Param("projectId") String projectId); String selectNameById(String testId); + + int toBeUpdateApi(@Param("ids") List ids,@Param("toBeUpdate") Boolean toBeUpdate); + } diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml index 17a4fe94eb..8c70f0e201 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtApiDefinitionMapper.xml @@ -698,6 +698,9 @@ AND api_definition.module_id = #{request.moduleId} + + AND api_definition.to_be_updated = #{request.toBeUpdated} + and api_definition.id not in @@ -929,6 +932,16 @@ WHERE ref_id = #{refId,jdbcType=VARCHAR} + + update api_definition + set + to_be_updated = #{toBeUpdate} + where id in + + #{v} + + +