refactor(接口测试): 增加拖拽接口到别的模块

This commit is contained in:
wxg0103 2024-02-20 16:09:48 +08:00 committed by Craftsman
parent c65c624000
commit e47af339d7
15 changed files with 187 additions and 24 deletions

View File

@ -369,7 +369,7 @@ api_definition_custom_field.field_id.not_blank=自定义字段ID不能为空
api_module.not.exist=模块不存在
permission.api.name=接口测试
permission.api_mock.name=接口 MOCK
api_debug_exist=接口已存在
api_debug_exist=请求已存在
follow=关注
unfollow=取消关注
api_definition_exist=接口已存在

View File

@ -381,7 +381,7 @@ api_definition_custom_field.field_id.not_blank=Field ID cannot be empty
api_module.not.exist=The module does not exist
permission.api.name=API Test
permission.api_mock.name=API MOCK
api_debug_exist=The API already exists
api_debug_exist=The Request already exists
follow=Follow
unfollow=Unfollow
api_definition_exist=The API already exists

View File

@ -349,7 +349,7 @@ api_definition_custom_field.field_id.not_blank=自定义字段ID不能为空
api_module.not.exist=模块不存在
permission.api.name=接口测试
permission.api_mock.name=接口 MOCK
api_debug_exist=接口已存在
api_debug_exist=请求已存在
follow=关注
unfollow=取消关注
api_definition_exist=接口已存在

View File

@ -350,7 +350,7 @@ api_definition_custom_field.field_id.not_blank=自定義字段ID不能爲空
api_module.not.exist=模塊不存在
permission.api.name=接口測試
permission.api_mock.name=接口 MOCK
api_debug_exist=接口已存在
api_debug_exist=请求已存在
follow=关注
unfollow=取消关注
api_definition_exist=接口已存在

View File

@ -2,11 +2,13 @@ package io.metersphere.api.controller.debug;
import io.metersphere.api.domain.ApiDebug;
import io.metersphere.api.dto.debug.*;
import io.metersphere.api.dto.request.ApiEditPosRequest;
import io.metersphere.api.service.debug.ApiDebugLogService;
import io.metersphere.api.service.debug.ApiDebugService;
import io.metersphere.sdk.constants.PermissionConstants;
import io.metersphere.system.log.annotation.Log;
import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.security.CheckOwner;
import io.metersphere.system.utils.SessionUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
@ -82,4 +84,13 @@ public class ApiDebugController {
public String debug(@Validated @RequestBody ApiDebugRunRequest request) {
return apiDebugService.debug(request);
}
@PostMapping("/edit/pos")
@Operation(summary = "接口调试-拖拽排序")
@RequiresPermissions(PermissionConstants.PROJECT_API_DEBUG_UPDATE)
@Log(type = OperationLogType.UPDATE, expression = "#msClass.moveLog(#request.getTargetId())", msClass = ApiDebugLogService.class)
@CheckOwner(resourceId = "#request.getTargetId()", resourceType = "api_debug")
public void editPos(@Validated @RequestBody ApiEditPosRequest request) {
apiDebugService.editPos(request, SessionUtils.getUserId());
}
}

View File

