feat(系统设置): 增加组织项目后台
--task=1012653 --user=王孝刚 系统设置-组织-项目-后台 https://www.tapd.cn/55049933/s/1401306
This commit is contained in:
parent
c620387da1
commit
be15c3657d
|
@ -34,6 +34,14 @@ public class PermissionConstants {
|
||||||
public static final String ORGANIZATION_MEMBER_DELETE = "ORGANIZATION_MEMBER:READ+DELETE";
|
public static final String ORGANIZATION_MEMBER_DELETE = "ORGANIZATION_MEMBER:READ+DELETE";
|
||||||
/*------ end: ORGANIZATION_MEMBER ------*/
|
/*------ end: ORGANIZATION_MEMBER ------*/
|
||||||
|
|
||||||
|
/*------ start: ORGANIZATION_PROJECT ------*/
|
||||||
|
public static final String ORGANIZATION_PROJECT_READ = "ORGANIZATION_PROJECT:READ";
|
||||||
|
public static final String ORGANIZATION_PROJECT_READ_ADD = "ORGANIZATION_PROJECT:READ+ADD";
|
||||||
|
public static final String ORGANIZATION_PROJECT_READ_UPDATE = "ORGANIZATION_PROJECT:READ+UPDATE";
|
||||||
|
public static final String ORGANIZATION_PROJECT_READ_DELETE = "ORGANIZATION_PROJECT:READ+DELETE";
|
||||||
|
public static final String ORGANIZATION_PROJECT_READ_RECOVER = "ORGANIZATION_PROJECT:READ+RECOVER";
|
||||||
|
/*------ end: ORGANIZATION_PROJECT ------*/
|
||||||
|
|
||||||
/*------ start: SYSTEM_PLUGIN ------*/
|
/*------ start: SYSTEM_PLUGIN ------*/
|
||||||
public static final String SYSTEM_PLUGIN_READ = "SYSTEM_PLUGIN_READ:READ";
|
public static final String SYSTEM_PLUGIN_READ = "SYSTEM_PLUGIN_READ:READ";
|
||||||
public static final String SYSTEM_PLUGIN_ADD = "SYSTEM_PLUGIN_READ:READ+ADD";
|
public static final String SYSTEM_PLUGIN_ADD = "SYSTEM_PLUGIN_READ:READ+ADD";
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package io.metersphere.sdk.dto;
|
package io.metersphere.sdk.dto;
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.media.Schema;
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import jakarta.validation.constraints.Size;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.EqualsAndHashCode;
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@ -10,6 +11,10 @@ import java.util.List;
|
||||||
@EqualsAndHashCode(callSuper = false)
|
@EqualsAndHashCode(callSuper = false)
|
||||||
public class AddProjectRequest extends ProjectBaseRequest {
|
public class AddProjectRequest extends ProjectBaseRequest {
|
||||||
|
|
||||||
|
@Schema(title = "项目ID", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
|
||||||
|
@Size(min = 1, max = 50, message = "{project.id.length_range}")
|
||||||
|
private String id;
|
||||||
|
|
||||||
@Schema(title = "成员数", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
|
@Schema(title = "成员数", requiredMode = Schema.RequiredMode.NOT_REQUIRED)
|
||||||
private List<String> userIds;
|
private List<String> userIds;
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,4 +52,5 @@ public class OperationLogModule {
|
||||||
public static final String SYSTEM_PLUGIN = "SYSTEM_PLUGIN";
|
public static final String SYSTEM_PLUGIN = "SYSTEM_PLUGIN";
|
||||||
public static final String SYSTEM_PROJECT = "SYSTEM_PROJECT";
|
public static final String SYSTEM_PROJECT = "SYSTEM_PROJECT";
|
||||||
public static final String SYSTEM_PROJECT_MEMBER = "SYSTEM_PROJECT_MEMBER";
|
public static final String SYSTEM_PROJECT_MEMBER = "SYSTEM_PROJECT_MEMBER";
|
||||||
|
public static final String ORGANIZATION_PROJECT = "ORGANIZATION_PROJECT";
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,8 +52,8 @@ project_extend.project_id.not_blank=项目ID不能为空
|
||||||
project_extend.platform.length_range=平台长度必须在{min}-{max}之间
|
project_extend.platform.length_range=平台长度必须在{min}-{max}之间
|
||||||
project_extend.platform.not_blank=平台不能为空
|
project_extend.platform.not_blank=平台不能为空
|
||||||
project.id.not_blank=ID不能为空
|
project.id.not_blank=ID不能为空
|
||||||
project.organization_id.length_range=工作空间ID长度必须在{min}-{max}之间
|
project.organization_id.length_range=组织ID长度必须在{min}-{max}之间
|
||||||
project.organization_id.not_blank=工作空间ID不能为空
|
project.organization_id.not_blank=组织ID不能为空
|
||||||
project.name.length_range=名称长度必须在{min}-{max}之间
|
project.name.length_range=名称长度必须在{min}-{max}之间
|
||||||
project.name.not_blank=名称不能为空
|
project.name.not_blank=名称不能为空
|
||||||
custom_function.id.not_blank=ID不能为空
|
custom_function.id.not_blank=ID不能为空
|
||||||
|
|
|
@ -132,11 +132,11 @@ user_role_relation.role_id.not_blank=用户组关系用户组ID不能为空
|
||||||
user_role_relation.role_id.length_range=用户组关系用户组ID长度必须在{min}和{max}之间
|
user_role_relation.role_id.length_range=用户组关系用户组ID长度必须在{min}和{max}之间
|
||||||
user_role_relation.source_id.not_blank=用户组关系来源ID不能为空
|
user_role_relation.source_id.not_blank=用户组关系来源ID不能为空
|
||||||
user_role_relation.source_id.length_range=用户组关系来源ID长度必须在{min}和{max}之间
|
user_role_relation.source_id.length_range=用户组关系来源ID长度必须在{min}和{max}之间
|
||||||
organization.id.not_blank=工作空间ID不能为空
|
organization.id.not_blank=组织ID不能为空
|
||||||
organization.name.not_blank=工作空间名称不能为空
|
organization.name.not_blank=组织名称不能为空
|
||||||
organization.name.length_range=工作空间名称长度必须在{min}和{max}之间
|
organization.name.length_range=组织名称长度必须在{min}和{max}之间
|
||||||
organization.create_user.not_blank=工作空间创建人不能为空
|
organization.create_user.not_blank=组织创建人不能为空
|
||||||
organization.create_user.length_range=工作空间创建人长度必须在{min}和{max}之间
|
organization.create_user.length_range=组织创建人长度必须在{min}和{max}之间
|
||||||
and_add_organization_admin=并添加组织管理员
|
and_add_organization_admin=并添加组织管理员
|
||||||
organization_add_member_ids_empty=组织添加成员不能为空
|
organization_add_member_ids_empty=组织添加成员不能为空
|
||||||
organization_not_exist=组织不存在
|
organization_not_exist=组织不存在
|
||||||
|
|
|
@ -132,11 +132,11 @@ user_role_relation.role_id.not_blank=用戶組關係用戶組ID不能為空
|
||||||
user_role_relation.role_id.length_range=用戶組關係用戶組ID長度必須在{min}和{max}之間
|
user_role_relation.role_id.length_range=用戶組關係用戶組ID長度必須在{min}和{max}之間
|
||||||
user_role_relation.source_id.not_blank=用戶組關係來源ID不能為空
|
user_role_relation.source_id.not_blank=用戶組關係來源ID不能為空
|
||||||
user_role_relation.source_id.length_range=用戶組關係來源ID長度必須在{min}和{max}之間
|
user_role_relation.source_id.length_range=用戶組關係來源ID長度必須在{min}和{max}之間
|
||||||
organization.id.not_blank=工作空間ID不能為空
|
organization.id.not_blank=組織ID不能為空
|
||||||
organization.name.not_blank=工作空間名稱不能為空
|
organization.name.not_blank=組織名稱不能為空
|
||||||
organization.name.length_range=工作空間名稱長度必須在{min}和{max}之間
|
organization.name.length_range=組織名稱長度必須在{min}和{max}之間
|
||||||
organization.create_user.not_blank=工作空間創建人不能為空
|
organization.create_user.not_blank=組織創建人不能為空
|
||||||
organization.create_user.length_range=工作空間創建人長度必須在{min}和{max}之間
|
organization.create_user.length_range=組織創建人長度必須在{min}和{max}之間
|
||||||
and_add_organization_admin=並添加組織管理員
|
and_add_organization_admin=並添加組織管理員
|
||||||
organization_add_member_ids_empty=組織添加成員不能爲空
|
organization_add_member_ids_empty=組織添加成員不能爲空
|
||||||
organization_not_exist=組織不存在
|
organization_not_exist=組織不存在
|
||||||
|
|
|
@ -0,0 +1,128 @@
|
||||||
|
package io.metersphere.system.controller;
|
||||||
|
|
||||||
|
|
||||||
|
import com.github.pagehelper.Page;
|
||||||
|
import com.github.pagehelper.PageHelper;
|
||||||
|
import io.metersphere.project.domain.Project;
|
||||||
|
import io.metersphere.sdk.constants.PermissionConstants;
|
||||||
|
import io.metersphere.sdk.dto.AddProjectRequest;
|
||||||
|
import io.metersphere.sdk.dto.ProjectDTO;
|
||||||
|
import io.metersphere.sdk.dto.UpdateProjectRequest;
|
||||||
|
import io.metersphere.sdk.log.annotation.Log;
|
||||||
|
import io.metersphere.sdk.log.constants.OperationLogType;
|
||||||
|
import io.metersphere.sdk.util.PageUtils;
|
||||||
|
import io.metersphere.sdk.util.Pager;
|
||||||
|
import io.metersphere.sdk.util.SessionUtils;
|
||||||
|
import io.metersphere.system.dto.UserExtend;
|
||||||
|
import io.metersphere.system.request.ProjectAddMemberBatchRequest;
|
||||||
|
import io.metersphere.system.request.ProjectAddMemberRequest;
|
||||||
|
import io.metersphere.system.request.ProjectMemberRequest;
|
||||||
|
import io.metersphere.system.request.OrganizationProjectRequest;
|
||||||
|
import io.metersphere.system.service.OrganizationProjectLogService;
|
||||||
|
import io.metersphere.system.service.OrganizationProjectService;
|
||||||
|
import io.metersphere.validation.groups.Created;
|
||||||
|
import io.metersphere.validation.groups.Updated;
|
||||||
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import jakarta.validation.constraints.NotBlank;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.shiro.authz.annotation.Logical;
|
||||||
|
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@RestController
|
||||||
|
@Tag(name = "系统设置-组织级项目")
|
||||||
|
@RequestMapping("/organization/project")
|
||||||
|
public class OrganizationProjectController {
|
||||||
|
@Resource
|
||||||
|
private OrganizationProjectService organizationProjectService;
|
||||||
|
|
||||||
|
@PostMapping("/add")
|
||||||
|
@RequiresPermissions(PermissionConstants.ORGANIZATION_PROJECT_READ_ADD)
|
||||||
|
@Log(type = OperationLogType.ADD, expression = "#msClass.addLog(#project)", msClass = OrganizationProjectLogService.class)
|
||||||
|
@Operation(summary = "添加项目")
|
||||||
|
public Project addProject(@RequestBody @Validated({Created.class}) AddProjectRequest project) {
|
||||||
|
return organizationProjectService.add(project, SessionUtils.getUserId());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@GetMapping("/get/{id}")
|
||||||
|
@Operation(summary = "根据ID获取项目信息")
|
||||||
|
@Parameter(name = "id", description = "项目id", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED))
|
||||||
|
@RequiresPermissions(PermissionConstants.ORGANIZATION_PROJECT_READ)
|
||||||
|
public Project getProject(@PathVariable @NotBlank String id) {
|
||||||
|
return organizationProjectService.get(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/page")
|
||||||
|
@RequiresPermissions(PermissionConstants.ORGANIZATION_PROJECT_READ)
|
||||||
|
@Operation(summary = "获取项目列表")
|
||||||
|
public Pager<List<ProjectDTO>> getProjectList(@Validated @RequestBody OrganizationProjectRequest request) {
|
||||||
|
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize(),
|
||||||
|
StringUtils.isNotBlank(request.getSortString()) ? request.getSortString() : "create_time desc");
|
||||||
|
return PageUtils.setPageInfo(page, organizationProjectService.getProjectList(request));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/update")
|
||||||
|
@Log(type = OperationLogType.UPDATE, expression = "#msClass.updateLog(#project)", msClass = OrganizationProjectLogService.class)
|
||||||
|
@Operation(summary = "更新项目信息")
|
||||||
|
@RequiresPermissions(PermissionConstants.ORGANIZATION_PROJECT_READ_UPDATE)
|
||||||
|
public Project updateProject(@RequestBody @Validated({Updated.class}) UpdateProjectRequest project) {
|
||||||
|
return organizationProjectService.update(project, SessionUtils.getUserId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/delete/{id}")
|
||||||
|
@RequiresPermissions(PermissionConstants.ORGANIZATION_PROJECT_READ_DELETE)
|
||||||
|
@Operation(summary = "删除项目")
|
||||||
|
@Parameter(name = "id", description = "项目", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED))
|
||||||
|
@Log(type = OperationLogType.DELETE, expression = "#msClass.deleteLog(#id)", msClass = OrganizationProjectLogService.class)
|
||||||
|
public int deleteProject(@PathVariable String id) {
|
||||||
|
return organizationProjectService.delete(id, SessionUtils.getUserId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/revoke/{id}")
|
||||||
|
@RequiresPermissions(PermissionConstants.ORGANIZATION_PROJECT_READ_RECOVER)
|
||||||
|
@Operation(summary = "恢复项目")
|
||||||
|
@Log(type = OperationLogType.UPDATE, expression = "#msClass.recoverLog(#id)", msClass = OrganizationProjectLogService.class)
|
||||||
|
@Parameter(name = "id", description = "项目", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED))
|
||||||
|
public int revokeProject(@PathVariable String id) {
|
||||||
|
return organizationProjectService.revoke(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/member-list")
|
||||||
|
@RequiresPermissions(value = {PermissionConstants.ORGANIZATION_PROJECT_READ, PermissionConstants.SYSTEM_USER_READ}, logical = Logical.OR)
|
||||||
|
@Operation(summary = "获取项目下成员列表")
|
||||||
|
public Pager<List<UserExtend>> getProjectMember(@Validated @RequestBody ProjectMemberRequest request) {
|
||||||
|
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize(),
|
||||||
|
StringUtils.isNotBlank(request.getSortString()) ? request.getSortString() : "create_time desc");
|
||||||
|
return PageUtils.setPageInfo(page, organizationProjectService.getProjectMember(request));
|
||||||
|
}
|
||||||
|
|
||||||
|
@PostMapping("/add-members")
|
||||||
|
@RequiresPermissions(PermissionConstants.ORGANIZATION_PROJECT_READ_UPDATE)
|
||||||
|
@Operation(summary = "添加项目成员")
|
||||||
|
public void addProjectMember(@Validated @RequestBody ProjectAddMemberRequest request) {
|
||||||
|
ProjectAddMemberBatchRequest batchRequest = new ProjectAddMemberBatchRequest();
|
||||||
|
batchRequest.setProjectIds(List.of(request.getProjectId()));
|
||||||
|
batchRequest.setUserIds(request.getUserIds());
|
||||||
|
organizationProjectService.addProjectMember(batchRequest, SessionUtils.getUserId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/remove-member/{projectId}/{userId}")
|
||||||
|
@Operation(summary = "移除项目成员")
|
||||||
|
@Parameter(name = "userId", description = "用户id", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED))
|
||||||
|
@Parameter(name = "projectId", description = "项目id", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED))
|
||||||
|
@RequiresPermissions(PermissionConstants.ORGANIZATION_PROJECT_READ_UPDATE)
|
||||||
|
@Log(type = OperationLogType.DELETE, expression = "#msClass.deleteLog(#projectId)", msClass = OrganizationProjectLogService.class)
|
||||||
|
public int removeProjectMember(@PathVariable String projectId, @PathVariable String userId) {
|
||||||
|
return organizationProjectService.removeProjectMember(projectId, userId, SessionUtils.getUserId());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -4,7 +4,6 @@ package io.metersphere.system.controller;
|
||||||
import com.github.pagehelper.Page;
|
import com.github.pagehelper.Page;
|
||||||
import com.github.pagehelper.PageHelper;
|
import com.github.pagehelper.PageHelper;
|
||||||
import io.metersphere.project.domain.Project;
|
import io.metersphere.project.domain.Project;
|
||||||
import io.metersphere.sdk.constants.HttpMethodConstants;
|
|
||||||
import io.metersphere.sdk.constants.PermissionConstants;
|
import io.metersphere.sdk.constants.PermissionConstants;
|
||||||
import io.metersphere.sdk.dto.AddProjectRequest;
|
import io.metersphere.sdk.dto.AddProjectRequest;
|
||||||
import io.metersphere.sdk.dto.ProjectDTO;
|
import io.metersphere.sdk.dto.ProjectDTO;
|
||||||
|
@ -14,7 +13,6 @@ import io.metersphere.sdk.log.constants.OperationLogType;
|
||||||
import io.metersphere.sdk.util.PageUtils;
|
import io.metersphere.sdk.util.PageUtils;
|
||||||
import io.metersphere.sdk.util.Pager;
|
import io.metersphere.sdk.util.Pager;
|
||||||
import io.metersphere.sdk.util.SessionUtils;
|
import io.metersphere.sdk.util.SessionUtils;
|
||||||
import io.metersphere.sdk.util.Translator;
|
|
||||||
import io.metersphere.system.dto.UserExtend;
|
import io.metersphere.system.dto.UserExtend;
|
||||||
import io.metersphere.system.request.ProjectAddMemberBatchRequest;
|
import io.metersphere.system.request.ProjectAddMemberBatchRequest;
|
||||||
import io.metersphere.system.request.ProjectAddMemberRequest;
|
import io.metersphere.system.request.ProjectAddMemberRequest;
|
||||||
|
@ -31,6 +29,7 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import jakarta.validation.constraints.NotBlank;
|
import jakarta.validation.constraints.NotBlank;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.apache.shiro.authz.annotation.Logical;
|
||||||
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
import org.apache.shiro.authz.annotation.RequiresPermissions;
|
||||||
import org.springframework.validation.annotation.Validated;
|
import org.springframework.validation.annotation.Validated;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
@ -89,14 +88,14 @@ public class SystemProjectController {
|
||||||
|
|
||||||
@GetMapping("/revoke/{id}")
|
@GetMapping("/revoke/{id}")
|
||||||
@RequiresPermissions(PermissionConstants.SYSTEM_ORGANIZATION_PROJECT_READ_RECOVER)
|
@RequiresPermissions(PermissionConstants.SYSTEM_ORGANIZATION_PROJECT_READ_RECOVER)
|
||||||
@Log(type = OperationLogType.UPDATE, expression = "#msClass.updateLog(#id)", msClass = SystemProjectLogService.class)
|
@Log(type = OperationLogType.UPDATE, expression = "#msClass.recoverLog(#id)", msClass = SystemProjectLogService.class)
|
||||||
@Parameter(name = "id", description = "项目", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED))
|
@Parameter(name = "id", description = "项目", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED))
|
||||||
public int revokeProject(@PathVariable String id) {
|
public int revokeProject(@PathVariable String id) {
|
||||||
return systemProjectService.revoke(id);
|
return systemProjectService.revoke(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/member-list")
|
@PostMapping("/member-list")
|
||||||
@RequiresPermissions(value = {PermissionConstants.SYSTEM_ORGANIZATION_PROJECT_READ, PermissionConstants.SYSTEM_USER_READ})
|
@RequiresPermissions(value = {PermissionConstants.SYSTEM_ORGANIZATION_PROJECT_READ, PermissionConstants.SYSTEM_USER_READ}, logical = Logical.OR)
|
||||||
@Operation(summary = "获取项目下成员列表")
|
@Operation(summary = "获取项目下成员列表")
|
||||||
public Pager<List<UserExtend>> getProjectMember(@Validated @RequestBody ProjectMemberRequest request) {
|
public Pager<List<UserExtend>> getProjectMember(@Validated @RequestBody ProjectMemberRequest request) {
|
||||||
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize(),
|
Page<Object> page = PageHelper.startPage(request.getCurrent(), request.getPageSize(),
|
||||||
|
@ -111,8 +110,7 @@ public class SystemProjectController {
|
||||||
ProjectAddMemberBatchRequest batchRequest = new ProjectAddMemberBatchRequest();
|
ProjectAddMemberBatchRequest batchRequest = new ProjectAddMemberBatchRequest();
|
||||||
batchRequest.setProjectIds(List.of(request.getProjectId()));
|
batchRequest.setProjectIds(List.of(request.getProjectId()));
|
||||||
batchRequest.setUserIds(request.getUserIds());
|
batchRequest.setUserIds(request.getUserIds());
|
||||||
systemProjectService.addProjectMember(batchRequest, SessionUtils.getUserId(),"/system/project/add-member",
|
systemProjectService.addProjectMember(batchRequest, SessionUtils.getUserId());
|
||||||
OperationLogType.ADD.name(), HttpMethodConstants.POST.name(), Translator.get("add"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/remove-member/{projectId}/{userId}")
|
@GetMapping("/remove-member/{projectId}/{userId}")
|
||||||
|
@ -122,7 +120,7 @@ public class SystemProjectController {
|
||||||
@RequiresPermissions(PermissionConstants.SYSTEM_ORGANIZATION_PROJECT_READ_UPDATE)
|
@RequiresPermissions(PermissionConstants.SYSTEM_ORGANIZATION_PROJECT_READ_UPDATE)
|
||||||
@Log(type = OperationLogType.DELETE, expression = "#msClass.deleteLog(#projectId)", msClass = SystemProjectLogService.class)
|
@Log(type = OperationLogType.DELETE, expression = "#msClass.deleteLog(#projectId)", msClass = SystemProjectLogService.class)
|
||||||
public int removeProjectMember(@PathVariable String projectId, @PathVariable String userId) {
|
public int removeProjectMember(@PathVariable String projectId, @PathVariable String userId) {
|
||||||
return systemProjectService.removeProjectMember(projectId, userId);
|
return systemProjectService.removeProjectMember(projectId, userId, SessionUtils.getUserId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ import io.metersphere.project.domain.Project;
|
||||||
import io.metersphere.project.domain.ProjectExample;
|
import io.metersphere.project.domain.ProjectExample;
|
||||||
import io.metersphere.project.mapper.ProjectMapper;
|
import io.metersphere.project.mapper.ProjectMapper;
|
||||||
import io.metersphere.sdk.util.LogUtils;
|
import io.metersphere.sdk.util.LogUtils;
|
||||||
import io.metersphere.system.service.SystemProjectService;
|
import io.metersphere.system.service.CommonProjectService;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.apache.shiro.util.CollectionUtils;
|
import org.apache.shiro.util.CollectionUtils;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
@ -21,7 +21,7 @@ public class CleanProjectJob {
|
||||||
@Resource
|
@Resource
|
||||||
private ProjectMapper projectMapper;
|
private ProjectMapper projectMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private SystemProjectService systemProjectService;
|
private CommonProjectService commonProjectService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 清理状态为删除的项目 每天凌晨三点执行
|
* 清理状态为删除的项目 每天凌晨三点执行
|
||||||
|
@ -44,7 +44,7 @@ public class CleanProjectJob {
|
||||||
example.createCriteria().andDeletedEqualTo(true).andDeleteTimeLessThanOrEqualTo(timestamp);
|
example.createCriteria().andDeletedEqualTo(true).andDeleteTimeLessThanOrEqualTo(timestamp);
|
||||||
List<Project> projects = projectMapper.selectByExample(example);
|
List<Project> projects = projectMapper.selectByExample(example);
|
||||||
if (!CollectionUtils.isEmpty(projects)) {
|
if (!CollectionUtils.isEmpty(projects)) {
|
||||||
systemProjectService.deleteProject(projects);
|
commonProjectService.deleteProject(projects);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,21 +0,0 @@
|
||||||
package io.metersphere.system.job;
|
|
||||||
|
|
||||||
import com.fit2cloud.quartz.anno.QuartzScheduled;
|
|
||||||
import io.metersphere.sdk.dto.LicenseDTO;
|
|
||||||
import io.metersphere.sdk.service.LicenseService;
|
|
||||||
import io.metersphere.sdk.util.CommonBeanFactory;
|
|
||||||
import io.metersphere.sdk.util.LogUtils;
|
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
|
|
||||||
@Component
|
|
||||||
public class LicenseCacheJob {
|
|
||||||
|
|
||||||
@QuartzScheduled(cron = "0 5 0 * * ?")
|
|
||||||
public void checkLicenseTask() {
|
|
||||||
LicenseService licenseService = CommonBeanFactory.getBean(LicenseService.class);
|
|
||||||
if (licenseService != null) {
|
|
||||||
LicenseDTO dto = licenseService.refreshLicense();
|
|
||||||
LogUtils.info("刷新LICENSE状态: " + dto.getStatus());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
package io.metersphere.system.request;
|
||||||
|
|
||||||
|
import io.metersphere.sdk.dto.BasePageRequest;
|
||||||
|
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 OrganizationProjectRequest extends BasePageRequest {
|
||||||
|
@Schema(title = "组织id", requiredMode = Schema.RequiredMode.REQUIRED)
|
||||||
|
@NotBlank(message = "{project.organization_id.not_blank}")
|
||||||
|
@Size(min = 1, max = 50, message = "{project.organization_id.length_range}")
|
||||||
|
private String organizationId;
|
||||||
|
@Schema(title = "项目ID")
|
||||||
|
private String projectId;
|
||||||
|
}
|
|
@ -0,0 +1,404 @@
|
||||||
|
package io.metersphere.system.service;
|
||||||
|
|
||||||
|
import io.metersphere.project.domain.Project;
|
||||||
|
import io.metersphere.project.domain.ProjectExample;
|
||||||
|
import io.metersphere.project.mapper.ProjectMapper;
|
||||||
|
import io.metersphere.sdk.constants.HttpMethodConstants;
|
||||||
|
import io.metersphere.sdk.constants.InternalUserRole;
|
||||||
|
import io.metersphere.sdk.constants.OperationLogConstants;
|
||||||
|
import io.metersphere.sdk.constants.UserRoleType;
|
||||||
|
import io.metersphere.sdk.dto.AddProjectRequest;
|
||||||
|
import io.metersphere.sdk.dto.LogDTO;
|
||||||
|
import io.metersphere.sdk.dto.ProjectDTO;
|
||||||
|
import io.metersphere.sdk.dto.UpdateProjectRequest;
|
||||||
|
import io.metersphere.sdk.exception.MSException;
|
||||||
|
import io.metersphere.sdk.invoker.ProjectServiceInvoker;
|
||||||
|
import io.metersphere.sdk.log.constants.OperationLogModule;
|
||||||
|
import io.metersphere.sdk.log.constants.OperationLogType;
|
||||||
|
import io.metersphere.sdk.log.service.OperationLogService;
|
||||||
|
import io.metersphere.sdk.util.JSON;
|
||||||
|
import io.metersphere.sdk.util.LogUtils;
|
||||||
|
import io.metersphere.sdk.util.Translator;
|
||||||
|
import io.metersphere.system.domain.*;
|
||||||
|
import io.metersphere.system.mapper.*;
|
||||||
|
import io.metersphere.system.request.ProjectAddMemberBatchRequest;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.apache.commons.collections.CollectionUtils;
|
||||||
|
import org.apache.commons.lang3.ObjectUtils;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public class CommonProjectService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ProjectMapper projectMapper;
|
||||||
|
@Resource
|
||||||
|
private UserMapper userMapper;
|
||||||
|
@Resource
|
||||||
|
private UserRoleRelationMapper userRoleRelationMapper;
|
||||||
|
@Resource
|
||||||
|
private ExtSystemProjectMapper extSystemProjectMapper;
|
||||||
|
@Resource
|
||||||
|
private OperationLogService operationLogService;
|
||||||
|
@Resource
|
||||||
|
private UserRoleMapper userRoleMapper;
|
||||||
|
@Resource
|
||||||
|
private UserRolePermissionMapper userRolePermissionMapper;
|
||||||
|
private final ProjectServiceInvoker serviceInvoker;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
public CommonProjectService(ProjectServiceInvoker serviceInvoker) {
|
||||||
|
this.serviceInvoker = serviceInvoker;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project get(String id) {
|
||||||
|
return projectMapper.selectByPrimaryKey(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param addProjectDTO 添加项目的时候 默认给用户组添加管理员的权限
|
||||||
|
* @param createUser
|
||||||
|
* @param path 请求路径
|
||||||
|
* @param module 日志记录模块
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Project add(AddProjectRequest addProjectDTO, String createUser, String path, String module) {
|
||||||
|
|
||||||
|
Project project = new Project();
|
||||||
|
project.setId(UUID.randomUUID().toString());
|
||||||
|
project.setName(addProjectDTO.getName());
|
||||||
|
project.setOrganizationId(addProjectDTO.getOrganizationId());
|
||||||
|
checkProjectExistByName(project);
|
||||||
|
project.setCreateTime(System.currentTimeMillis());
|
||||||
|
project.setUpdateTime(System.currentTimeMillis());
|
||||||
|
project.setUpdateUser(createUser);
|
||||||
|
project.setCreateUser(createUser);
|
||||||
|
project.setEnable(addProjectDTO.getEnable());
|
||||||
|
project.setDescription(addProjectDTO.getDescription());
|
||||||
|
addProjectDTO.setId(project.getId());
|
||||||
|
projectMapper.insertSelective(project);
|
||||||
|
ProjectAddMemberBatchRequest memberRequest = new ProjectAddMemberBatchRequest();
|
||||||
|
memberRequest.setProjectIds(List.of(project.getId()));
|
||||||
|
if (CollectionUtils.isEmpty(addProjectDTO.getUserIds())) {
|
||||||
|
memberRequest.setUserIds(List.of(createUser));
|
||||||
|
} else {
|
||||||
|
memberRequest.setUserIds(addProjectDTO.getUserIds());
|
||||||
|
}
|
||||||
|
//添加项目管理员 创建的时候如果没有传管理员id 则默认创建者为管理员
|
||||||
|
this.addProjectAdmin(memberRequest, createUser, path,
|
||||||
|
OperationLogType.ADD.name(), HttpMethodConstants.POST.name(), Translator.get("add"), module);
|
||||||
|
return project;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查添加的人员是否存在组织中
|
||||||
|
*
|
||||||
|
* @param
|
||||||
|
*/
|
||||||
|
public void checkOrgRoleExit(String userId, String orgId, String createUser, String userName, String path, String module) {
|
||||||
|
List<LogDTO> logDTOList = new ArrayList<>();
|
||||||
|
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
||||||
|
userRoleRelationExample.createCriteria().andUserIdEqualTo(userId).andSourceIdEqualTo(orgId);
|
||||||
|
if (userRoleRelationMapper.selectByExample(userRoleRelationExample).size() == 0) {
|
||||||
|
UserRoleRelation memberRole = new UserRoleRelation();
|
||||||
|
memberRole.setId(UUID.randomUUID().toString());
|
||||||
|
memberRole.setUserId(userId);
|
||||||
|
memberRole.setRoleId(InternalUserRole.ORG_MEMBER.getValue());
|
||||||
|
memberRole.setSourceId(orgId);
|
||||||
|
memberRole.setCreateTime(System.currentTimeMillis());
|
||||||
|
memberRole.setCreateUser(createUser);
|
||||||
|
userRoleRelationMapper.insert(memberRole);
|
||||||
|
LogDTO logDTO = new LogDTO(orgId, orgId,memberRole.getId(), createUser, OperationLogType.ADD.name(), module,Translator.get("add") + Translator.get("organization_member") + ": " + userName);
|
||||||
|
setLog(logDTO, path, HttpMethodConstants.POST.name(), logDTOList);
|
||||||
|
}
|
||||||
|
operationLogService.batchAdd(logDTOList);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void checkProjectExistByName(Project project) {
|
||||||
|
ProjectExample example = new ProjectExample();
|
||||||
|
example.createCriteria().andNameEqualTo(project.getName()).andOrganizationIdEqualTo(project.getOrganizationId());
|
||||||
|
if (projectMapper.selectByExample(example).size() > 0) {
|
||||||
|
throw new MSException(Translator.get("project_name_already_exists"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查项目是否存在
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
public void checkProjectNotExist(String id) {
|
||||||
|
if (projectMapper.selectByPrimaryKey(id) == null) {
|
||||||
|
throw new MSException(Translator.get("project_is_not_exist"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ProjectDTO> buildUserInfo(List<ProjectDTO> projectList) {
|
||||||
|
projectList.forEach(projectDTO -> {
|
||||||
|
List<User> users = extSystemProjectMapper.getProjectAdminList(projectDTO.getId());
|
||||||
|
projectDTO.setAdminList(users);
|
||||||
|
});
|
||||||
|
return projectList;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project update(UpdateProjectRequest updateProjectDto, String updateUser, String path, String module) {
|
||||||
|
Project project = new Project();
|
||||||
|
project.setId(updateProjectDto.getId());
|
||||||
|
project.setName(updateProjectDto.getName());
|
||||||
|
project.setDescription(updateProjectDto.getDescription());
|
||||||
|
project.setOrganizationId(updateProjectDto.getOrganizationId());
|
||||||
|
project.setEnable(updateProjectDto.getEnable());
|
||||||
|
project.setUpdateUser(updateUser);
|
||||||
|
project.setCreateUser(null);
|
||||||
|
project.setCreateTime(null);
|
||||||
|
project.setUpdateTime(System.currentTimeMillis());
|
||||||
|
checkProjectExistByName(project);
|
||||||
|
checkProjectNotExist(project.getId());
|
||||||
|
UserRoleRelationExample example = new UserRoleRelationExample();
|
||||||
|
example.createCriteria().andSourceIdEqualTo(project.getId()).andRoleIdEqualTo(InternalUserRole.PROJECT_ADMIN.getValue());
|
||||||
|
List<UserRoleRelation> userRoleRelations = userRoleRelationMapper.selectByExample(example);
|
||||||
|
List<String> orgUserIds = userRoleRelations.stream().map(UserRoleRelation::getUserId).toList();
|
||||||
|
List<LogDTO> logDTOList = new ArrayList<>();
|
||||||
|
if (CollectionUtils.isNotEmpty(updateProjectDto.getUserIds())) {
|
||||||
|
//updateProjectDto.getUserIds() 为前端传过来的用户id 与数据库中的用户id做对比 如果数据库中的用户id不在前端传过来的用户id中 则删除
|
||||||
|
List<String> deleteIds = orgUserIds.stream()
|
||||||
|
.filter(item -> !updateProjectDto.getUserIds().contains(item))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
List<String> insertIds = updateProjectDto.getUserIds().stream()
|
||||||
|
.filter(item -> !orgUserIds.contains(item))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
if (CollectionUtils.isNotEmpty(deleteIds)) {
|
||||||
|
UserRoleRelationExample deleteExample = new UserRoleRelationExample();
|
||||||
|
deleteExample.createCriteria().andSourceIdEqualTo(project.getId()).andUserIdIn(deleteIds).andRoleIdEqualTo(InternalUserRole.PROJECT_ADMIN.getValue());
|
||||||
|
userRoleRelationMapper.selectByExample(deleteExample).forEach(userRoleRelation -> {
|
||||||
|
User user = userMapper.selectByPrimaryKey(userRoleRelation.getUserId());
|
||||||
|
LogDTO logDTO = new LogDTO(project.getId(), project.getOrganizationId(),userRoleRelation.getId(), updateUser, OperationLogType.DELETE.name(), module,Translator.get("delete") + Translator.get("project_admin") + ": " + user.getName());
|
||||||
|
setLog(logDTO, path, HttpMethodConstants.POST.name(), logDTOList);
|
||||||
|
});
|
||||||
|
userRoleRelationMapper.deleteByExample(deleteExample);
|
||||||
|
}
|
||||||
|
if (CollectionUtils.isNotEmpty(insertIds)) {
|
||||||
|
ProjectAddMemberBatchRequest memberRequest = new ProjectAddMemberBatchRequest();
|
||||||
|
memberRequest.setProjectIds(List.of(project.getId()));
|
||||||
|
memberRequest.setUserIds(insertIds);
|
||||||
|
this.addProjectAdmin(memberRequest, updateUser, path, OperationLogType.UPDATE.name(),
|
||||||
|
HttpMethodConstants.POST.name(), Translator.get("update"), module);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (CollectionUtils.isNotEmpty(orgUserIds)) {
|
||||||
|
//如果前端传过来的用户id为空 则删除项目所有管理员
|
||||||
|
UserRoleRelationExample deleteExample = new UserRoleRelationExample();
|
||||||
|
deleteExample.createCriteria().andSourceIdEqualTo(project.getId()).andUserIdIn(orgUserIds).andRoleIdEqualTo(InternalUserRole.PROJECT_ADMIN.getValue());
|
||||||
|
userRoleRelationMapper.selectByExample(deleteExample).forEach(userRoleRelation -> {
|
||||||
|
User user = userMapper.selectByPrimaryKey(userRoleRelation.getUserId());
|
||||||
|
LogDTO logDTO = new LogDTO(project.getId(), project.getOrganizationId(),userRoleRelation.getId(), updateUser, OperationLogType.DELETE.name(), module,Translator.get("delete") + Translator.get("project_admin") + ": " + user.getName());
|
||||||
|
setLog(logDTO, path, HttpMethodConstants.POST.name() ,logDTOList);
|
||||||
|
});
|
||||||
|
userRoleRelationMapper.deleteByExample(deleteExample);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (CollectionUtils.isNotEmpty(logDTOList)) {
|
||||||
|
operationLogService.batchAdd(logDTOList);
|
||||||
|
}
|
||||||
|
|
||||||
|
projectMapper.updateByPrimaryKeySelective(project);
|
||||||
|
return project;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int delete(String id, String deleteUser) {
|
||||||
|
//TODO 删除项目删除全部资源 这里的删除只是假删除
|
||||||
|
checkProjectNotExist(id);
|
||||||
|
Project project = new Project();
|
||||||
|
project.setId(id);
|
||||||
|
project.setDeleteUser(deleteUser);
|
||||||
|
project.setDeleted(true);
|
||||||
|
project.setDeleteTime(System.currentTimeMillis());
|
||||||
|
return projectMapper.updateByPrimaryKeySelective(project);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加项目管理员
|
||||||
|
* @param request
|
||||||
|
* @param createUser 创建人
|
||||||
|
* @param path 请求路径
|
||||||
|
* @param type 操作类型
|
||||||
|
* @param method 请求方法
|
||||||
|
* @param content 操作内容
|
||||||
|
* @param module 日志记录模块
|
||||||
|
*/
|
||||||
|
public void addProjectAdmin(ProjectAddMemberBatchRequest request, String createUser, String path, String type,
|
||||||
|
String method, String content, String module) {
|
||||||
|
|
||||||
|
List<LogDTO> logDTOList = new ArrayList<>();
|
||||||
|
List<UserRoleRelation> userRoleRelations = new ArrayList<>();
|
||||||
|
request.getProjectIds().forEach(projectId -> {
|
||||||
|
checkProjectNotExist(projectId);
|
||||||
|
//判断传过来的用户id是否在组织下,如果不存在,给用户创建一个组织成员的身份
|
||||||
|
request.getUserIds().forEach(userId -> {
|
||||||
|
User user = userMapper.selectByPrimaryKey(userId);
|
||||||
|
if (ObjectUtils.isEmpty(user)) {
|
||||||
|
throw new MSException(Translator.get("user_not_exist"));
|
||||||
|
}
|
||||||
|
Project project = projectMapper.selectByPrimaryKey(projectId);
|
||||||
|
this.checkOrgRoleExit(userId, project.getOrganizationId(), createUser, user.getName(), path, module);
|
||||||
|
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
||||||
|
userRoleRelationExample.createCriteria().andUserIdEqualTo(userId)
|
||||||
|
.andSourceIdEqualTo(projectId).andRoleIdEqualTo(InternalUserRole.PROJECT_MEMBER.getValue());
|
||||||
|
if (userRoleRelationMapper.selectByExample(userRoleRelationExample).size() == 0) {
|
||||||
|
UserRoleRelation adminRole = new UserRoleRelation();
|
||||||
|
adminRole.setId(UUID.randomUUID().toString());
|
||||||
|
adminRole.setUserId(userId);
|
||||||
|
adminRole.setRoleId(InternalUserRole.PROJECT_ADMIN.getValue());
|
||||||
|
adminRole.setSourceId(projectId);
|
||||||
|
adminRole.setCreateTime(System.currentTimeMillis());
|
||||||
|
adminRole.setCreateUser(createUser);
|
||||||
|
userRoleRelations.add(adminRole);
|
||||||
|
LogDTO logDTO = new LogDTO(projectId, project.getOrganizationId(), adminRole.getId(), createUser, type, module, content + Translator.get("project_admin") + ": " + user.getName());
|
||||||
|
setLog(logDTO, path, HttpMethodConstants.POST.name(), logDTOList);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
userRoleRelationMapper.batchInsert(userRoleRelations);
|
||||||
|
operationLogService.batchAdd(logDTOList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加项目成员
|
||||||
|
* @param request
|
||||||
|
* @param createUser 创建人
|
||||||
|
* @param path 请求路径
|
||||||
|
* @param type 操作类型
|
||||||
|
* @param method 请求方法
|
||||||
|
* @param content 操作内容
|
||||||
|
* @param module 日志记录模块
|
||||||
|
*/
|
||||||
|
public void addProjectMember(ProjectAddMemberBatchRequest request, String createUser, String path, String type,
|
||||||
|
String method, String content, String module) {
|
||||||
|
|
||||||
|
List<LogDTO> logDTOList = new ArrayList<>();
|
||||||
|
List<UserRoleRelation> userRoleRelations = new ArrayList<>();
|
||||||
|
request.getProjectIds().forEach(projectId -> {
|
||||||
|
checkProjectNotExist(projectId);
|
||||||
|
request.getUserIds().forEach(userId -> {
|
||||||
|
User user = userMapper.selectByPrimaryKey(userId);
|
||||||
|
if (ObjectUtils.isEmpty(user)) {
|
||||||
|
throw new MSException(Translator.get("user_not_exist"));
|
||||||
|
}
|
||||||
|
Project project = projectMapper.selectByPrimaryKey(projectId);
|
||||||
|
this.checkOrgRoleExit(userId, project.getOrganizationId(), createUser, user.getName(), path, module);
|
||||||
|
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
||||||
|
userRoleRelationExample.createCriteria().andUserIdEqualTo(userId)
|
||||||
|
.andSourceIdEqualTo(projectId);
|
||||||
|
if (userRoleRelationMapper.selectByExample(userRoleRelationExample).size() == 0) {
|
||||||
|
UserRoleRelation memberRole = new UserRoleRelation();
|
||||||
|
memberRole.setId(UUID.randomUUID().toString());
|
||||||
|
memberRole.setUserId(userId);
|
||||||
|
memberRole.setRoleId(InternalUserRole.PROJECT_MEMBER.getValue());
|
||||||
|
memberRole.setSourceId(projectId);
|
||||||
|
memberRole.setCreateTime(System.currentTimeMillis());
|
||||||
|
memberRole.setCreateUser(createUser);
|
||||||
|
userRoleRelations.add(memberRole);
|
||||||
|
LogDTO logDTO = new LogDTO(projectId, project.getOrganizationId(),memberRole.getId(), createUser, type, module, content + Translator.get("project_member") + ": " + user.getName());
|
||||||
|
setLog(logDTO , path, HttpMethodConstants.POST.name(), logDTOList);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
userRoleRelationMapper.batchInsert(userRoleRelations);
|
||||||
|
operationLogService.batchAdd(logDTOList);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int removeProjectMember(String projectId, String userId,String createUser, String module, String path) {
|
||||||
|
checkProjectNotExist(projectId);
|
||||||
|
User user = userMapper.selectByPrimaryKey(userId);
|
||||||
|
if (user == null) {
|
||||||
|
throw new MSException(Translator.get("user_not_exist"));
|
||||||
|
}
|
||||||
|
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
||||||
|
userRoleRelationExample.createCriteria().andUserIdEqualTo(userId)
|
||||||
|
.andSourceIdEqualTo(projectId);
|
||||||
|
if (StringUtils.equals(projectId, user.getLastProjectId())) {
|
||||||
|
user.setLastProjectId(StringUtils.EMPTY);
|
||||||
|
userMapper.updateByPrimaryKeySelective(user);
|
||||||
|
}
|
||||||
|
List<LogDTO> logDTOList = new ArrayList<>();
|
||||||
|
userRoleRelationMapper.selectByExample(userRoleRelationExample).forEach(userRoleRelation -> {
|
||||||
|
LogDTO logDTO = new LogDTO(projectId, projectMapper.selectByPrimaryKey(projectId).getOrganizationId(),userRoleRelation.getId(), createUser, OperationLogType.DELETE.name(), module,Translator.get("delete") + Translator.get("project_member") + ": " + user.getName());
|
||||||
|
setLog(logDTO,path,HttpMethodConstants.GET.name(), logDTOList);
|
||||||
|
});
|
||||||
|
operationLogService.batchAdd(logDTOList);
|
||||||
|
return userRoleRelationMapper.deleteByExample(userRoleRelationExample);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int revoke(String id) {
|
||||||
|
checkProjectNotExist(id);
|
||||||
|
Project project = new Project();
|
||||||
|
project.setId(id);
|
||||||
|
project.setDeleted(false);
|
||||||
|
project.setDeleteTime(null);
|
||||||
|
project.setDeleteUser(null);
|
||||||
|
return projectMapper.updateByPrimaryKeySelective(project);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除项目 一般是定时任务会触发
|
||||||
|
* @param projects
|
||||||
|
*/
|
||||||
|
public void deleteProject(List<Project> projects) {
|
||||||
|
// 删除项目
|
||||||
|
List<LogDTO> logDTOList = new ArrayList<>();
|
||||||
|
projects.forEach(project -> {
|
||||||
|
serviceInvoker.invokeServices(project.getId());
|
||||||
|
LogUtils.info("send delete_project message, project id: " + project.getId());
|
||||||
|
|
||||||
|
deleteProjectUserGroup(project.getId());
|
||||||
|
// delete project
|
||||||
|
projectMapper.deleteByPrimaryKey(project.getId());
|
||||||
|
LogDTO logDTO = new LogDTO(OperationLogConstants.SYSTEM, project.getOrganizationId(),project.getId(), StringUtils.EMPTY, OperationLogType.DELETE.name(), OperationLogModule.SYSTEM_PROJECT,Translator.get("delete") + Translator.get("project") + ": " + project.getName());
|
||||||
|
setLog(logDTO, StringUtils.EMPTY,StringUtils.EMPTY, logDTOList);
|
||||||
|
});
|
||||||
|
operationLogService.batchAdd(logDTOList);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除自定义用户组和权限关系表、项目和用户关系数据
|
||||||
|
* @param projectId
|
||||||
|
*/
|
||||||
|
private void deleteProjectUserGroup(String projectId) {
|
||||||
|
UserRoleRelationExample userGroupExample = new UserRoleRelationExample();
|
||||||
|
userGroupExample.createCriteria().andSourceIdEqualTo(projectId);
|
||||||
|
userRoleRelationMapper.deleteByExample(userGroupExample);
|
||||||
|
UserRoleExample userRoleExample = new UserRoleExample();
|
||||||
|
userRoleExample.createCriteria().andScopeIdEqualTo(projectId).andTypeEqualTo(UserRoleType.PROJECT.name());
|
||||||
|
List<UserRole> roles = userRoleMapper.selectByExample(userRoleExample);
|
||||||
|
if (CollectionUtils.isNotEmpty(roles)) {
|
||||||
|
List<String> roleIds = roles.stream().map(UserRole::getId).collect(Collectors.toList());
|
||||||
|
UserRolePermissionExample userRolePermissionExample = new UserRolePermissionExample();
|
||||||
|
userRolePermissionExample.createCriteria().andRoleIdIn(roleIds);
|
||||||
|
userRolePermissionMapper.deleteByExample(userRolePermissionExample);
|
||||||
|
userRoleMapper.deleteByExample(userRoleExample);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param path 请求路径
|
||||||
|
* @param method 请求方法
|
||||||
|
* @param logDTOList 日志集合
|
||||||
|
*/
|
||||||
|
private void setLog(LogDTO dto, String path, String method, List<LogDTO> logDTOList) {
|
||||||
|
dto.setPath(path);
|
||||||
|
dto.setMethod(method);
|
||||||
|
dto.setOriginalValue(JSON.toJSONBytes(StringUtils.EMPTY));
|
||||||
|
logDTOList.add(dto);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,109 @@
|
||||||
|
package io.metersphere.system.service;
|
||||||
|
|
||||||
|
import io.metersphere.project.domain.Project;
|
||||||
|
import io.metersphere.project.mapper.ProjectMapper;
|
||||||
|
import io.metersphere.sdk.dto.AddProjectRequest;
|
||||||
|
import io.metersphere.sdk.dto.LogDTO;
|
||||||
|
import io.metersphere.sdk.dto.UpdateProjectRequest;
|
||||||
|
import io.metersphere.sdk.log.constants.OperationLogModule;
|
||||||
|
import io.metersphere.sdk.log.constants.OperationLogType;
|
||||||
|
import io.metersphere.sdk.util.JSON;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public class OrganizationProjectLogService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ProjectMapper projectMapper;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 添加接口日志
|
||||||
|
*
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public LogDTO addLog(AddProjectRequest project) {
|
||||||
|
LogDTO dto = new LogDTO(
|
||||||
|
project.getId(),
|
||||||
|
project.getOrganizationId(),
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
OperationLogType.ADD.name(),
|
||||||
|
OperationLogModule.ORGANIZATION_PROJECT,
|
||||||
|
project.getName());
|
||||||
|
|
||||||
|
dto.setOriginalValue(JSON.toJSONBytes(project));
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param request
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public LogDTO updateLog(UpdateProjectRequest request) {
|
||||||
|
Project project = projectMapper.selectByPrimaryKey(request.getId());
|
||||||
|
if (project != null) {
|
||||||
|
LogDTO dto = new LogDTO(
|
||||||
|
project.getId(),
|
||||||
|
project.getOrganizationId(),
|
||||||
|
project.getId(),
|
||||||
|
project.getCreateUser(),
|
||||||
|
OperationLogType.UPDATE.name(),
|
||||||
|
OperationLogModule.ORGANIZATION_PROJECT,
|
||||||
|
project.getName());
|
||||||
|
|
||||||
|
dto.setOriginalValue(JSON.toJSONBytes(project));
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除接口日志
|
||||||
|
*
|
||||||
|
* @param id
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public LogDTO deleteLog(String id) {
|
||||||
|
Project project = projectMapper.selectByPrimaryKey(id);
|
||||||
|
if (project != null) {
|
||||||
|
LogDTO dto = new LogDTO(
|
||||||
|
project.getId(),
|
||||||
|
project.getOrganizationId(),
|
||||||
|
id,
|
||||||
|
project.getCreateUser(),
|
||||||
|
OperationLogType.DELETE.name(),
|
||||||
|
OperationLogModule.ORGANIZATION_PROJECT,
|
||||||
|
project.getName());
|
||||||
|
|
||||||
|
dto.setOriginalValue(JSON.toJSONBytes(project));
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 恢复项目
|
||||||
|
* @param id 接口请求参数
|
||||||
|
* @return 日志详情
|
||||||
|
*/
|
||||||
|
public LogDTO recoverLog(String id) {
|
||||||
|
Project project = projectMapper.selectByPrimaryKey(id);
|
||||||
|
if (project != null) {
|
||||||
|
LogDTO dto = new LogDTO(
|
||||||
|
project.getId(),
|
||||||
|
project.getOrganizationId(),
|
||||||
|
id,
|
||||||
|
null,
|
||||||
|
OperationLogType.RECOVER.name(),
|
||||||
|
OperationLogModule.ORGANIZATION_PROJECT,
|
||||||
|
project.getName());
|
||||||
|
dto.setOriginalValue(JSON.toJSONBytes(project));
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,97 @@
|
||||||
|
package io.metersphere.system.service;
|
||||||
|
|
||||||
|
import io.metersphere.project.domain.Project;
|
||||||
|
import io.metersphere.project.mapper.ProjectMapper;
|
||||||
|
import io.metersphere.sdk.constants.HttpMethodConstants;
|
||||||
|
import io.metersphere.sdk.dto.AddProjectRequest;
|
||||||
|
import io.metersphere.sdk.dto.ProjectDTO;
|
||||||
|
import io.metersphere.sdk.dto.UpdateProjectRequest;
|
||||||
|
import io.metersphere.sdk.log.constants.OperationLogModule;
|
||||||
|
import io.metersphere.sdk.log.constants.OperationLogType;
|
||||||
|
import io.metersphere.sdk.util.BeanUtils;
|
||||||
|
import io.metersphere.sdk.util.Translator;
|
||||||
|
import io.metersphere.system.dto.UserExtend;
|
||||||
|
import io.metersphere.system.mapper.ExtSystemProjectMapper;
|
||||||
|
import io.metersphere.system.request.OrganizationProjectRequest;
|
||||||
|
import io.metersphere.system.request.ProjectAddMemberBatchRequest;
|
||||||
|
import io.metersphere.system.request.ProjectMemberRequest;
|
||||||
|
import io.metersphere.system.request.ProjectRequest;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
public class OrganizationProjectService {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ProjectMapper projectMapper;
|
||||||
|
@Resource
|
||||||
|
private ExtSystemProjectMapper extSystemProjectMapper;
|
||||||
|
@Resource
|
||||||
|
private CommonProjectService commonProjectService;
|
||||||
|
|
||||||
|
|
||||||
|
private final static String PREFIX = "/organization-project";
|
||||||
|
private final static String ADD_PROJECT = PREFIX + "/add";
|
||||||
|
private final static String UPDATE_PROJECT = PREFIX + "/update";
|
||||||
|
private final static String REMOVE_PROJECT_MEMBER = PREFIX + "/remove-member/";
|
||||||
|
private final static String ADD_MEMBER = PREFIX + "/add-member";
|
||||||
|
|
||||||
|
public Project get(String id) {
|
||||||
|
return projectMapper.selectByPrimaryKey(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param addProjectDTO 添加项目的时候 默认给用户组添加管理员的权限
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public Project add(AddProjectRequest addProjectDTO, String createUser) {
|
||||||
|
Project project = commonProjectService.add(addProjectDTO, createUser, ADD_PROJECT, OperationLogModule.SYSTEM_PROJECT);
|
||||||
|
return project;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<ProjectDTO> getProjectList(OrganizationProjectRequest request) {
|
||||||
|
ProjectRequest projectRequest = new ProjectRequest();
|
||||||
|
BeanUtils.copyBean(projectRequest, request);
|
||||||
|
List<ProjectDTO> projectList = extSystemProjectMapper.getProjectList(projectRequest);
|
||||||
|
return commonProjectService.buildUserInfo(projectList);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Project update(UpdateProjectRequest updateProjectDto, String updateUser) {
|
||||||
|
Project project = commonProjectService.update(updateProjectDto, updateUser, UPDATE_PROJECT, OperationLogModule.SYSTEM_PROJECT);
|
||||||
|
return project;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int delete(String id, String deleteUser) {
|
||||||
|
return commonProjectService.delete(id, deleteUser);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<UserExtend> getProjectMember(ProjectMemberRequest request) {
|
||||||
|
commonProjectService.checkProjectNotExist(request.getProjectId());
|
||||||
|
List<UserExtend> projectMemberList = extSystemProjectMapper.getProjectMemberList(request);
|
||||||
|
return projectMemberList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***
|
||||||
|
* 添加项目成员
|
||||||
|
* @param request
|
||||||
|
* @param createUser
|
||||||
|
*/
|
||||||
|
public void addProjectMember(ProjectAddMemberBatchRequest request, String createUser) {
|
||||||
|
commonProjectService.addProjectMember(request, createUser, ADD_MEMBER,
|
||||||
|
OperationLogType.ADD.name(), HttpMethodConstants.POST.name(), Translator.get("add"), OperationLogModule.SYSTEM_PROJECT);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int removeProjectMember(String projectId, String userId, String createUser) {
|
||||||
|
return commonProjectService.removeProjectMember(projectId, userId, createUser,OperationLogModule.SYSTEM_PROJECT, StringUtils.join(REMOVE_PROJECT_MEMBER,projectId, "/", userId));
|
||||||
|
}
|
||||||
|
|
||||||
|
public int revoke(String id) {
|
||||||
|
return commonProjectService.revoke(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -2,7 +2,6 @@ package io.metersphere.system.service;
|
||||||
|
|
||||||
import io.metersphere.project.domain.Project;
|
import io.metersphere.project.domain.Project;
|
||||||
import io.metersphere.project.mapper.ProjectMapper;
|
import io.metersphere.project.mapper.ProjectMapper;
|
||||||
import io.metersphere.sdk.constants.OperationLogConstants;
|
|
||||||
import io.metersphere.sdk.dto.AddProjectRequest;
|
import io.metersphere.sdk.dto.AddProjectRequest;
|
||||||
import io.metersphere.sdk.dto.LogDTO;
|
import io.metersphere.sdk.dto.LogDTO;
|
||||||
import io.metersphere.sdk.dto.UpdateProjectRequest;
|
import io.metersphere.sdk.dto.UpdateProjectRequest;
|
||||||
|
@ -27,8 +26,8 @@ public class SystemProjectLogService {
|
||||||
*/
|
*/
|
||||||
public LogDTO addLog(AddProjectRequest project) {
|
public LogDTO addLog(AddProjectRequest project) {
|
||||||
LogDTO dto = new LogDTO(
|
LogDTO dto = new LogDTO(
|
||||||
OperationLogConstants.SYSTEM,
|
project.getId(),
|
||||||
OperationLogConstants.SYSTEM,
|
project.getOrganizationId(),
|
||||||
null,
|
null,
|
||||||
null,
|
null,
|
||||||
OperationLogType.ADD.name(),
|
OperationLogType.ADD.name(),
|
||||||
|
@ -47,31 +46,13 @@ public class SystemProjectLogService {
|
||||||
Project project = projectMapper.selectByPrimaryKey(request.getId());
|
Project project = projectMapper.selectByPrimaryKey(request.getId());
|
||||||
if (project != null) {
|
if (project != null) {
|
||||||
LogDTO dto = new LogDTO(
|
LogDTO dto = new LogDTO(
|
||||||
OperationLogConstants.SYSTEM,
|
project.getId(),
|
||||||
OperationLogConstants.SYSTEM,
|
project.getOrganizationId(),
|
||||||
project.getId(),
|
project.getId(),
|
||||||
project.getCreateUser(),
|
project.getCreateUser(),
|
||||||
OperationLogType.UPDATE.name(),
|
OperationLogType.UPDATE.name(),
|
||||||
OperationLogModule.SYSTEM_PROJECT,
|
OperationLogModule.SYSTEM_PROJECT,
|
||||||
"编辑全局用户组对应的权限配置");
|
project.getName());
|
||||||
|
|
||||||
dto.setOriginalValue(JSON.toJSONBytes(project));
|
|
||||||
return dto;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LogDTO updateLog(String id) {
|
|
||||||
Project project = projectMapper.selectByPrimaryKey(id);
|
|
||||||
if (project != null) {
|
|
||||||
LogDTO dto = new LogDTO(
|
|
||||||
OperationLogConstants.SYSTEM,
|
|
||||||
OperationLogConstants.SYSTEM,
|
|
||||||
project.getId(),
|
|
||||||
project.getCreateUser(),
|
|
||||||
OperationLogType.RECOVER.name(),
|
|
||||||
OperationLogModule.SYSTEM_PROJECT,
|
|
||||||
"编辑全局用户组对应的权限配置");
|
|
||||||
|
|
||||||
dto.setOriginalValue(JSON.toJSONBytes(project));
|
dto.setOriginalValue(JSON.toJSONBytes(project));
|
||||||
return dto;
|
return dto;
|
||||||
|
@ -90,8 +71,8 @@ public class SystemProjectLogService {
|
||||||
Project project = projectMapper.selectByPrimaryKey(id);
|
Project project = projectMapper.selectByPrimaryKey(id);
|
||||||
if (project != null) {
|
if (project != null) {
|
||||||
LogDTO dto = new LogDTO(
|
LogDTO dto = new LogDTO(
|
||||||
OperationLogConstants.SYSTEM,
|
project.getId(),
|
||||||
OperationLogConstants.SYSTEM,
|
project.getOrganizationId(),
|
||||||
id,
|
id,
|
||||||
project.getCreateUser(),
|
project.getCreateUser(),
|
||||||
OperationLogType.DELETE.name(),
|
OperationLogType.DELETE.name(),
|
||||||
|
@ -103,4 +84,26 @@ public class SystemProjectLogService {
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 恢复项目
|
||||||
|
* @param id 接口请求参数
|
||||||
|
* @return 日志详情
|
||||||
|
*/
|
||||||
|
public LogDTO recoverLog(String id) {
|
||||||
|
Project project = projectMapper.selectByPrimaryKey(id);
|
||||||
|
if (project != null) {
|
||||||
|
LogDTO dto = new LogDTO(
|
||||||
|
project.getId(),
|
||||||
|
project.getOrganizationId(),
|
||||||
|
id,
|
||||||
|
null,
|
||||||
|
OperationLogType.RECOVER.name(),
|
||||||
|
OperationLogModule.SYSTEM_PROJECT,
|
||||||
|
project.getName());
|
||||||
|
dto.setOriginalValue(JSON.toJSONBytes(project));
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,47 +1,26 @@
|
||||||
package io.metersphere.system.service;
|
package io.metersphere.system.service;
|
||||||
|
|
||||||
import io.metersphere.project.domain.Project;
|
import io.metersphere.project.domain.Project;
|
||||||
import io.metersphere.project.domain.ProjectExample;
|
|
||||||
import io.metersphere.project.mapper.ProjectMapper;
|
import io.metersphere.project.mapper.ProjectMapper;
|
||||||
import io.metersphere.sdk.constants.HttpMethodConstants;
|
import io.metersphere.sdk.constants.HttpMethodConstants;
|
||||||
import io.metersphere.sdk.constants.InternalUserRole;
|
|
||||||
import io.metersphere.sdk.constants.OperationLogConstants;
|
|
||||||
import io.metersphere.sdk.dto.AddProjectRequest;
|
import io.metersphere.sdk.dto.AddProjectRequest;
|
||||||
import io.metersphere.sdk.dto.LogDTO;
|
|
||||||
import io.metersphere.sdk.dto.ProjectDTO;
|
import io.metersphere.sdk.dto.ProjectDTO;
|
||||||
import io.metersphere.sdk.dto.UpdateProjectRequest;
|
import io.metersphere.sdk.dto.UpdateProjectRequest;
|
||||||
import io.metersphere.sdk.exception.MSException;
|
|
||||||
import io.metersphere.sdk.invoker.ProjectServiceInvoker;
|
|
||||||
import io.metersphere.sdk.log.constants.OperationLogModule;
|
import io.metersphere.sdk.log.constants.OperationLogModule;
|
||||||
import io.metersphere.sdk.log.constants.OperationLogType;
|
import io.metersphere.sdk.log.constants.OperationLogType;
|
||||||
import io.metersphere.sdk.log.service.OperationLogService;
|
|
||||||
import io.metersphere.sdk.util.JSON;
|
|
||||||
import io.metersphere.sdk.util.LogUtils;
|
|
||||||
import io.metersphere.sdk.util.Translator;
|
import io.metersphere.sdk.util.Translator;
|
||||||
import io.metersphere.system.domain.User;
|
|
||||||
import io.metersphere.system.domain.UserRoleRelation;
|
|
||||||
import io.metersphere.system.domain.UserRoleRelationExample;
|
|
||||||
import io.metersphere.system.dto.OrganizationProjectOptionsDTO;
|
import io.metersphere.system.dto.OrganizationProjectOptionsDTO;
|
||||||
import io.metersphere.system.dto.UserExtend;
|
import io.metersphere.system.dto.UserExtend;
|
||||||
import io.metersphere.system.mapper.ExtSystemProjectMapper;
|
import io.metersphere.system.mapper.ExtSystemProjectMapper;
|
||||||
import io.metersphere.system.mapper.UserMapper;
|
|
||||||
import io.metersphere.system.mapper.UserRoleRelationMapper;
|
|
||||||
import io.metersphere.system.request.ProjectAddMemberBatchRequest;
|
import io.metersphere.system.request.ProjectAddMemberBatchRequest;
|
||||||
import io.metersphere.system.request.ProjectMemberRequest;
|
import io.metersphere.system.request.ProjectMemberRequest;
|
||||||
import io.metersphere.system.request.ProjectRequest;
|
import io.metersphere.system.request.ProjectRequest;
|
||||||
import jakarta.annotation.Resource;
|
import jakarta.annotation.Resource;
|
||||||
import org.apache.commons.collections.CollectionUtils;
|
|
||||||
import org.apache.commons.lang3.ObjectUtils;
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.ibatis.session.SqlSessionFactory;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
|
@ -50,331 +29,73 @@ public class SystemProjectService {
|
||||||
@Resource
|
@Resource
|
||||||
private ProjectMapper projectMapper;
|
private ProjectMapper projectMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private UserMapper userMapper;
|
|
||||||
@Resource
|
|
||||||
private UserRoleRelationMapper userRoleRelationMapper;
|
|
||||||
@Resource
|
|
||||||
private ExtSystemProjectMapper extSystemProjectMapper;
|
private ExtSystemProjectMapper extSystemProjectMapper;
|
||||||
@Resource
|
@Resource
|
||||||
private OperationLogService operationLogService;
|
private CommonProjectService commonProjectService;
|
||||||
|
|
||||||
private final ProjectServiceInvoker serviceInvoker;
|
|
||||||
@Resource
|
|
||||||
private SqlSessionFactory sqlSessionFactory;
|
|
||||||
|
|
||||||
private final static String PREFIX = "/system/project";
|
private final static String PREFIX = "/system/project";
|
||||||
private final static String ADD_PROJECT = PREFIX + "/add";
|
private final static String ADD_PROJECT = PREFIX + "/add";
|
||||||
private final static String UPDATE_PROJECT = PREFIX + "/update";
|
private final static String UPDATE_PROJECT = PREFIX + "/update";
|
||||||
private final static String REMOVE_PROJECT_MEMBER = PREFIX + "/remove-member/";
|
private final static String REMOVE_PROJECT_MEMBER = PREFIX + "/remove-member/";
|
||||||
|
private final static String ADD_MEMBER = PREFIX + "/add-member";
|
||||||
@Autowired
|
|
||||||
public SystemProjectService(ProjectServiceInvoker serviceInvoker) {
|
|
||||||
this.serviceInvoker = serviceInvoker;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Project get(String id) {
|
public Project get(String id) {
|
||||||
return projectMapper.selectByPrimaryKey(id);
|
return projectMapper.selectByPrimaryKey(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param addProjectDTO 添加项目的时候 默认给用户组添加管理员和成员的权限
|
* @param addProjectDTO 添加项目的时候 默认给用户组添加管理员的权限
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public Project add(AddProjectRequest addProjectDTO, String createUser) {
|
public Project add(AddProjectRequest addProjectDTO, String createUser) {
|
||||||
|
Project project = commonProjectService.add(addProjectDTO, createUser, ADD_PROJECT, OperationLogModule.SYSTEM_PROJECT);
|
||||||
Project project = new Project();
|
|
||||||
project.setId(UUID.randomUUID().toString());
|
|
||||||
project.setName(addProjectDTO.getName());
|
|
||||||
project.setOrganizationId(addProjectDTO.getOrganizationId());
|
|
||||||
checkProjectExistByName(project);
|
|
||||||
project.setCreateTime(System.currentTimeMillis());
|
|
||||||
project.setUpdateTime(System.currentTimeMillis());
|
|
||||||
project.setUpdateUser(createUser);
|
|
||||||
project.setCreateUser(createUser);
|
|
||||||
project.setEnable(addProjectDTO.getEnable());
|
|
||||||
project.setDescription(addProjectDTO.getDescription());
|
|
||||||
projectMapper.insertSelective(project);
|
|
||||||
ProjectAddMemberBatchRequest memberRequest = new ProjectAddMemberBatchRequest();
|
|
||||||
memberRequest.setProjectIds(List.of(project.getId()));
|
|
||||||
if (CollectionUtils.isEmpty(addProjectDTO.getUserIds())) {
|
|
||||||
memberRequest.setUserIds(List.of(createUser));
|
|
||||||
} else {
|
|
||||||
memberRequest.setUserIds(addProjectDTO.getUserIds());
|
|
||||||
}
|
|
||||||
//添加项目管理员 创建的时候如果没有传管理员id 则默认创建者为管理员
|
|
||||||
this.addProjectAdmin(memberRequest, createUser, ADD_PROJECT, OperationLogType.ADD.name(), HttpMethodConstants.POST.name(), Translator.get("add"));
|
|
||||||
return project;
|
return project;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void checkOrgRoleExit(String userId, String orgId, String createUser, String userName) {
|
|
||||||
List<LogDTO> logDTOList = new ArrayList<>();
|
|
||||||
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
|
||||||
userRoleRelationExample.createCriteria().andUserIdEqualTo(userId).andSourceIdEqualTo(orgId);
|
|
||||||
if (userRoleRelationMapper.selectByExample(userRoleRelationExample).size() == 0) {
|
|
||||||
UserRoleRelation memberRole = new UserRoleRelation();
|
|
||||||
memberRole.setId(UUID.randomUUID().toString());
|
|
||||||
memberRole.setUserId(userId);
|
|
||||||
memberRole.setRoleId(InternalUserRole.ORG_MEMBER.getValue());
|
|
||||||
memberRole.setSourceId(orgId);
|
|
||||||
memberRole.setCreateTime(System.currentTimeMillis());
|
|
||||||
memberRole.setCreateUser(createUser);
|
|
||||||
userRoleRelationMapper.insert(memberRole);
|
|
||||||
}
|
|
||||||
setLog(orgId, "null", Translator.get("add") + Translator.get("organization_member") + ": " + userName, createUser, "", OperationLogType.ADD.name(), HttpMethodConstants.POST.name(), logDTOList);
|
|
||||||
operationLogService.batchAdd(logDTOList);
|
|
||||||
}
|
|
||||||
|
|
||||||
private void checkProjectExistByName(Project project) {
|
|
||||||
ProjectExample example = new ProjectExample();
|
|
||||||
example.createCriteria().andNameEqualTo(project.getName()).andOrganizationIdEqualTo(project.getOrganizationId());
|
|
||||||
if (projectMapper.selectByExample(example).size() > 0) {
|
|
||||||
throw new MSException(Translator.get("project_name_already_exists"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 检查项目是否存在
|
|
||||||
*
|
|
||||||
* @param id
|
|
||||||
*/
|
|
||||||
private void checkProjectNotExist(String id) {
|
|
||||||
if (projectMapper.selectByPrimaryKey(id) == null) {
|
|
||||||
throw new MSException(Translator.get("project_is_not_exist"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<ProjectDTO> getProjectList(ProjectRequest request) {
|
public List<ProjectDTO> getProjectList(ProjectRequest request) {
|
||||||
List<ProjectDTO> projectList = extSystemProjectMapper.getProjectList(request);
|
List<ProjectDTO> projectList = extSystemProjectMapper.getProjectList(request);
|
||||||
return buildUserInfo(projectList);
|
return commonProjectService.buildUserInfo(projectList);
|
||||||
}
|
|
||||||
|
|
||||||
public List<ProjectDTO> buildUserInfo(List<ProjectDTO> projectList) {
|
|
||||||
projectList.forEach(projectDTO -> {
|
|
||||||
List<User> users = extSystemProjectMapper.getProjectAdminList(projectDTO.getId());
|
|
||||||
projectDTO.setAdminList(users);
|
|
||||||
});
|
|
||||||
return projectList;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Project update(UpdateProjectRequest updateProjectDto, String updateUser) {
|
public Project update(UpdateProjectRequest updateProjectDto, String updateUser) {
|
||||||
Project project = new Project();
|
Project project = commonProjectService.update(updateProjectDto, updateUser, UPDATE_PROJECT, OperationLogModule.SYSTEM_PROJECT);
|
||||||
project.setId(updateProjectDto.getId());
|
|
||||||
project.setName(updateProjectDto.getName());
|
|
||||||
project.setDescription(updateProjectDto.getDescription());
|
|
||||||
project.setOrganizationId(updateProjectDto.getOrganizationId());
|
|
||||||
project.setEnable(updateProjectDto.getEnable());
|
|
||||||
project.setUpdateUser(updateUser);
|
|
||||||
project.setCreateUser(null);
|
|
||||||
project.setCreateTime(null);
|
|
||||||
project.setUpdateTime(System.currentTimeMillis());
|
|
||||||
checkProjectExistByName(project);
|
|
||||||
checkProjectNotExist(project.getId());
|
|
||||||
UserRoleRelationExample example = new UserRoleRelationExample();
|
|
||||||
example.createCriteria().andSourceIdEqualTo(project.getId()).andRoleIdEqualTo(InternalUserRole.PROJECT_ADMIN.getValue());
|
|
||||||
List<UserRoleRelation> userRoleRelations = userRoleRelationMapper.selectByExample(example);
|
|
||||||
List<String> orgUserIds = userRoleRelations.stream().map(UserRoleRelation::getUserId).toList();
|
|
||||||
if (CollectionUtils.isNotEmpty(updateProjectDto.getUserIds())) {
|
|
||||||
//updateProjectDto.getUserIds() 为前端传过来的用户id 与数据库中的用户id做对比 如果数据库中的用户id不在前端传过来的用户id中 则删除
|
|
||||||
List<String> deleteIds = orgUserIds.stream()
|
|
||||||
.filter(item -> !updateProjectDto.getUserIds().contains(item))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
|
|
||||||
List<String> insertIds = updateProjectDto.getUserIds().stream()
|
|
||||||
.filter(item -> !orgUserIds.contains(item))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
if (CollectionUtils.isNotEmpty(deleteIds)) {
|
|
||||||
UserRoleRelationExample deleteExample = new UserRoleRelationExample();
|
|
||||||
deleteExample.createCriteria().andSourceIdEqualTo(project.getId()).andUserIdIn(deleteIds).andRoleIdEqualTo(InternalUserRole.PROJECT_ADMIN.getValue());
|
|
||||||
userRoleRelationMapper.deleteByExample(deleteExample);
|
|
||||||
}
|
|
||||||
if (CollectionUtils.isNotEmpty(insertIds)) {
|
|
||||||
ProjectAddMemberBatchRequest memberRequest = new ProjectAddMemberBatchRequest();
|
|
||||||
memberRequest.setProjectIds(List.of(project.getId()));
|
|
||||||
memberRequest.setUserIds(insertIds);
|
|
||||||
this.addProjectAdmin(memberRequest, updateUser, UPDATE_PROJECT, OperationLogType.UPDATE.name(),
|
|
||||||
HttpMethodConstants.POST.name(), Translator.get("update"));
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (CollectionUtils.isNotEmpty(orgUserIds)) {
|
|
||||||
//如果前端传过来的用户id为空 则删除项目所有管理员
|
|
||||||
UserRoleRelationExample deleteExample = new UserRoleRelationExample();
|
|
||||||
deleteExample.createCriteria().andSourceIdEqualTo(project.getId()).andUserIdIn(orgUserIds).andRoleIdEqualTo(InternalUserRole.PROJECT_ADMIN.getValue());
|
|
||||||
userRoleRelationMapper.deleteByExample(deleteExample);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
projectMapper.updateByPrimaryKeySelective(project);
|
|
||||||
return project;
|
return project;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int delete(String id, String deleteUser) {
|
public int delete(String id, String deleteUser) {
|
||||||
//TODO 删除项目删除全部资源 这里的删除只是假删除
|
return commonProjectService.delete(id, deleteUser);
|
||||||
checkProjectNotExist(id);
|
|
||||||
Project project = new Project();
|
|
||||||
project.setId(id);
|
|
||||||
project.setDeleteUser(deleteUser);
|
|
||||||
project.setDeleted(true);
|
|
||||||
project.setDeleteTime(System.currentTimeMillis());
|
|
||||||
return projectMapper.updateByPrimaryKeySelective(project);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<UserExtend> getProjectMember(ProjectMemberRequest request) {
|
public List<UserExtend> getProjectMember(ProjectMemberRequest request) {
|
||||||
|
commonProjectService.checkProjectNotExist(request.getProjectId());
|
||||||
List<UserExtend> projectMemberList = extSystemProjectMapper.getProjectMemberList(request);
|
List<UserExtend> projectMemberList = extSystemProjectMapper.getProjectMemberList(request);
|
||||||
return projectMemberList;
|
return projectMemberList;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 添加项目管理员
|
|
||||||
*
|
|
||||||
* @param request
|
|
||||||
* @param createUser
|
|
||||||
* @param path
|
|
||||||
* @param type
|
|
||||||
* @param method
|
|
||||||
* @param content
|
|
||||||
*/
|
|
||||||
public void addProjectAdmin(ProjectAddMemberBatchRequest request, String createUser, String path, String type,
|
|
||||||
String method, String content) {
|
|
||||||
|
|
||||||
List<LogDTO> logDTOList = new ArrayList<>();
|
|
||||||
List<UserRoleRelation> userRoleRelations = new ArrayList<>();
|
|
||||||
request.getProjectIds().forEach(projectId -> {
|
|
||||||
checkProjectNotExist(projectId);
|
|
||||||
//判断传过来的用户id是否在组织下,如果不存在,给用户创建一个组织成员的身份
|
|
||||||
request.getUserIds().forEach(userId -> {
|
|
||||||
User user = userMapper.selectByPrimaryKey(userId);
|
|
||||||
if (ObjectUtils.isEmpty(user)) {
|
|
||||||
throw new MSException(Translator.get("user_not_exist"));
|
|
||||||
}
|
|
||||||
this.checkOrgRoleExit(userId, projectMapper.selectByPrimaryKey(projectId).getOrganizationId(), createUser, user.getName());
|
|
||||||
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
|
||||||
userRoleRelationExample.createCriteria().andUserIdEqualTo(userId)
|
|
||||||
.andSourceIdEqualTo(projectId).andRoleIdEqualTo(InternalUserRole.PROJECT_MEMBER.getValue());
|
|
||||||
if (userRoleRelationMapper.selectByExample(userRoleRelationExample).size() == 0) {
|
|
||||||
UserRoleRelation adminRole = new UserRoleRelation();
|
|
||||||
adminRole.setId(UUID.randomUUID().toString());
|
|
||||||
adminRole.setUserId(userId);
|
|
||||||
adminRole.setRoleId(InternalUserRole.PROJECT_ADMIN.getValue());
|
|
||||||
adminRole.setSourceId(projectId);
|
|
||||||
adminRole.setCreateTime(System.currentTimeMillis());
|
|
||||||
adminRole.setCreateUser(createUser);
|
|
||||||
userRoleRelations.add(adminRole);
|
|
||||||
setLog(projectId, path, content + Translator.get("project_admin") + ": " + user.getName(), createUser, "", type, method, logDTOList);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
userRoleRelationMapper.batchInsert(userRoleRelations);
|
|
||||||
operationLogService.batchAdd(logDTOList);
|
|
||||||
}
|
|
||||||
|
|
||||||
/***
|
/***
|
||||||
* 添加项目成员
|
* 添加项目成员
|
||||||
* @param request
|
* @param request
|
||||||
* @param createUser
|
* @param createUser
|
||||||
* @param path 请求路径
|
|
||||||
* @param type 操作类型
|
|
||||||
* @param method 请求方法
|
|
||||||
* @param content 操作内容
|
|
||||||
*/
|
*/
|
||||||
public void addProjectMember(ProjectAddMemberBatchRequest request, String createUser, String path, String type,
|
public void addProjectMember(ProjectAddMemberBatchRequest request, String createUser) {
|
||||||
String method, String content) {
|
commonProjectService.addProjectMember(request, createUser, ADD_MEMBER,
|
||||||
|
OperationLogType.ADD.name(), HttpMethodConstants.POST.name(), Translator.get("add"), OperationLogModule.SYSTEM_PROJECT);
|
||||||
List<LogDTO> logDTOList = new ArrayList<>();
|
|
||||||
List<UserRoleRelation> userRoleRelations = new ArrayList<>();
|
|
||||||
request.getProjectIds().forEach(projectId -> {
|
|
||||||
checkProjectNotExist(projectId);
|
|
||||||
request.getUserIds().forEach(userId -> {
|
|
||||||
User user = userMapper.selectByPrimaryKey(userId);
|
|
||||||
if (ObjectUtils.isEmpty(user)) {
|
|
||||||
throw new MSException(Translator.get("user_not_exist"));
|
|
||||||
}
|
|
||||||
this.checkOrgRoleExit(userId, projectMapper.selectByPrimaryKey(projectId).getOrganizationId(), createUser, user.getName());
|
|
||||||
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
|
||||||
userRoleRelationExample.createCriteria().andUserIdEqualTo(userId)
|
|
||||||
.andSourceIdEqualTo(projectId).andRoleIdEqualTo(InternalUserRole.PROJECT_MEMBER.getValue());
|
|
||||||
if (userRoleRelationMapper.selectByExample(userRoleRelationExample).size() == 0) {
|
|
||||||
UserRoleRelation memberRole = new UserRoleRelation();
|
|
||||||
memberRole.setId(UUID.randomUUID().toString());
|
|
||||||
memberRole.setUserId(userId);
|
|
||||||
memberRole.setRoleId(InternalUserRole.PROJECT_MEMBER.getValue());
|
|
||||||
memberRole.setSourceId(projectId);
|
|
||||||
memberRole.setCreateTime(System.currentTimeMillis());
|
|
||||||
memberRole.setCreateUser(createUser);
|
|
||||||
userRoleRelations.add(memberRole);
|
|
||||||
setLog(projectId, path, content + Translator.get("project_member") + ": " + user.getName(), createUser, "", type, method, logDTOList);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
userRoleRelationMapper.batchInsert(userRoleRelations);
|
|
||||||
operationLogService.batchAdd(logDTOList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int removeProjectMember(String projectId, String userId) {
|
public int removeProjectMember(String projectId, String userId, String createUser) {
|
||||||
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
return commonProjectService.removeProjectMember(projectId, userId, createUser,OperationLogModule.SYSTEM_PROJECT, StringUtils.join(REMOVE_PROJECT_MEMBER,projectId, "/", userId));
|
||||||
userRoleRelationExample.createCriteria().andUserIdEqualTo(userId)
|
|
||||||
.andSourceIdEqualTo(projectId);
|
|
||||||
User user = userMapper.selectByPrimaryKey(userId);
|
|
||||||
if (StringUtils.equals(projectId, user.getLastProjectId())) {
|
|
||||||
user.setLastProjectId(StringUtils.EMPTY);
|
|
||||||
userMapper.updateByPrimaryKeySelective(user);
|
|
||||||
}
|
|
||||||
List<LogDTO> logDTOList = new ArrayList<>();
|
|
||||||
setLog(projectId, REMOVE_PROJECT_MEMBER + "/" + projectId + "/" + userId,
|
|
||||||
Translator.get("delete") + Translator.get("project_member") + ": " + user.getName(),
|
|
||||||
userId, "", OperationLogType.DELETE.name(), HttpMethodConstants.GET.name(), logDTOList);
|
|
||||||
operationLogService.batchAdd(logDTOList);
|
|
||||||
return userRoleRelationMapper.deleteByExample(userRoleRelationExample);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int revoke(String id) {
|
public int revoke(String id) {
|
||||||
checkProjectNotExist(id);
|
return commonProjectService.revoke(id);
|
||||||
Project project = new Project();
|
|
||||||
project.setId(id);
|
|
||||||
project.setDeleted(false);
|
|
||||||
project.setDeleteTime(null);
|
|
||||||
project.setDeleteUser(null);
|
|
||||||
return projectMapper.updateByPrimaryKeySelective(project);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void deleteProject(List<Project> projects) {
|
public void deleteProject(List<Project> projects) {
|
||||||
// 删除项目
|
commonProjectService.deleteProject(projects);
|
||||||
List<LogDTO> logDTOList = new ArrayList<>();
|
|
||||||
projects.forEach(project -> {
|
|
||||||
serviceInvoker.invokeServices(project.getId());
|
|
||||||
LogUtils.info("send delete_project message, project id: " + project.getId());
|
|
||||||
//删除项目关联的自定义组织
|
|
||||||
deleteProjectUserGroup(project.getId());
|
|
||||||
// delete project
|
|
||||||
projectMapper.deleteByPrimaryKey(project.getId());
|
|
||||||
setLog(project.getId(), "null", Translator.get("delete") + Translator.get("project") + ": " + project.getName(),
|
|
||||||
OperationLogConstants.SYSTEM, OperationLogConstants.SYSTEM, OperationLogType.DELETE.name(), "", logDTOList);
|
|
||||||
});
|
|
||||||
operationLogService.batchAdd(logDTOList);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void deleteProjectUserGroup(String projectId) {
|
|
||||||
UserRoleRelationExample userGroupExample = new UserRoleRelationExample();
|
|
||||||
userGroupExample.createCriteria().andSourceIdEqualTo(projectId);
|
|
||||||
userRoleRelationMapper.deleteByExample(userGroupExample);
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<OrganizationProjectOptionsDTO> getProjectOptions() {
|
public List<OrganizationProjectOptionsDTO> getProjectOptions() {
|
||||||
return extSystemProjectMapper.selectProjectOptions();
|
return extSystemProjectMapper.selectProjectOptions();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void setLog(String projectId, String path, String content, String userId, Object originalValue,
|
|
||||||
String type, String method, List<LogDTO> logDTOList) {
|
|
||||||
LogDTO dto = new LogDTO(
|
|
||||||
OperationLogConstants.SYSTEM,
|
|
||||||
OperationLogConstants.SYSTEM,
|
|
||||||
projectId,
|
|
||||||
userId,
|
|
||||||
type,
|
|
||||||
OperationLogModule.SYSTEM_PROJECT,
|
|
||||||
content);
|
|
||||||
dto.setPath(path);
|
|
||||||
dto.setMethod(method);
|
|
||||||
dto.setOriginalValue(JSON.toJSONBytes(originalValue));
|
|
||||||
logDTOList.add(dto);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,588 @@
|
||||||
|
package io.metersphere.system.controller;
|
||||||
|
|
||||||
|
import io.metersphere.project.domain.Project;
|
||||||
|
import io.metersphere.project.domain.ProjectExample;
|
||||||
|
import io.metersphere.project.mapper.ProjectMapper;
|
||||||
|
import io.metersphere.sdk.base.BaseTest;
|
||||||
|
import io.metersphere.sdk.constants.InternalUserRole;
|
||||||
|
import io.metersphere.sdk.constants.PermissionConstants;
|
||||||
|
import io.metersphere.sdk.constants.SessionConstants;
|
||||||
|
import io.metersphere.sdk.controller.handler.ResultHolder;
|
||||||
|
import io.metersphere.sdk.dto.AddProjectRequest;
|
||||||
|
import io.metersphere.sdk.dto.ProjectDTO;
|
||||||
|
import io.metersphere.sdk.dto.UpdateProjectRequest;
|
||||||
|
import io.metersphere.sdk.log.constants.OperationLogType;
|
||||||
|
import io.metersphere.sdk.util.JSON;
|
||||||
|
import io.metersphere.sdk.util.Pager;
|
||||||
|
import io.metersphere.system.domain.UserRoleRelation;
|
||||||
|
import io.metersphere.system.domain.UserRoleRelationExample;
|
||||||
|
import io.metersphere.system.dto.OrganizationDTO;
|
||||||
|
import io.metersphere.system.dto.UserExtend;
|
||||||
|
import io.metersphere.system.mapper.UserRoleRelationMapper;
|
||||||
|
import io.metersphere.system.request.OrganizationProjectRequest;
|
||||||
|
import io.metersphere.system.request.ProjectAddMemberRequest;
|
||||||
|
import io.metersphere.system.request.ProjectMemberRequest;
|
||||||
|
import io.metersphere.system.service.OrganizationService;
|
||||||
|
import jakarta.annotation.Resource;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
import org.junit.jupiter.api.*;
|
||||||
|
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
|
import org.springframework.test.web.servlet.MvcResult;
|
||||||
|
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.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print;
|
||||||
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
|
||||||
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
@AutoConfigureMockMvc
|
||||||
|
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
||||||
|
public class OrganizationProjectControllerTests extends BaseTest {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private MockMvc mockMvc;
|
||||||
|
|
||||||
|
private final static String prefix = "/organization/project";
|
||||||
|
private final static String addProject = prefix + "/add";
|
||||||
|
private final static String updateProject = prefix + "/update";
|
||||||
|
private final static String deleteProject = prefix + "/delete/";
|
||||||
|
private final static String revokeProject = prefix + "/revoke/";
|
||||||
|
private final static String getProject = prefix + "/get/";
|
||||||
|
private final static String getProjectList = prefix + "/page";
|
||||||
|
private final static String getProjectMemberList = prefix + "/member-list";
|
||||||
|
private final static String addProjectMember = prefix + "/add-members";
|
||||||
|
private final static String removeProjectMember = prefix + "/remove-member/";
|
||||||
|
private static final ResultMatcher BAD_REQUEST_MATCHER = status().isBadRequest();
|
||||||
|
private static final ResultMatcher ERROR_REQUEST_MATCHER = status().is5xxServerError();
|
||||||
|
|
||||||
|
private static String projectId;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ProjectMapper projectMapper;
|
||||||
|
@Resource
|
||||||
|
private UserRoleRelationMapper userRoleRelationMapper;
|
||||||
|
@Resource
|
||||||
|
private OrganizationService organizationService;
|
||||||
|
|
||||||
|
private OrganizationDTO getDefault() {
|
||||||
|
return organizationService.getDefault();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void requestPost(String url, Object param, ResultMatcher resultMatcher) throws Exception {
|
||||||
|
mockMvc.perform(MockMvcRequestBuilders.post(url)
|
||||||
|
.header(SessionConstants.HEADER_TOKEN, sessionId)
|
||||||
|
.header(SessionConstants.CSRF_TOKEN, csrfToken)
|
||||||
|
.content(JSON.toJSONString(param))
|
||||||
|
.contentType(MediaType.APPLICATION_JSON))
|
||||||
|
.andExpect(resultMatcher).andDo(print())
|
||||||
|
.andExpect(content().contentType(MediaType.APPLICATION_JSON));
|
||||||
|
}
|
||||||
|
|
||||||
|
private MvcResult responsePost(String url, Object param) throws Exception {
|
||||||
|
return mockMvc.perform(MockMvcRequestBuilders.post(url)
|
||||||
|
.header(SessionConstants.HEADER_TOKEN, sessionId)
|
||||||
|
.header(SessionConstants.CSRF_TOKEN, csrfToken)
|
||||||
|
.content(JSON.toJSONString(param))
|
||||||
|
.contentType(MediaType.APPLICATION_JSON))
|
||||||
|
.andExpect(status().isOk()).andDo(print())
|
||||||
|
.andExpect(content().contentType(MediaType.APPLICATION_JSON)).andReturn();
|
||||||
|
}
|
||||||
|
|
||||||
|
private MvcResult responseGet(String url) throws Exception {
|
||||||
|
return mockMvc.perform(MockMvcRequestBuilders.get(url)
|
||||||
|
.header(SessionConstants.HEADER_TOKEN, sessionId)
|
||||||
|
.header(SessionConstants.CSRF_TOKEN, csrfToken)
|
||||||
|
.contentType(MediaType.APPLICATION_JSON))
|
||||||
|
.andExpect(status().isOk()).andDo(print())
|
||||||
|
.andExpect(content().contentType(MediaType.APPLICATION_JSON)).andReturn();
|
||||||
|
}
|
||||||
|
private void responseGet(String url, ResultMatcher resultMatcher) throws Exception {
|
||||||
|
mockMvc.perform(MockMvcRequestBuilders.get(url)
|
||||||
|
.header(SessionConstants.HEADER_TOKEN, sessionId)
|
||||||
|
.header(SessionConstants.CSRF_TOKEN, csrfToken)
|
||||||
|
.contentType(MediaType.APPLICATION_JSON))
|
||||||
|
.andExpect(resultMatcher).andDo(print())
|
||||||
|
.andExpect(content().contentType(MediaType.APPLICATION_JSON)).andReturn();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static <T> T parseObjectFromMvcResult(MvcResult mvcResult, Class<T> parseClass) {
|
||||||
|
try {
|
||||||
|
String returnData = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8);
|
||||||
|
ResultHolder resultHolder = JSON.parseObject(returnData, ResultHolder.class);
|
||||||
|
//返回请求正常
|
||||||
|
Assertions.assertNotNull(resultHolder);
|
||||||
|
return JSON.parseObject(JSON.toJSONString(resultHolder.getData()), parseClass);
|
||||||
|
} catch (Exception ignore) {
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
public static void compareProjectDTO(Project currentProject, Project result) {
|
||||||
|
Assertions.assertNotNull(currentProject);
|
||||||
|
Assertions.assertNotNull(result);
|
||||||
|
//判断ID是否一样
|
||||||
|
Assertions.assertTrue(StringUtils.equals(currentProject.getId(), result.getId()));
|
||||||
|
//判断名称是否一样
|
||||||
|
Assertions.assertTrue(StringUtils.equals(currentProject.getName(), result.getName()));
|
||||||
|
//判断组织是否一样
|
||||||
|
Assertions.assertTrue(StringUtils.equals(currentProject.getOrganizationId(), result.getOrganizationId()));
|
||||||
|
//判断描述是否一样
|
||||||
|
Assertions.assertTrue(StringUtils.equals(currentProject.getDescription(), result.getDescription()));
|
||||||
|
//判断是否启用
|
||||||
|
Assertions.assertTrue(currentProject.getEnable() == result.getEnable());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public AddProjectRequest generatorAdd(String organizationId, String name, String description, boolean enable, List<String> userIds) {
|
||||||
|
AddProjectRequest addProjectDTO = new AddProjectRequest();
|
||||||
|
addProjectDTO.setOrganizationId(organizationId);
|
||||||
|
addProjectDTO.setName(name);
|
||||||
|
addProjectDTO.setDescription(description);
|
||||||
|
addProjectDTO.setEnable(enable);
|
||||||
|
addProjectDTO.setUserIds(userIds);
|
||||||
|
return addProjectDTO;
|
||||||
|
}
|
||||||
|
public UpdateProjectRequest generatorUpdate(String organizationId,
|
||||||
|
String projectId,
|
||||||
|
String name,
|
||||||
|
String description,
|
||||||
|
boolean enable,
|
||||||
|
List<String> userIds) {
|
||||||
|
UpdateProjectRequest updateProjectDTO = new UpdateProjectRequest();
|
||||||
|
updateProjectDTO.setOrganizationId(organizationId);
|
||||||
|
updateProjectDTO.setId(projectId);
|
||||||
|
updateProjectDTO.setName(name);
|
||||||
|
updateProjectDTO.setDescription(description);
|
||||||
|
updateProjectDTO.setEnable(enable);
|
||||||
|
updateProjectDTO.setUserIds(userIds);
|
||||||
|
return updateProjectDTO;
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
@Order(1)
|
||||||
|
/**
|
||||||
|
* 测试添加项目成功的情况
|
||||||
|
*/
|
||||||
|
public void testAddProjectSuccess() throws Exception {
|
||||||
|
AddProjectRequest project = this.generatorAdd("organizationId","organization-name", "description", true, List.of("admin"));
|
||||||
|
MvcResult mvcResult = this.responsePost(addProject, project);
|
||||||
|
Project result = this.parseObjectFromMvcResult(mvcResult, Project.class);
|
||||||
|
ProjectExample projectExample = new ProjectExample();
|
||||||
|
projectExample.createCriteria().andOrganizationIdEqualTo(project.getOrganizationId()).andNameEqualTo(project.getName());
|
||||||
|
List<Project> projects = projectMapper.selectByExample(projectExample);
|
||||||
|
projectId = result.getId();
|
||||||
|
// 校验日志
|
||||||
|
checkLog(projectId, OperationLogType.ADD);
|
||||||
|
|
||||||
|
this.compareProjectDTO(projects.get(0), result);
|
||||||
|
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
||||||
|
userRoleRelationExample.createCriteria().andSourceIdEqualTo(projectId).andRoleIdEqualTo(InternalUserRole.PROJECT_ADMIN.getValue());
|
||||||
|
List<UserRoleRelation> userRoleRelations = userRoleRelationMapper.selectByExample(userRoleRelationExample);
|
||||||
|
Assertions.assertEquals(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(List.of("admin")), true);
|
||||||
|
userRoleRelationExample.createCriteria().andSourceIdEqualTo("organizationId").andRoleIdEqualTo(InternalUserRole.ORG_MEMBER.getValue());
|
||||||
|
userRoleRelations = userRoleRelationMapper.selectByExample(userRoleRelationExample);
|
||||||
|
Assertions.assertEquals(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(List.of("admin")), true);
|
||||||
|
projectId = result.getId();
|
||||||
|
// 校验日志
|
||||||
|
checkLog(projectId, OperationLogType.ADD);
|
||||||
|
|
||||||
|
//userId为空的时候
|
||||||
|
project = this.generatorAdd("organizationId","organization-userIdIsNull", "description", true, new ArrayList<>());
|
||||||
|
mvcResult = this.responsePost(addProject, project);
|
||||||
|
result = this.parseObjectFromMvcResult(mvcResult, Project.class);
|
||||||
|
projectExample = new ProjectExample();
|
||||||
|
projectExample.createCriteria().andOrganizationIdEqualTo(project.getOrganizationId()).andNameEqualTo(project.getName());
|
||||||
|
projects = projectMapper.selectByExample(projectExample);
|
||||||
|
projectId = result.getId();
|
||||||
|
// 校验日志
|
||||||
|
checkLog(projectId, OperationLogType.ADD);
|
||||||
|
|
||||||
|
this.compareProjectDTO(projects.get(0), result);
|
||||||
|
userRoleRelationExample = new UserRoleRelationExample();
|
||||||
|
userRoleRelationExample.createCriteria().andSourceIdEqualTo(projectId).andRoleIdEqualTo(InternalUserRole.PROJECT_ADMIN.getValue());
|
||||||
|
userRoleRelations = userRoleRelationMapper.selectByExample(userRoleRelationExample);
|
||||||
|
Assertions.assertEquals(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(List.of("admin")), true);
|
||||||
|
userRoleRelationExample.createCriteria().andSourceIdEqualTo("organizationId").andRoleIdEqualTo(InternalUserRole.ORG_MEMBER.getValue());
|
||||||
|
userRoleRelations = userRoleRelationMapper.selectByExample(userRoleRelationExample);
|
||||||
|
Assertions.assertEquals(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(List.of("admin")), true);
|
||||||
|
|
||||||
|
project.setName("organization-testAddProjectSuccess1");
|
||||||
|
project.setOrganizationId(getDefault().getId());
|
||||||
|
// @@校验权限
|
||||||
|
requestPostPermissionTest(PermissionConstants.ORGANIZATION_PROJECT_READ_ADD, addProject, project);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(2)
|
||||||
|
/**
|
||||||
|
* 测试添加项目失败的用例
|
||||||
|
*/
|
||||||
|
public void testAddProjectError() throws Exception {
|
||||||
|
AddProjectRequest project = this.generatorAdd("organizationId","organization-nameError", "description", true, List.of("admin"));
|
||||||
|
this.responsePost(addProject, project);
|
||||||
|
//项目名称存在 500
|
||||||
|
project = this.generatorAdd("organizationId","organization-nameError", "description", true, List.of("admin"));
|
||||||
|
this.requestPost(addProject, project, ERROR_REQUEST_MATCHER);
|
||||||
|
//参数组织Id为空
|
||||||
|
project = this.generatorAdd(null, null, null, true, List.of("admin"));
|
||||||
|
this.requestPost(addProject, project, BAD_REQUEST_MATCHER);
|
||||||
|
//项目名称为空
|
||||||
|
project = this.generatorAdd("organizationId", null, null, true, List.of("admin"));
|
||||||
|
this.requestPost(addProject, project, BAD_REQUEST_MATCHER);
|
||||||
|
//项目成员在系统中不存在
|
||||||
|
project = this.generatorAdd("organizationId", "name", null, true, List.of("admin", "admin1", "admin3"));
|
||||||
|
this.requestPost(addProject, project, ERROR_REQUEST_MATCHER);
|
||||||
|
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
@Order(3)
|
||||||
|
public void testGetProject() throws Exception {
|
||||||
|
AddProjectRequest project = this.generatorAdd("organizationId","organization-getName", "description", true, List.of("admin"));
|
||||||
|
MvcResult mvcResult = this.responsePost(addProject, project);
|
||||||
|
Project result = this.parseObjectFromMvcResult(mvcResult, Project.class);
|
||||||
|
projectId = result.getId();
|
||||||
|
mvcResult = this.responseGet(getProject + projectId);
|
||||||
|
Project getProjects = this.parseObjectFromMvcResult(mvcResult, Project.class);
|
||||||
|
Assertions.assertTrue(StringUtils.equals(getProjects.getId(), projectId));
|
||||||
|
// @@校验权限
|
||||||
|
requestGetPermissionTest(PermissionConstants.ORGANIZATION_PROJECT_READ, getProject + projectId);
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
@Order(4)
|
||||||
|
public void testGetProjectError() throws Exception {
|
||||||
|
//项目不存在
|
||||||
|
MvcResult mvcResult = this.responseGet(getProject + "111111");
|
||||||
|
String returnData = mvcResult.getResponse().getContentAsString(StandardCharsets.UTF_8);
|
||||||
|
ResultHolder resultHolder = JSON.parseObject(returnData, ResultHolder.class);
|
||||||
|
Assertions.assertNull(resultHolder.getData());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(5)
|
||||||
|
public void testGetProjectList() throws Exception {
|
||||||
|
OrganizationProjectRequest projectRequest = new OrganizationProjectRequest();
|
||||||
|
projectRequest.setCurrent(1);
|
||||||
|
projectRequest.setPageSize(10);
|
||||||
|
projectRequest.setOrganizationId(getDefault().getId());
|
||||||
|
MvcResult mvcResult = this.responsePost(getProjectList, projectRequest);
|
||||||
|
Pager<?> returnPager = parseObjectFromMvcResult(mvcResult, Pager.class);
|
||||||
|
//返回值不为空
|
||||||
|
Assertions.assertNotNull(returnPager);
|
||||||
|
//返回值的页码和当前页码相同
|
||||||
|
Assertions.assertEquals(returnPager.getCurrent(), projectRequest.getCurrent());
|
||||||
|
//返回的数据量不超过规定要返回的数据量相同
|
||||||
|
Assertions.assertTrue(((List<ProjectDTO>) returnPager.getList()).size() <= projectRequest.getPageSize());
|
||||||
|
projectRequest.setSort(new HashMap<>() {{
|
||||||
|
put("createTime", "desc");
|
||||||
|
}});
|
||||||
|
mvcResult = this.responsePost(getProjectList, projectRequest);
|
||||||
|
returnPager = parseObjectFromMvcResult(mvcResult, Pager.class);
|
||||||
|
//第一个数据的createTime是最大的
|
||||||
|
List<ProjectDTO> projectDTOS = JSON.parseArray(JSON.toJSONString(returnPager.getList()), ProjectDTO.class);
|
||||||
|
long firstCreateTime = projectDTOS.get(0).getCreateTime();
|
||||||
|
for (ProjectDTO projectDTO : projectDTOS) {
|
||||||
|
Assertions.assertFalse(projectDTO.getCreateTime() > firstCreateTime);
|
||||||
|
}
|
||||||
|
projectRequest.setFilter(new HashMap<>() {{
|
||||||
|
put("createUser", List.of("test"));
|
||||||
|
}});
|
||||||
|
mvcResult = this.responsePost(getProjectList, projectRequest);
|
||||||
|
returnPager = parseObjectFromMvcResult(mvcResult, Pager.class);
|
||||||
|
//返回的数据中的createUser是admin或者admin1
|
||||||
|
projectDTOS = JSON.parseArray(JSON.toJSONString(returnPager.getList()), ProjectDTO.class);
|
||||||
|
//拿到所有的createUser
|
||||||
|
List<String> createUsers = projectDTOS.stream().map(ProjectDTO::getCreateUser).collect(Collectors.toList());
|
||||||
|
Assertions.assertTrue(List.of("test").containsAll(createUsers));
|
||||||
|
// @@校验权限
|
||||||
|
requestPostPermissionTest(PermissionConstants.ORGANIZATION_PROJECT_READ, getProjectList, projectRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(6)
|
||||||
|
public void testPageError() throws Exception {
|
||||||
|
//当前页码不大于0
|
||||||
|
OrganizationProjectRequest projectRequest = new OrganizationProjectRequest();
|
||||||
|
projectRequest.setPageSize(5);
|
||||||
|
projectRequest.setOrganizationId("organizationId");
|
||||||
|
this.requestPost(getProjectList, projectRequest, BAD_REQUEST_MATCHER);
|
||||||
|
//当前页数不大于5
|
||||||
|
projectRequest = new OrganizationProjectRequest();
|
||||||
|
projectRequest.setCurrent(1);
|
||||||
|
projectRequest.setOrganizationId("organizationId");
|
||||||
|
this.requestPost(getProjectList, projectRequest, BAD_REQUEST_MATCHER);
|
||||||
|
//当前页数大于100
|
||||||
|
projectRequest = new OrganizationProjectRequest();
|
||||||
|
projectRequest.setCurrent(1);
|
||||||
|
projectRequest.setPageSize(101);
|
||||||
|
projectRequest.setOrganizationId("organizationId");
|
||||||
|
this.requestPost(getProjectList, projectRequest, BAD_REQUEST_MATCHER);
|
||||||
|
//排序字段不合法
|
||||||
|
projectRequest = new OrganizationProjectRequest();
|
||||||
|
projectRequest.setCurrent(1);
|
||||||
|
projectRequest.setPageSize(5);
|
||||||
|
projectRequest.setOrganizationId("organizationId");
|
||||||
|
projectRequest.setSort(new HashMap<>() {{
|
||||||
|
put("SELECT * FROM user", "asc");
|
||||||
|
}});
|
||||||
|
this.requestPost(getProjectList, projectRequest, BAD_REQUEST_MATCHER);
|
||||||
|
//组织id为空
|
||||||
|
projectRequest = new OrganizationProjectRequest();
|
||||||
|
projectRequest.setCurrent(1);
|
||||||
|
projectRequest.setPageSize(5);
|
||||||
|
this.requestPost(getProjectList, projectRequest, BAD_REQUEST_MATCHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(7)
|
||||||
|
public void testUpdateProject() throws Exception {
|
||||||
|
UpdateProjectRequest project = this.generatorUpdate("organizationId", projectId,"organization-TestName", "Edit name", true, List.of("admin", "admin1"));
|
||||||
|
MvcResult mvcResult = this.responsePost(updateProject, project);
|
||||||
|
Project result = this.parseObjectFromMvcResult(mvcResult, Project.class);
|
||||||
|
Project currentProject = projectMapper.selectByPrimaryKey(project.getId());
|
||||||
|
this.compareProjectDTO(currentProject, result);
|
||||||
|
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
||||||
|
userRoleRelationExample.createCriteria().andSourceIdEqualTo(projectId).andRoleIdEqualTo(InternalUserRole.PROJECT_ADMIN.getValue());
|
||||||
|
List<UserRoleRelation> userRoleRelations = userRoleRelationMapper.selectByExample(userRoleRelationExample);
|
||||||
|
Assertions.assertEquals(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(List.of("admin", "admin1")), true);
|
||||||
|
userRoleRelationExample.createCriteria().andSourceIdEqualTo("organizationId").andRoleIdEqualTo(InternalUserRole.ORG_MEMBER.getValue());
|
||||||
|
userRoleRelations = userRoleRelationMapper.selectByExample(userRoleRelationExample);
|
||||||
|
Assertions.assertEquals(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(List.of("admin", "admin1")), true);
|
||||||
|
|
||||||
|
// 校验日志
|
||||||
|
checkLog(projectId, OperationLogType.ADD);
|
||||||
|
//用户id为空
|
||||||
|
project = this.generatorUpdate("organizationId", projectId, "organization-TestNameUserIdIsNull", "Edit name", true, new ArrayList<>());
|
||||||
|
mvcResult = this.responsePost(updateProject, project);
|
||||||
|
result = this.parseObjectFromMvcResult(mvcResult, Project.class);
|
||||||
|
currentProject = projectMapper.selectByPrimaryKey(project.getId());
|
||||||
|
this.compareProjectDTO(currentProject, result);
|
||||||
|
userRoleRelationExample = new UserRoleRelationExample();
|
||||||
|
userRoleRelationExample.createCriteria().andSourceIdEqualTo(projectId).andRoleIdEqualTo(InternalUserRole.PROJECT_ADMIN.getValue());
|
||||||
|
userRoleRelations = userRoleRelationMapper.selectByExample(userRoleRelationExample);
|
||||||
|
//断言userRoleRelations是空的
|
||||||
|
Assertions.assertTrue(userRoleRelations.isEmpty());
|
||||||
|
// @@校验权限
|
||||||
|
project.setName("organization-TestName2");
|
||||||
|
project.setOrganizationId(getDefault().getId());
|
||||||
|
requestPostPermissionTest(PermissionConstants.ORGANIZATION_PROJECT_READ_UPDATE, updateProject, project);
|
||||||
|
// 校验日志
|
||||||
|
checkLog(projectId, OperationLogType.UPDATE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(8)
|
||||||
|
public void testUpdateProjectError() throws Exception {
|
||||||
|
//项目名称存在 500
|
||||||
|
UpdateProjectRequest project = this.generatorUpdate(getDefault().getId(), "projectId1","organization-TestName2", "description", true, List.of("admin"));
|
||||||
|
this.requestPost(updateProject, project, ERROR_REQUEST_MATCHER);
|
||||||
|
//参数组织Id为空
|
||||||
|
project = this.generatorUpdate(null, "projectId",null, null, true , List.of("admin"));
|
||||||
|
this.requestPost(updateProject, project, BAD_REQUEST_MATCHER);
|
||||||
|
//项目Id为空
|
||||||
|
project = this.generatorUpdate("organizationId", null,null, null, true, List.of("admin"));
|
||||||
|
this.requestPost(updateProject, project, BAD_REQUEST_MATCHER);
|
||||||
|
//项目名称为空
|
||||||
|
project = this.generatorUpdate("organizationId", "projectId",null, null, true, List.of("admin"));
|
||||||
|
this.requestPost(updateProject, project, BAD_REQUEST_MATCHER);
|
||||||
|
//项目不存在
|
||||||
|
project = this.generatorUpdate("organizationId", "1111","123", null, true, List.of("admin"));
|
||||||
|
this.requestPost(updateProject, project, ERROR_REQUEST_MATCHER);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(9)
|
||||||
|
public void testDeleteProject() throws Exception {
|
||||||
|
MvcResult mvcResult = this.responseGet(deleteProject + projectId);
|
||||||
|
int count = parseObjectFromMvcResult(mvcResult, Integer.class);
|
||||||
|
Project currentProject = projectMapper.selectByPrimaryKey(projectId);
|
||||||
|
Assertions.assertEquals(currentProject.getDeleted(), true);
|
||||||
|
Assertions.assertTrue(currentProject.getId().equals(projectId));
|
||||||
|
Assertions.assertTrue(count == 1);
|
||||||
|
// 校验日志
|
||||||
|
checkLog(projectId, OperationLogType.DELETE);
|
||||||
|
// @@校验权限
|
||||||
|
requestGetPermissionTest(PermissionConstants.ORGANIZATION_PROJECT_READ_DELETE, deleteProject + projectId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(10)
|
||||||
|
public void testDeleteProjectError() throws Exception {
|
||||||
|
String id = "1111";
|
||||||
|
this.responseGet(deleteProject + id, ERROR_REQUEST_MATCHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(11)
|
||||||
|
public void revokeSuccess() throws Exception {
|
||||||
|
MvcResult mvcResult = this.responseGet(revokeProject + projectId);
|
||||||
|
int count = parseObjectFromMvcResult(mvcResult, Integer.class);
|
||||||
|
Project currentProject = projectMapper.selectByPrimaryKey(projectId);
|
||||||
|
Assertions.assertEquals(currentProject.getDeleted(), false);
|
||||||
|
Assertions.assertTrue(currentProject.getId().equals(projectId));
|
||||||
|
Assertions.assertTrue(count == 1);
|
||||||
|
// 校验日志
|
||||||
|
checkLog(projectId, OperationLogType.RECOVER);
|
||||||
|
// @@校验权限
|
||||||
|
requestGetPermissionTest(PermissionConstants.ORGANIZATION_PROJECT_READ_RECOVER, revokeProject + projectId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(12)
|
||||||
|
public void testRevokeProjectError() throws Exception {
|
||||||
|
String id = "1111";
|
||||||
|
this.responseGet(revokeProject + id, ERROR_REQUEST_MATCHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(13)
|
||||||
|
public void testAddProjectMember() throws Exception{
|
||||||
|
ProjectAddMemberRequest projectAddMemberRequest = new ProjectAddMemberRequest();
|
||||||
|
projectAddMemberRequest.setProjectId(projectId);
|
||||||
|
List<String> userIds = List.of("admin1", "admin2");
|
||||||
|
projectAddMemberRequest.setUserIds(userIds);
|
||||||
|
this.requestPost(addProjectMember, projectAddMemberRequest, status().isOk());
|
||||||
|
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
||||||
|
userRoleRelationExample.createCriteria().andSourceIdEqualTo(projectId).andRoleIdEqualTo(InternalUserRole.PROJECT_MEMBER.getValue());
|
||||||
|
List<UserRoleRelation> userRoleRelations = userRoleRelationMapper.selectByExample(userRoleRelationExample);
|
||||||
|
Assertions.assertEquals(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(userIds), true);
|
||||||
|
Assertions.assertTrue(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(userIds));
|
||||||
|
userRoleRelations.forEach(item ->{
|
||||||
|
try {
|
||||||
|
checkLog(item.getId(), OperationLogType.ADD);
|
||||||
|
} catch (Exception e) {
|
||||||
|
throw new RuntimeException(e);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// @@校验权限
|
||||||
|
requestPostPermissionTest(PermissionConstants.ORGANIZATION_PROJECT_READ_UPDATE, addProjectMember, projectAddMemberRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(14)
|
||||||
|
public void testAddProjectMemberError() throws Exception{
|
||||||
|
//项目Id为空
|
||||||
|
ProjectAddMemberRequest projectAddMemberRequest = new ProjectAddMemberRequest();
|
||||||
|
projectAddMemberRequest.setProjectId(null);
|
||||||
|
this.requestPost(addProjectMember, projectAddMemberRequest, BAD_REQUEST_MATCHER);
|
||||||
|
//用户Id为空
|
||||||
|
projectAddMemberRequest = new ProjectAddMemberRequest();
|
||||||
|
projectAddMemberRequest.setProjectId("projectId");
|
||||||
|
this.requestPost(addProjectMember, projectAddMemberRequest, BAD_REQUEST_MATCHER);
|
||||||
|
//用户Id不存在
|
||||||
|
projectAddMemberRequest = new ProjectAddMemberRequest();
|
||||||
|
projectAddMemberRequest.setProjectId("projectId");
|
||||||
|
projectAddMemberRequest.setUserIds(List.of("admin3"));
|
||||||
|
this.requestPost(addProjectMember, projectAddMemberRequest, ERROR_REQUEST_MATCHER);
|
||||||
|
//项目id不存在
|
||||||
|
projectAddMemberRequest = new ProjectAddMemberRequest();
|
||||||
|
projectAddMemberRequest.setProjectId("projectId111");
|
||||||
|
projectAddMemberRequest.setUserIds(List.of("admin1"));
|
||||||
|
this.requestPost(addProjectMember, projectAddMemberRequest, ERROR_REQUEST_MATCHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(15)
|
||||||
|
public void testGetMemberSuccess() throws Exception {
|
||||||
|
ProjectMemberRequest memberRequest = new ProjectMemberRequest();
|
||||||
|
memberRequest.setCurrent(1);
|
||||||
|
memberRequest.setPageSize(5);
|
||||||
|
memberRequest.setProjectId(projectId);
|
||||||
|
MvcResult mvcResult = this.responsePost(getProjectMemberList, memberRequest);
|
||||||
|
Pager<?> returnPager = parseObjectFromMvcResult(mvcResult, Pager.class);
|
||||||
|
//返回值不为空
|
||||||
|
Assertions.assertNotNull(returnPager);
|
||||||
|
//返回值的页码和当前页码相同
|
||||||
|
Assertions.assertEquals(returnPager.getCurrent(), memberRequest.getCurrent());
|
||||||
|
//返回的数据量不超过规定要返回的数据量相同
|
||||||
|
Assertions.assertTrue(((List<UserExtend>) returnPager.getList()).size() <= memberRequest.getPageSize());
|
||||||
|
memberRequest.setSort(new HashMap<>() {{
|
||||||
|
put("createTime", "desc");
|
||||||
|
}});
|
||||||
|
mvcResult = this.responsePost(getProjectMemberList, memberRequest);
|
||||||
|
returnPager = parseObjectFromMvcResult(mvcResult, Pager.class);
|
||||||
|
//第一个数据的createTime是最大的
|
||||||
|
List<UserExtend> userExtends = JSON.parseArray(JSON.toJSONString(returnPager.getList()), UserExtend.class);
|
||||||
|
long firstCreateTime = userExtends.get(0).getCreateTime();
|
||||||
|
for (UserExtend userExtend : userExtends) {
|
||||||
|
Assertions.assertFalse(userExtend.getCreateTime() > firstCreateTime);
|
||||||
|
}
|
||||||
|
// @@校验权限
|
||||||
|
requestPostPermissionTest(PermissionConstants.ORGANIZATION_PROJECT_READ, getProjectMemberList, memberRequest);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(16)
|
||||||
|
public void testGetMemberError() throws Exception {
|
||||||
|
//当前页码不大于0
|
||||||
|
ProjectMemberRequest memberRequest = new ProjectMemberRequest();
|
||||||
|
memberRequest.setPageSize(5);
|
||||||
|
this.requestPost(getProjectMemberList, memberRequest, BAD_REQUEST_MATCHER);
|
||||||
|
//当前页数不大于5
|
||||||
|
memberRequest = new ProjectMemberRequest();
|
||||||
|
memberRequest.setCurrent(1);
|
||||||
|
this.requestPost(getProjectMemberList, memberRequest, BAD_REQUEST_MATCHER);
|
||||||
|
//当前页数大于100
|
||||||
|
memberRequest = new ProjectMemberRequest();
|
||||||
|
memberRequest.setCurrent(1);
|
||||||
|
memberRequest.setPageSize(101);
|
||||||
|
this.requestPost(getProjectMemberList, memberRequest, BAD_REQUEST_MATCHER);
|
||||||
|
//项目Id为空
|
||||||
|
memberRequest = new ProjectMemberRequest();
|
||||||
|
memberRequest.setCurrent(1);
|
||||||
|
memberRequest.setPageSize(5);
|
||||||
|
this.requestPost(getProjectMemberList, memberRequest, BAD_REQUEST_MATCHER);
|
||||||
|
//排序字段不合法
|
||||||
|
memberRequest = new ProjectMemberRequest();
|
||||||
|
memberRequest.setCurrent(1);
|
||||||
|
memberRequest.setPageSize(5);
|
||||||
|
memberRequest.setProjectId("projectId1");
|
||||||
|
memberRequest.setSort(new HashMap<>() {{
|
||||||
|
put("SELECT * FROM user", "asc");
|
||||||
|
}});
|
||||||
|
this.requestPost(getProjectMemberList, memberRequest, BAD_REQUEST_MATCHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(17)
|
||||||
|
public void testRemoveProjectMember() throws Exception{
|
||||||
|
String userId = "admin1";
|
||||||
|
UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample();
|
||||||
|
userRoleRelationExample.createCriteria().andSourceIdEqualTo(projectId).andUserIdEqualTo(userId);
|
||||||
|
List<UserRoleRelation> userRoleRelations = userRoleRelationMapper.selectByExample(userRoleRelationExample);
|
||||||
|
MvcResult mvcResult = this.responseGet(removeProjectMember + projectId + "/" + userId);
|
||||||
|
int count = parseObjectFromMvcResult(mvcResult, Integer.class);
|
||||||
|
Assertions.assertTrue(count == userRoleRelations.size());
|
||||||
|
// 校验日志
|
||||||
|
checkLog(userRoleRelations.get(0).getId(), OperationLogType.DELETE);
|
||||||
|
// @@校验权限
|
||||||
|
requestGetPermissionTest(PermissionConstants.ORGANIZATION_PROJECT_READ_UPDATE, removeProjectMember + projectId + "/" + userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
@Order(18)
|
||||||
|
public void testRemoveProjectMemberError() throws Exception{
|
||||||
|
String userId = "admin1";
|
||||||
|
MvcResult mvcResult = this.responseGet(removeProjectMember + projectId + "/" + userId);
|
||||||
|
int count = parseObjectFromMvcResult(mvcResult, Integer.class);
|
||||||
|
Assertions.assertTrue(count == 0);
|
||||||
|
|
||||||
|
//用户Id不存在
|
||||||
|
projectId = "projectId1";
|
||||||
|
userId = "admin34";
|
||||||
|
this.responseGet(removeProjectMember + projectId + "/" + userId, ERROR_REQUEST_MATCHER);
|
||||||
|
//项目id不存在
|
||||||
|
projectId = "projectId111";
|
||||||
|
userId = "admin1";
|
||||||
|
this.responseGet(removeProjectMember + projectId + "/" + userId, ERROR_REQUEST_MATCHER);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -232,7 +232,7 @@ public class SystemProjectControllerTests extends BaseTest {
|
||||||
project = this.generatorAdd("organizationId", null, null, true, List.of("admin"));
|
project = this.generatorAdd("organizationId", null, null, true, List.of("admin"));
|
||||||
this.requestPost(addProject, project, BAD_REQUEST_MATCHER);
|
this.requestPost(addProject, project, BAD_REQUEST_MATCHER);
|
||||||
//项目成员在系统中不存在
|
//项目成员在系统中不存在
|
||||||
project = this.generatorAdd("organizationId", "name", null, true, List.of("admin", "admin1", "admin2"));
|
project = this.generatorAdd("organizationId", "name", null, true, List.of("admin", "admin1", "admin3"));
|
||||||
this.requestPost(addProject, project, ERROR_REQUEST_MATCHER);
|
this.requestPost(addProject, project, ERROR_REQUEST_MATCHER);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -432,6 +432,8 @@ public class SystemProjectControllerTests extends BaseTest {
|
||||||
List<UserRoleRelation> userRoleRelations = userRoleRelationMapper.selectByExample(userRoleRelationExample);
|
List<UserRoleRelation> userRoleRelations = userRoleRelationMapper.selectByExample(userRoleRelationExample);
|
||||||
Assertions.assertEquals(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(userIds), true);
|
Assertions.assertEquals(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(userIds), true);
|
||||||
Assertions.assertTrue(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(userIds));
|
Assertions.assertTrue(userRoleRelations.stream().map(UserRoleRelation::getUserId).collect(Collectors.toList()).containsAll(userIds));
|
||||||
|
// @@校验权限
|
||||||
|
requestPostPermissionTest(PermissionConstants.SYSTEM_ORGANIZATION_PROJECT_READ_UPDATE, addProjectMember, projectAddMemberRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -450,6 +452,11 @@ public class SystemProjectControllerTests extends BaseTest {
|
||||||
projectAddMemberRequest.setProjectId("projectId");
|
projectAddMemberRequest.setProjectId("projectId");
|
||||||
projectAddMemberRequest.setUserIds(List.of("admin3"));
|
projectAddMemberRequest.setUserIds(List.of("admin3"));
|
||||||
this.requestPost(addProjectMember, projectAddMemberRequest, ERROR_REQUEST_MATCHER);
|
this.requestPost(addProjectMember, projectAddMemberRequest, ERROR_REQUEST_MATCHER);
|
||||||
|
//项目id不存在
|
||||||
|
projectAddMemberRequest = new ProjectAddMemberRequest();
|
||||||
|
projectAddMemberRequest.setProjectId("projectId111");
|
||||||
|
projectAddMemberRequest.setUserIds(List.of("admin1"));
|
||||||
|
this.requestPost(addProjectMember, projectAddMemberRequest, ERROR_REQUEST_MATCHER);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -478,6 +485,9 @@ public class SystemProjectControllerTests extends BaseTest {
|
||||||
for (UserExtend userExtend : userExtends) {
|
for (UserExtend userExtend : userExtends) {
|
||||||
Assertions.assertFalse(userExtend.getCreateTime() > firstCreateTime);
|
Assertions.assertFalse(userExtend.getCreateTime() > firstCreateTime);
|
||||||
}
|
}
|
||||||
|
// @@校验权限
|
||||||
|
requestPostPermissionTest(PermissionConstants.SYSTEM_ORGANIZATION_PROJECT_READ, getProjectMemberList, memberRequest);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -501,6 +511,12 @@ public class SystemProjectControllerTests extends BaseTest {
|
||||||
memberRequest.setCurrent(1);
|
memberRequest.setCurrent(1);
|
||||||
memberRequest.setPageSize(5);
|
memberRequest.setPageSize(5);
|
||||||
this.requestPost(getProjectMemberList, memberRequest, BAD_REQUEST_MATCHER);
|
this.requestPost(getProjectMemberList, memberRequest, BAD_REQUEST_MATCHER);
|
||||||
|
//项目Id不存在
|
||||||
|
memberRequest = new ProjectMemberRequest();
|
||||||
|
memberRequest.setCurrent(1);
|
||||||
|
memberRequest.setPageSize(5);
|
||||||
|
memberRequest.setProjectId("projectId111");
|
||||||
|
this.requestPost(getProjectMemberList, memberRequest, ERROR_REQUEST_MATCHER);
|
||||||
//排序字段不合法
|
//排序字段不合法
|
||||||
memberRequest = new ProjectMemberRequest();
|
memberRequest = new ProjectMemberRequest();
|
||||||
memberRequest.setCurrent(1);
|
memberRequest.setCurrent(1);
|
||||||
|
@ -523,6 +539,8 @@ public class SystemProjectControllerTests extends BaseTest {
|
||||||
MvcResult mvcResult = this.responseGet(removeProjectMember + projectId + "/" + userId);
|
MvcResult mvcResult = this.responseGet(removeProjectMember + projectId + "/" + userId);
|
||||||
int count = parseObjectFromMvcResult(mvcResult, Integer.class);
|
int count = parseObjectFromMvcResult(mvcResult, Integer.class);
|
||||||
Assertions.assertTrue(count == userRoleRelations.size());
|
Assertions.assertTrue(count == userRoleRelations.size());
|
||||||
|
// @@校验权限
|
||||||
|
requestGetPermissionTest(PermissionConstants.SYSTEM_ORGANIZATION_PROJECT_READ_UPDATE, removeProjectMember + projectId + "/" + userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -533,6 +551,15 @@ public class SystemProjectControllerTests extends BaseTest {
|
||||||
MvcResult mvcResult = this.responseGet(removeProjectMember + projectId + "/" + userId);
|
MvcResult mvcResult = this.responseGet(removeProjectMember + projectId + "/" + userId);
|
||||||
int count = parseObjectFromMvcResult(mvcResult, Integer.class);
|
int count = parseObjectFromMvcResult(mvcResult, Integer.class);
|
||||||
Assertions.assertTrue(count == 0);
|
Assertions.assertTrue(count == 0);
|
||||||
|
|
||||||
|
//用户Id不存在
|
||||||
|
projectId = "projectId1";
|
||||||
|
userId = "admin34";
|
||||||
|
this.responseGet(removeProjectMember + projectId + "/" + userId, ERROR_REQUEST_MATCHER);
|
||||||
|
//项目id不存在
|
||||||
|
projectId = "projectId111";
|
||||||
|
userId = "admin1";
|
||||||
|
this.responseGet(removeProjectMember + projectId + "/" + userId, ERROR_REQUEST_MATCHER);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
package io.metersphere.system.job;
|
|
||||||
|
|
||||||
import io.metersphere.sdk.base.BaseTest;
|
|
||||||
import jakarta.annotation.Resource;
|
|
||||||
import org.junit.jupiter.api.MethodOrderer;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.junit.jupiter.api.TestMethodOrder;
|
|
||||||
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
|
|
||||||
@SpringBootTest
|
|
||||||
@AutoConfigureMockMvc
|
|
||||||
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
|
|
||||||
public class LicenseCacheTests extends BaseTest {
|
|
||||||
@Resource
|
|
||||||
private LicenseCacheJob licenseCacheJob;
|
|
||||||
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void cleanupProject() throws Exception{
|
|
||||||
//TODO
|
|
||||||
licenseCacheJob.checkLicenseTask();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,28 +0,0 @@
|
||||||
package io.metersphere.system.service;
|
|
||||||
|
|
||||||
import io.metersphere.sdk.dto.LicenseDTO;
|
|
||||||
import io.metersphere.sdk.service.LicenseService;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class LicenseServiceImpl implements LicenseService {
|
|
||||||
|
|
||||||
public synchronized LicenseDTO refreshLicense() {
|
|
||||||
LicenseDTO licenseDTO = new LicenseDTO();
|
|
||||||
return licenseDTO;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LicenseDTO validate() {
|
|
||||||
LicenseDTO licenseDTO = new LicenseDTO();
|
|
||||||
return licenseDTO;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public LicenseDTO addLicense(String licenseCode) {
|
|
||||||
LicenseDTO licenseDTO = new LicenseDTO();
|
|
||||||
return licenseDTO;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,3 +1,9 @@
|
||||||
# 插入测试数据
|
# 插入测试数据
|
||||||
INSERT INTO `project` VALUES ('projectId1', null, '3a5b1bd3-05e5-11ee-ad96-0242ac1e0a02', '默认项目2', '系统默认创建的项目', 1686219258000, 1686219258000, 'admin', 1683464436000, 1, NULL, true);
|
INSERT INTO `project` VALUES ('projectId1', null, '3a5b1bd3-05e5-11ee-ad96-0242ac1e0a02', '默认项目2', '系统默认创建的项目', 1686219258000, 1686219258000, 'admin', 1683464436000, 1, NULL, true);
|
||||||
INSERT INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time, delete_time,deleted) VALUES ('projectId6', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目6', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000, 1683464436000 , 1);
|
INSERT INTO project (id, num, organization_id, name, description, create_user, update_user, create_time, update_time, delete_time,deleted) VALUES ('projectId6', null, (SELECT id FROM organization WHERE name LIKE '默认组织'), '默认项目6', '系统默认创建的项目', 'admin', 'admin', unix_timestamp() * 1000, unix_timestamp() * 1000, 1683464436000 , 1);
|
||||||
|
INSERT INTO user_role(id, name, description, internal, type, create_time, update_time, create_user, scope_id) VALUE
|
||||||
|
('default-pro-role-delete-id', 'default-pro-role-delete', 'XXX', FALSE, 'PROJECT', UNIX_TIMESTAMP() * 1000, UNIX_TIMESTAMP() * 1000, 'admin', 'projectId6');
|
||||||
|
INSERT INTO user_role_relation (id, user_id, role_id, source_id, create_time, create_user) VALUE
|
||||||
|
(UUID(), 'admin', 'default-pro-role-delete-id', 'projectId6', UNIX_TIMESTAMP() * 1000, 'admin');
|
||||||
|
INSERT INTO user_role_permission (id, role_id, permission_id) VALUE
|
||||||
|
(uuid(), 'default-pro-role-delete-id', 'ORGANIZATION_USER_ROLE:READ');
|
||||||
|
|
Loading…
Reference in New Issue