diff --git a/backend/framework/domain/src/main/resources/migration/3.0.0/dml/V3.0.0_11_1__data.sql b/backend/framework/domain/src/main/resources/migration/3.0.0/dml/V3.0.0_11_1__data.sql index 2801463725..554e328cad 100644 --- a/backend/framework/domain/src/main/resources/migration/3.0.0/dml/V3.0.0_11_1__data.sql +++ b/backend/framework/domain/src/main/resources/migration/3.0.0/dml/V3.0.0_11_1__data.sql @@ -65,6 +65,11 @@ INSERT INTO user_role_permission (id, role_id, permission_id) VALUES (uuid(), 'o INSERT INTO user_role_permission (id, role_id, permission_id) VALUES (uuid(), 'org_admin', 'ORGANIZATION_USER:READ'); INSERT INTO user_role_permission (id, role_id, permission_id) VALUES (uuid(), 'org_admin', 'ORGANIZATION_TEMPLATE:READ+CUSTOM'); INSERT INTO user_role_permission (id, role_id, permission_id) VALUES (uuid(), 'org_admin', 'ORGANIZATION_USER:READ+ADD'); +-- 初始化组织-用户组菜单权限(默认) +INSERT INTO user_role_permission (id, role_id, permission_id) VALUES (uuid(), 'org_admin', 'ORGANIZATION_USER_ROLE:READ'); +INSERT INTO user_role_permission (id, role_id, permission_id) VALUES (uuid(), 'org_admin', 'ORGANIZATION_USER_ROLE:READ+ADD'); +INSERT INTO user_role_permission (id, role_id, permission_id) VALUES (uuid(), 'org_admin', 'ORGANIZATION_USER_ROLE:READ+UPDATE'); +INSERT INTO user_role_permission (id, role_id, permission_id) VALUES (uuid(), 'org_admin', 'ORGANIZATION_USER_ROLE:READ+DELETE'); -- 组织成员权限 INSERT INTO user_role_permission (id, role_id, permission_id) VALUES (uuid(), 'org_member', 'ORGANIZATION_PROJECT_MANAGER:READ+UPLOAD_JAR'); INSERT INTO user_role_permission (id, role_id, permission_id) VALUES (uuid(), 'org_member', 'ORGANIZATION_MESSAGE:READ'); diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/controller/OrganizationUserRoleController.java b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/OrganizationUserRoleController.java index 7cc8bb820a..c3d20ea76b 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/controller/OrganizationUserRoleController.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/controller/OrganizationUserRoleController.java @@ -19,6 +19,8 @@ import io.metersphere.system.request.OrganizationUserRoleMemberRequest; import io.metersphere.system.service.OrganizationUserRoleLogService; import io.metersphere.system.service.OrganizationUserRoleService; 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 org.apache.shiro.authz.annotation.RequiresPermissions; @@ -40,6 +42,7 @@ public class OrganizationUserRoleController { @GetMapping("/list/{organizationId}") @Operation(summary = "获取组织用户组列表") + @Parameter(name = "organizationId", description = "当前组织ID", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED)) @RequiresPermissions(PermissionConstants.ORGANIZATION_USER_ROLE_READ) public List list(@PathVariable String organizationId) { return organizationUserRoleService.list(organizationId); @@ -69,6 +72,7 @@ public class OrganizationUserRoleController { @GetMapping("/delete/{id}") @Operation(summary = "删除组织用户组") @RequiresPermissions(PermissionConstants.ORGANIZATION_USER_ROLE_READ_DELETE) + @Parameter(name = "id", description = "用户组ID", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED)) @Log(type = OperationLogType.DELETE, expression = "#msClass.deleteLog(#id)", msClass = OrganizationUserRoleLogService.class) public void delete(@PathVariable String id) { organizationUserRoleService.delete(id); @@ -76,6 +80,7 @@ public class OrganizationUserRoleController { @GetMapping("/permission/setting/{id}") @Operation(summary = "获取组织用户组对应的权限配置") + @Parameter(name = "id", description = "用户组ID", schema = @Schema(requiredMode = Schema.RequiredMode.REQUIRED)) @RequiresPermissions(PermissionConstants.ORGANIZATION_USER_ROLE_READ) public List getPermissionSetting(@PathVariable String id) { return organizationUserRoleService.getPermissionSetting(id); diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtOrganizationMapper.xml b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtOrganizationMapper.xml index 080d4517b0..e22464f2aa 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtOrganizationMapper.xml +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtOrganizationMapper.xml @@ -38,9 +38,7 @@ urr.source_id = #{request.organizationId} - and (u.name like CONCAT('%', #{request.keyword},'%') - or u.email like CONCAT('%', #{request.keyword},'%') - or u.phone like CONCAT('%', #{request.keyword},'%')) + and u.name like concat('%', #{request.keyword},'%') order by u.update_time desc diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleMapper.xml b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleMapper.xml index 0d5c3c054a..e647c9c142 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleMapper.xml +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleMapper.xml @@ -16,6 +16,6 @@ select u.* from user_role_relation urr left join user u on urr.user_id = u.id where urr.source_id = #{request.organizationId} and urr.role_id = #{request.userRoleId} - and u.name like concat('%',#{request.userName},'%') + and u.name like concat('%',#{request.userKeyWord},'%') \ No newline at end of file diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleRelationMapper.java b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleRelationMapper.java index 49e05f74d5..306ff9a606 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleRelationMapper.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleRelationMapper.java @@ -13,4 +13,6 @@ public interface ExtUserRoleRelationMapper { List selectGlobalRoleByUserId(String userId); List listGlobal(@Param("request") GlobalUserRoleRelationQueryRequest request); + + void batchInsert(@Param("list") List list); } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleRelationMapper.xml b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleRelationMapper.xml index 4393ff8f55..744b71cb2d 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleRelationMapper.xml +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/mapper/ExtUserRoleRelationMapper.xml @@ -30,4 +30,12 @@ ) + + + insert into user_role_relation (id, user_id, role_id, source_id, create_time, create_user) + values + + (#{item.id}, #{item.userId}, #{item.roleId}, #{item.sourceId}, #{item.createTime}, #{item.createUser}) + + \ No newline at end of file diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationDeleteRequest.java b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationDeleteRequest.java index d657f87e04..5974d8a2d7 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationDeleteRequest.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationDeleteRequest.java @@ -1,6 +1,7 @@ package io.metersphere.system.request; import lombok.Data; +import lombok.EqualsAndHashCode; import java.io.Serializable; @@ -8,6 +9,7 @@ import java.io.Serializable; * @author song-cc-rock */ @Data +@EqualsAndHashCode(callSuper = false) public class OrganizationDeleteRequest implements Serializable { /** diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationEditRequest.java b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationEditRequest.java index f3739e1810..0c852b9cdc 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationEditRequest.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationEditRequest.java @@ -7,11 +7,13 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Size; import lombok.Data; +import lombok.EqualsAndHashCode; import java.io.Serializable; import java.util.List; @Data +@EqualsAndHashCode(callSuper = false) public class OrganizationEditRequest implements Serializable { @Schema(title = "组织ID") diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationMemberBatchRequest.java b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationMemberBatchRequest.java new file mode 100644 index 0000000000..1a55fa7d72 --- /dev/null +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationMemberBatchRequest.java @@ -0,0 +1,20 @@ +package io.metersphere.system.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotEmpty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +public class OrganizationMemberBatchRequest extends OrganizationMemberRequest{ + + /** + * 组织ID集合 + */ + @Schema(title = "组织ID集合", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "{organization.id.not_blank}") + private List organizationIds; +} diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationMemberExtendRequest.java b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationMemberExtendRequest.java index f0997519c9..334caaecc6 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationMemberExtendRequest.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationMemberExtendRequest.java @@ -3,6 +3,7 @@ package io.metersphere.system.request; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotEmpty; import lombok.Data; +import lombok.EqualsAndHashCode; import java.util.List; @@ -11,6 +12,7 @@ import java.util.List; * @author guoyuqi */ @Data +@EqualsAndHashCode(callSuper = false) public class OrganizationMemberExtendRequest extends OrganizationMemberRequest { /** diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationMemberRequest.java b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationMemberRequest.java index 9e392684cd..b829414707 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationMemberRequest.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationMemberRequest.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import lombok.Data; +import lombok.EqualsAndHashCode; import java.io.Serializable; import java.util.List; @@ -12,6 +13,7 @@ import java.util.List; * @author song-cc-rock */ @Data +@EqualsAndHashCode(callSuper = false) public class OrganizationMemberRequest implements Serializable { /** @@ -24,7 +26,7 @@ public class OrganizationMemberRequest implements Serializable { /** * 成员ID集合 */ - @Schema(title = "成员ID", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "{member.id.not_null}") + @Schema(title = "成员ID集合", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "{user.id.not_blank}") private List memberIds; } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleEditRequest.java b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleEditRequest.java index 9496083eaf..de519db5eb 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleEditRequest.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleEditRequest.java @@ -8,10 +8,12 @@ import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Size; import lombok.Data; +import lombok.EqualsAndHashCode; import java.io.Serializable; @Data +@EqualsAndHashCode(callSuper = false) public class OrganizationUserRoleEditRequest implements Serializable { private static final long serialVersionUID = 1L; diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleMemberEditRequest.java b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleMemberEditRequest.java index 5938ed95fd..df30d205e3 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleMemberEditRequest.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleMemberEditRequest.java @@ -2,12 +2,16 @@ package io.metersphere.system.request; import io.swagger.v3.oas.annotations.media.Schema; import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.Size; import lombok.Data; +import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.util.List; @Data +@EqualsAndHashCode(callSuper = false) public class OrganizationUserRoleMemberEditRequest implements Serializable { @Schema(title = "组ID", requiredMode = Schema.RequiredMode.REQUIRED) @@ -20,8 +24,7 @@ public class OrganizationUserRoleMemberEditRequest implements Serializable { @Size(min = 1, max = 50, message = "{organization.id.length_range}") private String organizationId; - @Schema(title = "用户ID", requiredMode = Schema.RequiredMode.REQUIRED) - @NotBlank(message = "{user.id.not_blank}") - @Size(min = 1, max = 50, message = "{user.id.length_range}") - private String userId; + @Schema(title = "成员ID集合", requiredMode = Schema.RequiredMode.REQUIRED) + @NotEmpty(message = "{user.id.not_blank}") + private List userIds; } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleMemberRequest.java b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleMemberRequest.java index 6ad6ab3e6c..9975c83bfe 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleMemberRequest.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/request/OrganizationUserRoleMemberRequest.java @@ -8,7 +8,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; @Data -@EqualsAndHashCode(callSuper = true) +@EqualsAndHashCode(callSuper = false) public class OrganizationUserRoleMemberRequest extends BasePageRequest { @Schema(title = "组ID", requiredMode = Schema.RequiredMode.REQUIRED) @@ -21,6 +21,6 @@ public class OrganizationUserRoleMemberRequest extends BasePageRequest { @Size(min = 1, max = 50, message = "{organization.id.length_range}") private String organizationId; - @Schema(title = "用户名") - private String userName; + @Schema(title = "搜索关键字") + private String userKeyWord; } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/OrganizationService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/OrganizationService.java index 7f0f3ebfde..9b5393e499 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/service/OrganizationService.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/OrganizationService.java @@ -19,10 +19,7 @@ import io.metersphere.system.dto.OrganizationDTO; import io.metersphere.system.dto.OrganizationProjectOptionsDto; import io.metersphere.system.dto.UserExtend; import io.metersphere.system.mapper.*; -import io.metersphere.system.request.OrgMemberExtendProjectRequest; -import io.metersphere.system.request.OrganizationMemberExtendRequest; -import io.metersphere.system.request.OrganizationMemberRequest; -import io.metersphere.system.request.OrganizationRequest; +import io.metersphere.system.request.*; import jakarta.annotation.Resource; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.MapUtils; @@ -47,13 +44,15 @@ import java.util.stream.Collectors; public class OrganizationService { @Resource - OrganizationMapper organizationMapper; + private OrganizationMapper organizationMapper; @Resource - ExtOrganizationMapper extOrganizationMapper; + private ExtOrganizationMapper extOrganizationMapper; @Resource - UserRoleRelationMapper userRoleRelationMapper; + private UserRoleRelationMapper userRoleRelationMapper; @Resource - UserMapper userMapper; + private ExtUserRoleRelationMapper extUserRoleRelationMapper; + @Resource + private UserMapper userMapper; @Resource private SqlSessionFactory sqlSessionFactory; @Resource @@ -86,30 +85,40 @@ public class OrganizationService { return extOrganizationMapper.listMember(request); } - public void addMemberBySystem(OrganizationMemberRequest organizationMemberRequest, String createUserId) { - String organizationId = organizationMemberRequest.getOrganizationId(); - checkOrgExist(organizationId); - Map userMap = checkUserExist(organizationMemberRequest.getMemberIds()); - for (String userId : organizationMemberRequest.getMemberIds()) { - if (userMap.get(userId) == null) { - throw new MSException("id:" + userId + Translator.get("user.not.exist")); + OrganizationMemberBatchRequest batchRequest = new OrganizationMemberBatchRequest(); + batchRequest.setOrganizationIds(List.of(organizationMemberRequest.getOrganizationId())); + batchRequest.setMemberIds(organizationMemberRequest.getMemberIds()); + addMemberBySystem(batchRequest, createUserId); + } + + public void addMemberBySystem(OrganizationMemberBatchRequest batchRequest, String createUserId) { + checkOrgExist(batchRequest.getOrganizationIds()); + Map userMap = checkUserExist(batchRequest.getMemberIds()); + List userRoleRelations = new ArrayList<>(); + batchRequest.getOrganizationIds().forEach(organizationId -> { + for (String userId : batchRequest.getMemberIds()) { + if (userMap.get(userId) == null) { + throw new MSException("id:" + userId + Translator.get("user.not.exist")); + } + //组织用户成员关系已存在, 不再重复添加 + UserRoleRelationExample example = new UserRoleRelationExample(); + example.createCriteria().andSourceIdEqualTo(organizationId).andUserIdEqualTo(userId).andRoleIdEqualTo(InternalUserRole.ORG_MEMBER.getValue()); + if (userRoleRelationMapper.countByExample(example) > 0) { + continue; + } + UserRoleRelation userRoleRelation = new UserRoleRelation(); + userRoleRelation.setId(UUID.randomUUID().toString()); + userRoleRelation.setUserId(userId); + userRoleRelation.setSourceId(organizationId); + userRoleRelation.setRoleId(InternalUserRole.ORG_MEMBER.getValue()); + userRoleRelation.setCreateTime(System.currentTimeMillis()); + userRoleRelation.setCreateUser(createUserId); + userRoleRelations.add(userRoleRelation); } - //过滤已存在的关系 - UserRoleRelationExample example = new UserRoleRelationExample(); - example.createCriteria().andSourceIdEqualTo(organizationId).andUserIdEqualTo(userId).andRoleIdEqualTo(InternalUserRole.ORG_MEMBER.getValue()); - List userRoleRelations = userRoleRelationMapper.selectByExample(example); - if (CollectionUtils.isNotEmpty(userRoleRelations)) { - continue; - } - UserRoleRelation userRoleRelation = new UserRoleRelation(); - userRoleRelation.setId(UUID.randomUUID().toString()); - userRoleRelation.setUserId(userId); - userRoleRelation.setSourceId(organizationId); - userRoleRelation.setRoleId(InternalUserRole.ORG_MEMBER.getValue()); - userRoleRelation.setCreateTime(System.currentTimeMillis()); - userRoleRelation.setCreateUser(createUserId); - userRoleRelationMapper.insert(userRoleRelation); + }); + if (CollectionUtils.isNotEmpty(userRoleRelations)) { + extUserRoleRelationMapper.batchInsert(userRoleRelations); } } @@ -173,7 +182,7 @@ public class OrganizationService { } public void removeMember(String organizationId, String userId) { - checkOrgExist(organizationId); + checkOrgExist(List.of(organizationId)); //删除组织下项目与成员的关系 List projectIds = getProjectIds(organizationId); if (CollectionUtils.isNotEmpty(projectIds)) { @@ -203,33 +212,12 @@ public class OrganizationService { } public void addMemberByOrg(OrganizationMemberExtendRequest organizationMemberExtendRequest, String createUserId) { - checkOrgExist(organizationMemberExtendRequest.getOrganizationId()); + checkOrgExist(List.of(organizationMemberExtendRequest.getOrganizationId())); Map userMap = checkUserExist(organizationMemberExtendRequest.getMemberIds()); Map userRoleMap = checkUseRoleExist(organizationMemberExtendRequest.getUserRoleIds()); setRelationByMemberAndGroupIds(organizationMemberExtendRequest, createUserId, userMap, userRoleMap, true); } - private Map checkUseRoleExist(List userRoleIds) { - UserRoleExample userRoleExample = new UserRoleExample(); - userRoleExample.createCriteria().andIdIn(userRoleIds).andTypeEqualTo("ORGANIZATION"); - List userRoles = userRoleMapper.selectByExample(userRoleExample); - if (CollectionUtils.isEmpty(userRoles)) { - throw new MSException(Translator.get("user_role_not_exist")); - } - return userRoles.stream().collect(Collectors.toMap(UserRole::getId, user -> user)); - - } - - private Map checkUserExist(List memberIds) { - UserExample userExample = new UserExample(); - userExample.createCriteria().andIdIn(memberIds); - List users = userMapper.selectByExample(userExample); - if (CollectionUtils.isEmpty(users)) { - throw new MSException(Translator.get("user.not.exist")); - } - return users.stream().collect(Collectors.toMap(User::getId, user -> user)); - } - private void setRelationByMemberAndGroupIds(OrganizationMemberExtendRequest organizationMemberExtendRequest, String createUserId, Map userMap, Map userRoleMap, boolean add) { SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); UserRoleRelationMapper userRoleRelationMapper = sqlSession.getMapper(UserRoleRelationMapper.class); @@ -285,23 +273,16 @@ public class OrganizationService { public void updateMemberRole(OrganizationMemberExtendRequest organizationMemberExtendRequest, String userId) { String organizationId = organizationMemberExtendRequest.getOrganizationId(); - checkOrgExist(organizationId); + checkOrgExist(List.of(organizationId)); Map userMap = checkUserExist(organizationMemberExtendRequest.getMemberIds()); Map userRoleMap = checkUseRoleExist(organizationMemberExtendRequest.getUserRoleIds()); //在新增组织成员与用户组和组织的关系 setRelationByMemberAndGroupIds(organizationMemberExtendRequest, userId, userMap, userRoleMap, false); } - private void checkOrgExist(String organizationId) { - Organization organization = organizationMapper.selectByPrimaryKey(organizationId); - if (organization == null) { - throw new MSException(Translator.get("organization_not_exist")); - } - } - public void addMemberToProject(OrgMemberExtendProjectRequest orgMemberExtendProjectRequest, String userId) { String requestOrganizationId = orgMemberExtendProjectRequest.getOrganizationId(); - checkOrgExist(requestOrganizationId); + checkOrgExist(List.of(requestOrganizationId)); SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); UserRoleRelationMapper userRoleRelationMapper = sqlSession.getMapper(UserRoleRelationMapper.class); List logDTOList = new ArrayList<>(); @@ -340,8 +321,7 @@ public class OrganizationService { /** * 删除组织用户日志 - * - * @return + * @return 日志内容 */ public List batchDelLog(String organizationId, String userId) { List projectIds = getProjectIds(organizationId); @@ -405,7 +385,7 @@ public class OrganizationService { List memberIds = organizationMemberExtendRequest.getMemberIds(); //校验组织是否存在 - checkOrgExist(organizationId); + checkOrgExist(List.of(organizationId)); //校验成员是否是当前组织的成员 UserRoleRelationExample userRoleRelationExample = new UserRoleRelationExample(); userRoleRelationExample.createCriteria().andUserIdIn(memberIds).andSourceIdEqualTo(organizationId); @@ -444,4 +424,33 @@ public class OrganizationService { //写入操作日志 operationLogService.batchAdd(logDTOList); } + + private void checkOrgExist(List organizationIds) { + OrganizationExample example = new OrganizationExample(); + example.createCriteria().andIdIn(organizationIds); + if (organizationMapper.countByExample(example) < organizationIds.size()) { + throw new MSException(Translator.get("organization_not_exist")); + } + } + + private Map checkUseRoleExist(List userRoleIds) { + UserRoleExample userRoleExample = new UserRoleExample(); + userRoleExample.createCriteria().andIdIn(userRoleIds).andTypeEqualTo("ORGANIZATION"); + List userRoles = userRoleMapper.selectByExample(userRoleExample); + if (CollectionUtils.isEmpty(userRoles)) { + throw new MSException(Translator.get("user_role_not_exist")); + } + return userRoles.stream().collect(Collectors.toMap(UserRole::getId, user -> user)); + + } + + private Map checkUserExist(List memberIds) { + UserExample userExample = new UserExample(); + userExample.createCriteria().andIdIn(memberIds); + List users = userMapper.selectByExample(userExample); + if (CollectionUtils.isEmpty(users)) { + throw new MSException(Translator.get("user.not.exist")); + } + return users.stream().collect(Collectors.toMap(User::getId, user -> user)); + } } diff --git a/backend/services/system-setting/src/main/java/io/metersphere/system/service/OrganizationUserRoleService.java b/backend/services/system-setting/src/main/java/io/metersphere/system/service/OrganizationUserRoleService.java index c54a36dd0b..ebc176e4d8 100644 --- a/backend/services/system-setting/src/main/java/io/metersphere/system/service/OrganizationUserRoleService.java +++ b/backend/services/system-setting/src/main/java/io/metersphere/system/service/OrganizationUserRoleService.java @@ -85,21 +85,24 @@ public class OrganizationUserRoleService extends BaseUserRoleService { } public void addMember(OrganizationUserRoleMemberEditRequest request, String createUserId) { - checkMemberParam(request.getUserId(), request.getUserRoleId()); - UserRoleRelation relation = new UserRoleRelation(); - relation.setId(UUID.randomUUID().toString()); - relation.setUserId(request.getUserId()); - relation.setRoleId(request.getUserRoleId()); - relation.setSourceId(request.getOrganizationId()); - relation.setCreateTime(System.currentTimeMillis()); - relation.setCreateUser(createUserId); - userRoleRelationMapper.insert(relation); + request.getUserIds().forEach(userId -> { + checkMemberParam(userId, request.getUserRoleId()); + UserRoleRelation relation = new UserRoleRelation(); + relation.setId(UUID.randomUUID().toString()); + relation.setUserId(userId); + relation.setRoleId(request.getUserRoleId()); + relation.setSourceId(request.getOrganizationId()); + relation.setCreateTime(System.currentTimeMillis()); + relation.setCreateUser(createUserId); + userRoleRelationMapper.insert(relation); + }); } public void removeMember(OrganizationUserRoleMemberEditRequest request) { - checkMemberParam(request.getUserId(), request.getUserRoleId()); + String removeUserId = request.getUserIds().get(0); + checkMemberParam(removeUserId, request.getUserRoleId()); UserRoleRelationExample example = new UserRoleRelationExample(); - example.createCriteria().andUserIdEqualTo(request.getUserId()) + example.createCriteria().andUserIdEqualTo(removeUserId) .andRoleIdEqualTo(request.getUserRoleId()) .andSourceIdEqualTo(request.getOrganizationId()); userRoleRelationMapper.deleteByExample(example); diff --git a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/OrganizationUserRoleControllerTests.java b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/OrganizationUserRoleControllerTests.java index 268776c640..437c8aa2a2 100644 --- a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/OrganizationUserRoleControllerTests.java +++ b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/OrganizationUserRoleControllerTests.java @@ -267,7 +267,7 @@ public class OrganizationUserRoleControllerTests extends BaseTest { OrganizationUserRoleMemberRequest request = new OrganizationUserRoleMemberRequest(); request.setOrganizationId("default-organization-2"); request.setUserRoleId("default-org-role-id-3"); - request.setUserName("admin"); + request.setKeyword("admin"); request.setCurrent(1); request.setPageSize(10); MvcResult mvcResult = this.responsePost(ORGANIZATION_USER_ROLE_LIST_MEMBER, request); @@ -287,8 +287,8 @@ public class OrganizationUserRoleControllerTests extends BaseTest { List userList = JSON.parseArray(JSON.toJSONString(pageData.getList()), User.class); if(CollectionUtils.isNotEmpty(userList)) { User user = userList.get(0); - Assertions.assertTrue(StringUtils.contains(user.getName(), request.getUserName()) - || StringUtils.contains(user.getId(), request.getUserName())); + Assertions.assertTrue(StringUtils.contains(user.getName(), request.getKeyword()) + || StringUtils.contains(user.getId(), request.getKeyword())); } } @@ -317,7 +317,7 @@ public class OrganizationUserRoleControllerTests extends BaseTest { OrganizationUserRoleMemberEditRequest request = new OrganizationUserRoleMemberEditRequest(); request.setOrganizationId("default-organization-2"); request.setUserRoleId("default-org-role-id-3"); - request.setUserId("admin"); + request.setUserIds(List.of("admin")); this.requestPost(ORGANIZATION_USER_ROLE_ADD_MEMBER, request, status().isOk()); } @@ -326,13 +326,13 @@ public class OrganizationUserRoleControllerTests extends BaseTest { public void testOrganizationUserRoleAddMemberError() throws Exception { OrganizationUserRoleMemberEditRequest request = new OrganizationUserRoleMemberEditRequest(); request.setOrganizationId("default-organization-2"); - request.setUserId("admin-x"); + request.setUserIds(List.of("admin-x")); request.setUserRoleId("default-org-role-id-3"); // 用户不存在 this.requestPost(ORGANIZATION_USER_ROLE_ADD_MEMBER, request, status().is5xxServerError()); request = new OrganizationUserRoleMemberEditRequest(); request.setOrganizationId("default-organization-2"); - request.setUserId("admin"); + request.setUserIds(List.of("admin")); request.setUserRoleId("default-org-role-id-x"); // 用户组不存在 this.requestPost(ORGANIZATION_USER_ROLE_ADD_MEMBER, request, status().is5xxServerError()); @@ -344,7 +344,7 @@ public class OrganizationUserRoleControllerTests extends BaseTest { OrganizationUserRoleMemberEditRequest request = new OrganizationUserRoleMemberEditRequest(); request.setOrganizationId("default-organization-2"); request.setUserRoleId("default-org-role-id-3"); - request.setUserId("admin"); + request.setUserIds(List.of("admin")); this.requestPost(ORGANIZATION_USER_ROLE_REMOVE_MEMBER, request, status().isOk()); } @@ -353,13 +353,13 @@ public class OrganizationUserRoleControllerTests extends BaseTest { public void testOrganizationUserRoleRemoveMemberError() throws Exception { OrganizationUserRoleMemberEditRequest request = new OrganizationUserRoleMemberEditRequest(); request.setOrganizationId("default-organization-2"); - request.setUserId("admin-x"); + request.setUserIds(List.of("admin-x")); request.setUserRoleId("default-org-role-id-3"); // 用户不存在 this.requestPost(ORGANIZATION_USER_ROLE_REMOVE_MEMBER, request, status().is5xxServerError()); request = new OrganizationUserRoleMemberEditRequest(); request.setOrganizationId("default-organization-2"); - request.setUserId("admin"); + request.setUserIds(List.of("admin")); request.setUserRoleId("default-org-role-id-x"); // 用户组不存在 this.requestPost(ORGANIZATION_USER_ROLE_REMOVE_MEMBER, request, status().is5xxServerError()); diff --git a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/SystemOrganizationControllerTests.java b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/SystemOrganizationControllerTests.java index 541394bd3e..a0f1315a33 100644 --- a/backend/services/system-setting/src/test/java/io/metersphere/system/controller/SystemOrganizationControllerTests.java +++ b/backend/services/system-setting/src/test/java/io/metersphere/system/controller/SystemOrganizationControllerTests.java @@ -25,10 +25,7 @@ import org.springframework.test.web.servlet.ResultMatcher; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; import java.nio.charset.StandardCharsets; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.Map; +import java.util.*; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content; @@ -210,7 +207,7 @@ public class SystemOrganizationControllerTests extends BaseTest{ public void testAddOrganizationMemberSuccess() throws Exception { OrganizationMemberRequest organizationMemberRequest = new OrganizationMemberRequest(); organizationMemberRequest.setOrganizationId("default-organization-3"); - organizationMemberRequest.setMemberIds(Arrays.asList("admin", "default-admin")); + organizationMemberRequest.setMemberIds(List.of("admin", "default-admin")); this.requestPost(ORGANIZATION_ADD_MEMBER, organizationMemberRequest, status().isOk()); // 批量添加成员成功后, 验证是否添加成功 OrganizationRequest organizationRequest = new OrganizationRequest(); @@ -243,7 +240,7 @@ public class SystemOrganizationControllerTests extends BaseTest{ public void testAddOrganizationMemberSuccessWithRepeatUser() throws Exception { OrganizationMemberRequest organizationMemberRequest = new OrganizationMemberRequest(); organizationMemberRequest.setOrganizationId("default-organization-3"); - organizationMemberRequest.setMemberIds(Arrays.asList("admin", "admin","default-admin")); + organizationMemberRequest.setMemberIds(List.of("admin")); this.requestPost(ORGANIZATION_ADD_MEMBER, organizationMemberRequest, status().isOk()); // 批量添加成员成功后, 验证是否添加成功 OrganizationRequest organizationRequest = new OrganizationRequest();