@ -4,6 +4,7 @@ import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import io.metersphere.api.domain.ApiDefinition;
import io.metersphere.api.dto.definition.*;
import io.metersphere.api.dto.request.ApiEditPosRequest;
import io.metersphere.api.dto.request.ImportRequest;
import io.metersphere.api.service.definition.ApiDefinitionLogService;
import io.metersphere.api.service.definition.ApiDefinitionNoticeService;
@ -12,7 +13,6 @@ import io.metersphere.sdk.constants.PermissionConstants;
import io.metersphere.system.dto.OperationHistoryDTO;
import io.metersphere.system.dto.request.OperationHistoryRequest;
import io.metersphere.system.dto.request.OperationHistoryVersionRequest;
import io.metersphere.system.dto.sdk.request.PosRequest;
import io.metersphere.system.log.annotation.Log;
import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.notice.annotation.SendNotice;
@ -239,9 +239,9 @@ public class ApiDefinitionController {
@PostMapping("/edit/pos")
@Operation(summary = "接口测试-接口管理-接口-拖拽排序")
@RequiresPermissions(PermissionConstants.PROJECT_API_DEFINITION_UPDATE)
public void editPos(@Validated @RequestBody PosRequest request) {
apiDefinitionService.editPos(request);
@Log(type = OperationLogType.UPDATE, expression = "#msClass.moveLog(#request.getTargetId())", msClass = ApiDefinitionLogService.class)
@CheckOwner(resourceId = "#request.getTargetId()", resourceType = "api_definition")
public void editPos(@Validated @RequestBody ApiEditPosRequest request) {
apiDefinitionService.editPos(request, SessionUtils.getUserId());
}
}

View File

@ -0,0 +1,19 @@
package io.metersphere.api.dto.request;
import io.metersphere.system.dto.sdk.request.PosRequest;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serializable;
@Data
public class ApiEditPosRequest extends PosRequest implements Serializable {
private static final long serialVersionUID = 1L;
@Schema(description = "模块id", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{api_definition.module_id.not_blank}")
private String moduleId;
}

View File

@ -17,4 +17,8 @@ public interface ExtApiDebugMapper {
Long getPos(@Param("userId") String userId);
Long getPrePos(@Param("projectId") String projectId, @Param("basePos") Long basePos);
Long getLastPos(@Param("projectId") String projectId, @Param("basePos") Long basePos);
}

View File

@ -17,4 +17,20 @@
ORDER BY pos DESC
LIMIT 1;
</select>
<select id="getPrePos" resultType="java.lang.Long">
select `pos` from api_debug where project_id = #{projectId}
<if test="basePos != null">
and `pos` &lt; #{basePos}
</if>
order by `pos` desc limit 1;
</select>
<select id="getLastPos" resultType="java.lang.Long">
select `pos` from api_debug where project_id = #{projectId}
<if test="basePos != null">
and `pos` &gt; #{basePos}
</if>
order by `pos` desc limit 1;
</select>
</mapper>

View File

@ -11,6 +11,7 @@ import io.metersphere.system.log.dto.LogDTO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author jianxing
* @date : 2023-11-6
@ -65,4 +66,18 @@ public class ApiDebugLogService {
dto.setOriginalValue(JSON.toJSONBytes(apiDebug));
return dto;
}
public LogDTO moveLog(String id) {
ApiDebug apiDebug = apiDebugService.get(id);
LogDTO dto = new LogDTO(
OperationLogConstants.SYSTEM,
OperationLogConstants.SYSTEM,
apiDebug.getId(),
null,
OperationLogType.UPDATE.name(),
OperationLogModule.API_DEBUG,
apiDebug.getName());
dto.setOriginalValue(JSON.toJSONBytes(apiDebug));
return dto;
}
}

View File

@ -4,10 +4,13 @@ import io.metersphere.api.constants.ApiResourceType;
import io.metersphere.api.domain.ApiDebug;
import io.metersphere.api.domain.ApiDebugBlob;
import io.metersphere.api.domain.ApiDebugExample;
import io.metersphere.api.domain.ApiDebugModule;
import io.metersphere.api.dto.ApiParamConfig;
import io.metersphere.api.dto.debug.*;
import io.metersphere.api.dto.request.ApiEditPosRequest;
import io.metersphere.api.mapper.ApiDebugBlobMapper;
import io.metersphere.api.mapper.ApiDebugMapper;
import io.metersphere.api.mapper.ApiDebugModuleMapper;
import io.metersphere.api.mapper.ExtApiDebugMapper;
import io.metersphere.api.service.ApiExecuteService;
import io.metersphere.api.service.ApiFileResourceService;
@ -53,6 +56,8 @@ public class ApiDebugService {
private ApiExecuteService apiExecuteService;
@Resource
private ApiPluginService apiPluginService;
@Resource
private ApiDebugModuleMapper apiDebugModuleMapper;
public static final Long ORDER_STEP = 5000L;
@ -209,4 +214,32 @@ public class ApiDebugService {
return runRequest.getReportId();
}
public void checkModuleExist(String moduleId) {
if (StringUtils.equals(moduleId, "root")) {
return;
}
ApiDebugModule apiDebugModule = apiDebugModuleMapper.selectByPrimaryKey(moduleId);
if (apiDebugModule == null) {
throw new MSException("module.not.exist");
}
}
public void editPos(ApiEditPosRequest request, String userId) {
ApiDebug apiDebug = checkResourceExist(request.getTargetId());
checkModuleExist(request.getModuleId());
apiDebug.setModuleId(request.getModuleId());
checkUpdateExist(apiDebug, apiDebug);
apiDebug.setUpdateUser(userId);
apiDebug.setUpdateTime(System.currentTimeMillis());
apiDebugMapper.updateByPrimaryKeySelective(apiDebug);
if (StringUtils.equals(request.getTargetId(), request.getMoveId())) {
return;
}
ServiceUtils.updatePosField(request,
ApiDebug.class,
apiDebugMapper::selectByPrimaryKey,
extApiDebugMapper::getPrePos,
extApiDebugMapper::getLastPos,
apiDebugMapper::updateByPrimaryKeySelective);
}
}

View File

@ -339,5 +339,20 @@ public class ApiDefinitionLogService {
return dto.getId();
}
public LogDTO moveLog(String id) {
ApiDefinitionDTO apiDefinitionDTO = getOriginalValue(id);
Project project = projectMapper.selectByPrimaryKey(apiDefinitionDTO.getProjectId());
LogDTO dto = new LogDTO(
apiDefinitionDTO.getProjectId(),
project.getOrganizationId(),
apiDefinitionDTO.getId(),
null,
OperationLogType.UPDATE.name(),
OperationLogModule.API_DEFINITION,
apiDefinitionDTO.getName());
dto.setOriginalValue(JSON.toJSONBytes(apiDefinitionDTO));
return dto;
}
}

