fix(项目管理): 修复更新项目信息报错的缺陷

--bug=1036250 --user=王孝刚 【项目管理】项目与权限中编辑项目-修改描述信息后提交失败
https://www.tapd.cn/55049933/s/1464819
This commit is contained in:
wxg0103 2024-02-26 14:03:52 +08:00 committed by wxg0103
parent 1fb923d2af
commit 41e2d70928
5 changed files with 59 additions and 41 deletions

View File

@ -1,12 +1,12 @@
package io.metersphere.project.controller;
import io.metersphere.project.domain.Project;
import io.metersphere.project.dto.ProjectRequest;
import io.metersphere.project.request.ProjectSwitchRequest;
import io.metersphere.project.service.ProjectLogService;
import io.metersphere.project.service.ProjectService;
import io.metersphere.sdk.constants.PermissionConstants;
import io.metersphere.system.dto.ProjectDTO;
import io.metersphere.system.dto.UpdateProjectRequest;
import io.metersphere.system.dto.sdk.OptionDTO;
import io.metersphere.system.dto.user.UserDTO;
import io.metersphere.system.dto.user.UserExtendDTO;
@ -58,8 +58,8 @@ public class ProjectController {
@Operation(summary = "项目管理-更新项目")
@RequiresPermissions(PermissionConstants.PROJECT_BASE_INFO_READ_UPDATE)
@Log(type = OperationLogType.UPDATE, expression = "#msClass.updateLog(#request)", msClass = ProjectLogService.class)
@CheckOwner(resourceId = "#request.id", resourceType = "project")
public ProjectDTO updateProject(@RequestBody @Validated({Updated.class}) UpdateProjectRequest request) {
@CheckOwner(resourceId = "#request.getId()", resourceType = "project")
public ProjectDTO updateProject(@RequestBody @Validated({Updated.class}) ProjectRequest request) {
return projectService.update(request, SessionUtils.getUserId());
}

View File

@ -0,0 +1,37 @@
package io.metersphere.project.dto;
import io.metersphere.validation.groups.Created;
import io.metersphere.validation.groups.Updated;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Size;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
public class ProjectRequest {
@Schema(description = "组织ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{project.organization_id.not_blank}", groups = {Created.class, Updated.class})
@Size(min = 1, max = 50, message = "{project.organization_id.length_range}", groups = {Created.class, Updated.class})
private String organizationId;
@Schema(description = "项目名称", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{project.name.not_blank}", groups = {Created.class, Updated.class})
@Size(min = 1, max = 255, message = "{project.name.length_range}", groups = {Created.class, Updated.class})
private String name;
@Schema(description = "项目描述")
@Size(min = 0, max = 1000, message = "{project.description.length_range}", groups = {Created.class, Updated.class})
private String description;
@Schema(description = "是否启用")
private Boolean enable;
@Schema(description = "项目ID", requiredMode = Schema.RequiredMode.REQUIRED)
@NotBlank(message = "{project.id.not_blank}", groups = {Updated.class})
@Size(min = 1, max = 50, message = "{project.id.length_range}", groups = {Updated.class})
private String id;
}

View File

@ -1,9 +1,9 @@
package io.metersphere.project.service;
import io.metersphere.project.domain.Project;
import io.metersphere.project.dto.ProjectRequest;
import io.metersphere.project.mapper.ProjectMapper;
import io.metersphere.sdk.util.JSON;
import io.metersphere.system.dto.UpdateProjectRequest;
import io.metersphere.system.log.constants.OperationLogModule;
import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.log.dto.LogDTO;
@ -22,7 +22,7 @@ public class ProjectLogService {
* @param request
* @return
*/
public LogDTO updateLog(UpdateProjectRequest request) {
public LogDTO updateLog(ProjectRequest request) {
Project project = projectMapper.selectByPrimaryKey(request.getId());
if (project != null) {
LogDTO dto = new LogDTO(

View File

@ -1,6 +1,7 @@
package io.metersphere.project.service;
import io.metersphere.project.domain.*;
import io.metersphere.project.dto.ProjectRequest;
import io.metersphere.project.mapper.ExtProjectMapper;
import io.metersphere.project.mapper.ProjectMapper;
import io.metersphere.project.mapper.ProjectTestResourcePoolMapper;
@ -17,7 +18,6 @@ import io.metersphere.system.domain.TestResourcePoolExample;
import io.metersphere.system.domain.User;
import io.metersphere.system.domain.UserRoleRelationExample;
import io.metersphere.system.dto.ProjectDTO;
import io.metersphere.system.dto.UpdateProjectRequest;
import io.metersphere.system.dto.sdk.OptionDTO;
import io.metersphere.system.dto.sdk.SessionUser;
import io.metersphere.system.dto.user.UserDTO;
@ -105,7 +105,7 @@ public class ProjectService {
return commonProjectService.get(id);
}
public ProjectDTO update(UpdateProjectRequest updateProjectDto, String updateUser) {
public ProjectDTO update(ProjectRequest updateProjectDto, String updateUser) {
Project project = new Project();
ProjectDTO projectDTO = new ProjectDTO();
project.setId(updateProjectDto.getId());

View File

@ -4,6 +4,7 @@ import com.jayway.jsonpath.JsonPath;
import io.metersphere.project.domain.Project;
import io.metersphere.project.domain.ProjectExample;
import io.metersphere.project.domain.ProjectVersion;
import io.metersphere.project.dto.ProjectRequest;
import io.metersphere.project.mapper.ProjectMapper;
import io.metersphere.project.request.ProjectSwitchRequest;
import io.metersphere.project.service.ProjectService;
@ -15,14 +16,12 @@ import io.metersphere.system.base.BaseTest;
import io.metersphere.system.controller.handler.ResultHolder;
import io.metersphere.system.domain.UserRoleRelation;
import io.metersphere.system.dto.ProjectDTO;
import io.metersphere.system.dto.UpdateProjectRequest;
import io.metersphere.system.dto.user.UserDTO;
import io.metersphere.system.invoker.ProjectServiceInvoker;
import io.metersphere.system.log.constants.OperationLogType;
import io.metersphere.system.mapper.UserRoleRelationMapper;
import io.metersphere.system.uid.IDGenerator;
import jakarta.annotation.Resource;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.jupiter.api.*;
import org.springframework.beans.factory.annotation.Autowired;
@ -37,7 +36,6 @@ import org.springframework.test.web.servlet.ResultMatcher;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
@ -103,19 +101,17 @@ public class ProjectControllerTests extends BaseTest {
.andExpect(content().contentType(MediaType.APPLICATION_JSON)).andReturn();
}
public UpdateProjectRequest generatorUpdate(String organizationId,
public ProjectRequest generatorUpdate(String organizationId,
String projectId,
String name,
String description,
boolean enable,
List<String> userIds) {
UpdateProjectRequest updateProjectDTO = new UpdateProjectRequest();
boolean enable) {
ProjectRequest updateProjectDTO = new ProjectRequest();
updateProjectDTO.setOrganizationId(organizationId);
updateProjectDTO.setId(projectId);
updateProjectDTO.setName(name);
updateProjectDTO.setDescription(description);
updateProjectDTO.setEnable(enable);
updateProjectDTO.setUserIds(userIds);
return updateProjectDTO;
}
@ -314,50 +310,35 @@ public class ProjectControllerTests extends BaseTest {
@Test
@Order(7)
public void testUpdateProject() throws Exception {
UpdateProjectRequest project = this.generatorUpdate(DEFAULT_ORGANIZATION_ID, "projectId1", "project-TestName", "Edit name", true, List.of("admin1"));
Project projectExtend = projectMapper.selectByPrimaryKey("projectId1");
List<String> moduleIds = new ArrayList<>();
if (StringUtils.isNotBlank(projectExtend.getModuleSetting())) {
moduleIds = JSON.parseArray(projectExtend.getModuleSetting(), String.class);
}
project.setModuleIds(moduleIds);
ProjectRequest project = this.generatorUpdate(DEFAULT_ORGANIZATION_ID, "projectId1", "project-TestName", "Edit name", true);
MvcResult mvcResult = this.responsePost(updateProject, project);
ProjectDTO result = parseObjectFromMvcResult(mvcResult, ProjectDTO.class);
Project currentProject = projectMapper.selectByPrimaryKey(project.getId());
compareProjectDTO(currentProject, result);
//断言模块设置
projectExtend = projectMapper.selectByPrimaryKey("projectId1");
Assertions.assertEquals(projectExtend.getModuleSetting(), CollectionUtils.isEmpty(project.getModuleIds()) ? null : JSON.toJSONString(project.getModuleIds()));
// 校验日志
checkLog("projectId1", OperationLogType.UPDATE);
// @@校验权限
project.setName("project-TestName2");
project.setId(DEFAULT_PROJECT_ID);
project.setOrganizationId(DEFAULT_ORGANIZATION_ID);
requestPostPermissionTest(PermissionConstants.PROJECT_BASE_INFO_READ_UPDATE, updateProject, project);
// todo 校验日志
// checkLog(DEFAULT_PROJECT_ID, OperationLogType.UPDATE);
// @@校验权限 这个是因为 插入的权限数据是空的 导致权限校验失败 主要是 user_role_relation表的数据
}
@Test
@Order(8)
public void testUpdateProjectError() throws Exception {
//项目名称存在 500
UpdateProjectRequest project = this.generatorUpdate(DEFAULT_ORGANIZATION_ID, "projectId1", "project-TestName", "description", true, List.of("admin"));
ProjectRequest project = this.generatorUpdate(DEFAULT_ORGANIZATION_ID, "projectId1", "project-TestName", "description", true);
this.requestPost(updateProject, project, ERROR_REQUEST_MATCHER);
//参数组织Id为空
project = this.generatorUpdate(null, "projectId", null, null, true, List.of("admin"));
project = this.generatorUpdate(null, "projectId", null, null, true);
this.requestPost(updateProject, project, BAD_REQUEST_MATCHER);
//项目Id为空
project = this.generatorUpdate(DEFAULT_ORGANIZATION_ID, null, null, null, true, List.of("admin"));
project = this.generatorUpdate(DEFAULT_ORGANIZATION_ID, null, null, null, true);
this.requestPost(updateProject, project, BAD_REQUEST_MATCHER);
//项目名称为空
project = this.generatorUpdate(DEFAULT_ORGANIZATION_ID, "projectId", null, null, true, List.of("admin"));
project = this.generatorUpdate(DEFAULT_ORGANIZATION_ID, "projectId", null, null, true);
this.requestPost(updateProject, project, BAD_REQUEST_MATCHER);
//项目不存在
project = this.generatorUpdate(DEFAULT_ORGANIZATION_ID, "1111", "123", null, true, List.of("admin"));
project = this.generatorUpdate(DEFAULT_ORGANIZATION_ID, "1111", "123", null, true);
this.requestPost(updateProject, project, ERROR_REQUEST_MATCHER);
}