diff --git a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtGroupMapper.xml b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtGroupMapper.xml index 1a16905c06..c8ea689d6d 100644 --- a/backend/src/main/java/io/metersphere/base/mapper/ext/ExtGroupMapper.xml +++ b/backend/src/main/java/io/metersphere/base/mapper/ext/ExtGroupMapper.xml @@ -4,7 +4,8 @@ + \ No newline at end of file diff --git a/backend/src/main/java/io/metersphere/controller/GroupController.java b/backend/src/main/java/io/metersphere/controller/GroupController.java index dfc0345dbd..712b0e03ad 100644 --- a/backend/src/main/java/io/metersphere/controller/GroupController.java +++ b/backend/src/main/java/io/metersphere/controller/GroupController.java @@ -1,11 +1,16 @@ package io.metersphere.controller; +import com.github.pagehelper.Page; +import com.github.pagehelper.PageHelper; import io.metersphere.base.domain.Group; import io.metersphere.base.domain.Organization; +import io.metersphere.base.domain.User; import io.metersphere.commons.constants.PermissionConstants; +import io.metersphere.commons.utils.PageUtils; import io.metersphere.commons.utils.Pager; import io.metersphere.controller.request.GroupRequest; import io.metersphere.controller.request.group.EditGroupRequest; +import io.metersphere.controller.request.group.EditGroupUserRequest; import io.metersphere.dto.GroupDTO; import io.metersphere.dto.GroupPermissionDTO; import io.metersphere.service.GroupService; @@ -106,4 +111,30 @@ public class GroupController { public List getResource(@PathVariable String type, @PathVariable String id) { return groupService.getResource(type, id); } + + @PostMapping("/user/{goPage}/{pageSize}") + public Pager> getGroupUser(@PathVariable int goPage, @PathVariable int pageSize, @RequestBody EditGroupRequest editGroupRequest) { + Page page = PageHelper.startPage(goPage, pageSize, true); + return PageUtils.setPageInfo(page, groupService.getGroupUser(editGroupRequest)); + } + + @GetMapping("/rm/{userId}/{groupId}") + public void removeGroupMember(@PathVariable String userId, @PathVariable String groupId) { + groupService.removeGroupMember(userId, groupId); + } + + @GetMapping("/source/{userId}/{groupId}") + public List getGroupSource(@PathVariable String userId, @PathVariable String groupId) { + return groupService.getGroupSource(userId, groupId); + } + + @PostMapping("/add/member") + public void addGroupUser(@RequestBody EditGroupUserRequest request) { + groupService.addGroupUser(request); + } + + @PostMapping("/edit/member") + public void editGroupUser(@RequestBody EditGroupUserRequest request) { + groupService.editGroupUser(request); + } } diff --git a/backend/src/main/java/io/metersphere/controller/request/group/EditGroupUserRequest.java b/backend/src/main/java/io/metersphere/controller/request/group/EditGroupUserRequest.java new file mode 100644 index 0000000000..98aec50f0f --- /dev/null +++ b/backend/src/main/java/io/metersphere/controller/request/group/EditGroupUserRequest.java @@ -0,0 +1,14 @@ +package io.metersphere.controller.request.group; + +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class EditGroupUserRequest { + private List userIds; + private List sourceIds; + private String groupId; +} diff --git a/backend/src/main/java/io/metersphere/dto/GroupDTO.java b/backend/src/main/java/io/metersphere/dto/GroupDTO.java index f1716e1fb8..010ecdedbf 100644 --- a/backend/src/main/java/io/metersphere/dto/GroupDTO.java +++ b/backend/src/main/java/io/metersphere/dto/GroupDTO.java @@ -8,4 +8,5 @@ import lombok.Setter; @Setter public class GroupDTO extends Group { private String scopeName; + private Long memberSize; } diff --git a/backend/src/main/java/io/metersphere/service/GroupService.java b/backend/src/main/java/io/metersphere/service/GroupService.java index d50f0507f3..16cb617a7f 100644 --- a/backend/src/main/java/io/metersphere/service/GroupService.java +++ b/backend/src/main/java/io/metersphere/service/GroupService.java @@ -14,7 +14,9 @@ import io.metersphere.commons.user.SessionUser; import io.metersphere.commons.utils.*; import io.metersphere.controller.request.GroupRequest; import io.metersphere.controller.request.group.EditGroupRequest; +import io.metersphere.controller.request.group.EditGroupUserRequest; import io.metersphere.dto.*; +import io.metersphere.i18n.Translator; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; @@ -57,6 +59,8 @@ public class GroupService { @Resource private ProjectMapper projectMapper; + private static final String GLOBAL = "global"; + private static final Map> map = new HashMap>(4){{ put(UserGroupType.SYSTEM, Arrays.asList(UserGroupType.SYSTEM, UserGroupType.ORGANIZATION, UserGroupType.WORKSPACE, UserGroupType.PROJECT)); put(UserGroupType.ORGANIZATION, Arrays.asList(UserGroupType.ORGANIZATION, UserGroupType.WORKSPACE, UserGroupType.PROJECT)); @@ -83,7 +87,7 @@ public class GroupService { group.setCreateTime(System.currentTimeMillis()); group.setUpdateTime(System.currentTimeMillis()); if (BooleanUtils.isTrue(request.getGlobal())) { - group.setScopeId("global"); + group.setScopeId(GLOBAL); } else { group.setScopeId(request.getScopeId()); } @@ -237,7 +241,7 @@ public class GroupService { public List getGroupsByType(GroupRequest request) { String resourceId = request.getResourceId(); String type = request.getType(); - List scopeList = Arrays.asList("global", resourceId); + List scopeList = Arrays.asList(GLOBAL, resourceId); GroupExample groupExample = new GroupExample(); groupExample.createCriteria().andScopeIdIn(scopeList) .andTypeEqualTo(type); @@ -300,7 +304,7 @@ public class GroupService { private Pager> getUserGroup(String groupType, EditGroupRequest request) { List types; String orgId = SessionUtils.getCurrentOrganizationId(); - List scopes = Arrays.asList("global", orgId); + List scopes = Arrays.asList(GLOBAL, orgId); int goPage = request.getGoPage(); int pageSize = request.getPageSize(); Page page = PageHelper.startPage(goPage, pageSize, true); @@ -348,11 +352,11 @@ public class GroupService { return groupMapper.selectByExample(new GroupExample()); } - public List getResource(String type, String groupId) { + public List getResource(String type, String groupId) { List resource = new ArrayList<>(); Group group = groupMapper.selectByPrimaryKey(groupId); String orgId = group.getScopeId(); - if (!StringUtils.equals("global", orgId)) { + if (!StringUtils.equals(GLOBAL, orgId)) { Organization organization = organizationMapper.selectByPrimaryKey(orgId); if (organization == null) { return resource; @@ -362,7 +366,7 @@ public class GroupService { if (StringUtils.equals(UserGroupType.ORGANIZATION, type)) { OrganizationExample organizationExample = new OrganizationExample(); OrganizationExample.Criteria criteria = organizationExample.createCriteria(); - if (!StringUtils.equals(orgId, "global")) { + if (!StringUtils.equals(orgId, GLOBAL)) { criteria.andIdEqualTo(orgId); } return organizationMapper.selectByExample(organizationExample); @@ -371,7 +375,7 @@ public class GroupService { if (StringUtils.equals(UserGroupType.WORKSPACE, type)) { WorkspaceExample workspaceExample = new WorkspaceExample(); WorkspaceExample.Criteria criteria = workspaceExample.createCriteria(); - if (!StringUtils.equals(orgId, "global")) { + if (!StringUtils.equals(orgId, GLOBAL)) { criteria.andOrganizationIdEqualTo(orgId); } return workspaceMapper.selectByExample(workspaceExample); @@ -382,7 +386,7 @@ public class GroupService { ProjectExample.Criteria pc = projectExample.createCriteria(); WorkspaceExample workspaceExample = new WorkspaceExample(); WorkspaceExample.Criteria criteria = workspaceExample.createCriteria(); - if (!StringUtils.equals(orgId, "global")) { + if (!StringUtils.equals(orgId, GLOBAL)) { criteria.andOrganizationIdEqualTo(orgId); List workspaces = workspaceMapper.selectByExample(workspaceExample); List list = workspaces.stream().map(Workspace::getId).collect(Collectors.toList()); @@ -393,4 +397,125 @@ public class GroupService { return resource; } + + public List getGroupUser(EditGroupRequest request) { + return extUserGroupMapper.getGroupUser(request); + } + + public void removeGroupMember(String userId, String groupId) { + UserGroupExample userGroupExample = new UserGroupExample(); + userGroupExample.createCriteria() + .andGroupIdEqualTo(groupId) + .andUserIdEqualTo(userId); + userGroupMapper.deleteByExample(userGroupExample); + } + + public List getGroupSource(String userId, String groupId) { + UserGroupExample userGroupExample = new UserGroupExample(); + userGroupExample.createCriteria().andUserIdEqualTo(userId).andGroupIdEqualTo(groupId); + List userGroups = userGroupMapper.selectByExample(userGroupExample); + List sources = userGroups.stream().map(UserGroup::getSourceId).collect(Collectors.toList()); + if (sources.isEmpty()) { + return new ArrayList<>(); + } + + Group group = groupMapper.selectByPrimaryKey(groupId); + String type = group.getType(); + + if (StringUtils.equals(type, UserGroupType.ORGANIZATION)) { + OrganizationExample organizationExample = new OrganizationExample(); + organizationExample.createCriteria().andIdIn(sources); + return organizationMapper.selectByExample(organizationExample); + } + + if (StringUtils.equals(type, UserGroupType.WORKSPACE)) { + WorkspaceExample workspaceExample = new WorkspaceExample(); + workspaceExample.createCriteria().andIdIn(sources); + return workspaceMapper.selectByExample(workspaceExample); + } + + if (StringUtils.equals(type, UserGroupType.PROJECT)) { + ProjectExample projectExample = new ProjectExample(); + projectExample.createCriteria().andIdIn(sources); + return projectMapper.selectByExample(projectExample); + } + + return new ArrayList<>(); + } + + public void addGroupUser(EditGroupUserRequest request) { + String groupId = request.getGroupId(); + Group group = groupMapper.selectByPrimaryKey(groupId); + List userIds = request.getUserIds(); + for (String userId : userIds) { + UserGroupExample userGroupExample = new UserGroupExample(); + userGroupExample.createCriteria().andUserIdEqualTo(userId) + .andGroupIdEqualTo(groupId); + List userGroups = userGroupMapper.selectByExample(userGroupExample); + if (userGroups.size() > 0) { + MSException.throwException(Translator.get("user_already_exists") + ": " + userId); + } else { + this.addGroupUser(group, userId, request.getSourceIds()); + } + } + } + + private void addGroupUser(Group group, String userId, List sourceIds) { + String id = group.getId(); + String type = group.getType(); + if (StringUtils.equals(type, UserGroupType.SYSTEM)) { + UserGroup userGroup = new UserGroup(); + userGroup.setId(UUID.randomUUID().toString()); + userGroup.setUserId(userId); + userGroup.setGroupId(id); + userGroup.setSourceId("system"); + userGroup.setCreateTime(System.currentTimeMillis()); + userGroup.setUpdateTime(System.currentTimeMillis()); + userGroupMapper.insertSelective(userGroup); + } else { + SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); + UserGroupMapper mapper = sqlSession.getMapper(UserGroupMapper.class); + for (String sourceId : sourceIds) { + UserGroup userGroup = new UserGroup(); + userGroup.setId(UUID.randomUUID().toString()); + userGroup.setUserId(userId); + userGroup.setGroupId(id); + userGroup.setSourceId(sourceId); + userGroup.setCreateTime(System.currentTimeMillis()); + userGroup.setUpdateTime(System.currentTimeMillis()); + mapper.insertSelective(userGroup); + } + sqlSession.flushStatements(); + } + } + + public void editGroupUser(EditGroupUserRequest request) { + String groupId = request.getGroupId(); + Group group = groupMapper.selectByPrimaryKey(groupId); + if (!StringUtils.equals(group.getType(), UserGroupType.SYSTEM)) { + List userIds = request.getUserIds(); + if (CollectionUtils.isNotEmpty(userIds)) { + // 编辑单个用户 + String userId = userIds.get(0); + List sourceIds = request.getSourceIds(); + UserGroupExample userGroupExample = new UserGroupExample(); + userGroupExample.createCriteria().andGroupIdEqualTo(groupId).andUserIdEqualTo(userId); + userGroupMapper.deleteByExample(userGroupExample); + + SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH); + UserGroupMapper mapper = sqlSession.getMapper(UserGroupMapper.class); + for (String sourceId : sourceIds) { + UserGroup userGroup = new UserGroup(); + userGroup.setId(UUID.randomUUID().toString()); + userGroup.setUserId(userId); + userGroup.setGroupId(groupId); + userGroup.setSourceId(sourceId); + userGroup.setCreateTime(System.currentTimeMillis()); + userGroup.setUpdateTime(System.currentTimeMillis()); + mapper.insertSelective(userGroup); + } + sqlSession.flushStatements(); + } + } + } } diff --git a/frontend/src/business/components/common/components/MsTableOperator.vue b/frontend/src/business/components/common/components/MsTableOperator.vue index 44d5acdf57..582b25bbec 100644 --- a/frontend/src/business/components/common/components/MsTableOperator.vue +++ b/frontend/src/business/components/common/components/MsTableOperator.vue @@ -1,7 +1,7 @@