View File

@ -8,6 +8,7 @@ import io.metersphere.api.dto.ApiResourceModuleInfo;
import io.metersphere.api.dto.converter.ApiDefinitionImport;
import io.metersphere.api.dto.debug.ApiFileResourceUpdateRequest;
import io.metersphere.api.dto.definition.*;
import io.metersphere.api.dto.request.ApiEditPosRequest;
import io.metersphere.api.dto.request.ImportRequest;
import io.metersphere.api.mapper.*;
import io.metersphere.api.parser.ImportParser;
@ -29,7 +30,6 @@ import io.metersphere.system.dto.OperationHistoryDTO;
import io.metersphere.system.dto.request.OperationHistoryRequest;
import io.metersphere.system.dto.request.OperationHistoryVersionRequest;
import io.metersphere.system.dto.sdk.SessionUser;
import io.metersphere.system.dto.sdk.request.PosRequest;
import io.metersphere.system.dto.table.TableBatchProcessDTO;
import io.metersphere.system.log.constants.OperationLogModule;
import io.metersphere.system.service.OperationHistoryService;
@ -1004,12 +1004,22 @@ public class ApiDefinitionService {
return apiDefinitionBlobMapper.selectByExampleWithBLOBs(apiDefinitionBlobExample);
}
public void editPos(PosRequest request) {
public void editPos(ApiEditPosRequest request, String userId) {
ApiDefinition apiDefinition = checkApiDefinition(request.getTargetId());
checkModuleExist(request.getModuleId());
apiDefinition.setModuleId(request.getModuleId());
checkUpdateExist(apiDefinition);
apiDefinition.setUpdateTime(System.currentTimeMillis());
apiDefinition.setUpdateUser(userId);
apiDefinitionMapper.updateByPrimaryKeySelective(apiDefinition);
if (StringUtils.equals(request.getTargetId(), request.getMoveId())) {
return;
}
ServiceUtils.updatePosField(request,
ApiDefinition.class,
apiDefinitionMapper::selectByPrimaryKey,
extApiDefinitionMapper::getPrePos,
extApiTestCaseMapper::getLastPos,
extApiDefinitionMapper::getLastPos,
apiDefinitionMapper::updateByPrimaryKeySelective);
}
@ -1029,4 +1039,14 @@ public class ApiDefinitionService {
public List<ApiResourceModuleInfo> getModuleInfoByIds(List<String> apiIds) {
return extApiDefinitionMapper.getModuleInfoByIds(apiIds);
}
public void checkModuleExist(String moduleId) {
if (StringUtils.equals(moduleId, "root")) {
return;
}
ApiDefinitionModule apiDefinitionModule = apiDefinitionModuleMapper.selectByPrimaryKey(moduleId);
if (apiDefinitionModule == null) {
throw new MSException("module.not.exist");
}
}
}

View File

@ -7,6 +7,7 @@ import io.metersphere.api.domain.ApiDebugBlob;
import io.metersphere.api.domain.ApiFileResource;
import io.metersphere.api.dto.assertion.MsAssertionConfig;
import io.metersphere.api.dto.debug.*;
import io.metersphere.api.dto.request.ApiEditPosRequest;
import io.metersphere.api.dto.request.MsCommonElement;
import io.metersphere.api.dto.request.http.MsHTTPElement;
import io.metersphere.api.dto.request.http.RestParam;
@ -53,6 +54,7 @@ import java.util.List;
import static io.metersphere.api.controller.result.ApiResultCode.API_DEBUG_EXIST;
import static io.metersphere.system.controller.handler.result.MsHttpResultCode.NOT_FOUND;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
/**
* @author jianxing
@ -359,6 +361,29 @@ public class ApiDebugControllerTests extends BaseTest {
@Test
@Order(6)
public void move() throws Exception {
ApiEditPosRequest request = new ApiEditPosRequest();
request.setTargetId(addApiDebug.getId());
request.setMoveId(addApiDebug.getId());
request.setProjectId(DEFAULT_PROJECT_ID);
request.setModuleId("root");
request.setMoveMode("AFTER");
requestPost("edit/pos", request).andExpect(status().isOk());
// @@请求成功
request.setMoveId(anotherAddApiDebug.getId());
this.requestPostWithOk("edit/pos", request);
// 校验请求成功数据
ApiDebug apiDebug = apiDebugMapper.selectByPrimaryKey(addApiDebug.getId());
Assertions.assertEquals(apiDebug.getModuleId(), "root");
request.setModuleId("def");
requestPost("edit/pos", request).andExpect(status().is5xxServerError());
request.setModuleId("root");
// @@校验权限
requestPostPermissionTest(PermissionConstants.PROJECT_API_DEBUG_UPDATE, "edit/pos", request);
}
@Test
@Order(7)
public void debug() throws Exception {
ApiDebugRunRequest request = new ApiDebugRunRequest();
request.setId(addApiDebug.getId());
@ -506,7 +531,7 @@ public class ApiDebugControllerTests extends BaseTest {
}
@Test
@Order(7)
@Order(8)
public void delete() throws Exception {
// @@请求成功
this.requestGetWithOk(DEFAULT_DELETE, addApiDebug.getId());

View File

@ -6,6 +6,7 @@ import io.metersphere.api.constants.ApiDefinitionStatus;
import io.metersphere.api.controller.result.ApiResultCode;
import io.metersphere.api.domain.*;
import io.metersphere.api.dto.definition.*;
import io.metersphere.api.dto.request.ApiEditPosRequest;
import io.metersphere.api.dto.request.ImportRequest;
import io.metersphere.api.dto.request.http.MsHTTPElement;
import io.metersphere.api.mapper.*;
@ -33,7 +34,6 @@ import io.metersphere.system.domain.OperationHistoryExample;
import io.metersphere.system.dto.request.OperationHistoryRequest;
import io.metersphere.system.dto.request.OperationHistoryVersionRequest;
import io.metersphere.system.dto.sdk.BaseCondition;
import io.metersphere.system.dto.sdk.request.PosRequest;
import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.mapper.OperationHistoryMapper;
import io.metersphere.system.utils.Pager;
@ -1065,17 +1065,22 @@ public class ApiDefinitionControllerTests extends BaseTest {
@Order(9)
public void testPos() throws Exception {
apiDefinition = apiDefinitionMapper.selectByPrimaryKey("1001");
ApiDefinition apiDefinition1 = apiDefinitionMapper.selectByPrimaryKey("1002");
PosRequest posRequest = new PosRequest();
posRequest.setProjectId(DEFAULT_PROJECT_ID);
posRequest.setTargetId(apiDefinition.getId());
posRequest.setMoveId(apiDefinition1.getId());
posRequest.setMoveMode("AFTER");
this.requestPostWithOkAndReturn(BASE_PATH + "edit/pos", posRequest);
ApiEditPosRequest request = new ApiEditPosRequest();
apiDefinition = apiDefinitionMapper.selectByPrimaryKey("1005");
ApiDefinition apiDefinition1 = apiDefinitionMapper.selectByPrimaryKey("1004");
request.setProjectId(DEFAULT_PROJECT_ID);
request.setTargetId(apiDefinition.getId());
request.setMoveId(apiDefinition.getId());
request.setModuleId("root");
request.setMoveMode("AFTER");
this.requestPostWithOkAndReturn(BASE_PATH + "edit/pos", request);
request.setMoveId(apiDefinition1.getId());
this.requestPostWithOkAndReturn(BASE_PATH + "edit/pos", request);
request.setMoveMode("BEFORE");
this.requestPostWithOkAndReturn(BASE_PATH + "edit/pos", request);
posRequest.setMoveMode("BEFORE");
this.requestPostWithOkAndReturn(BASE_PATH + "edit/pos", posRequest);
request.setModuleId("module-st-6");
requestPost(BASE_PATH + "edit/pos", request).andExpect(status().is5xxServerError());
}