From 4e1143485a4c0445ad79d9965f8f470524ad77c2 Mon Sep 17 00:00:00 2001 From: Thomasr Date: Tue, 5 Nov 2024 03:38:27 -0500 Subject: [PATCH 1/2] add group admin count and user count to list api --- .../usermanagement/GroupApiServiceImpl.java | 21 ++++++++++++++++--- .../api/usermanagement/GroupController.java | 2 +- .../api/usermanagement/view/GroupView.java | 6 +++++- 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java index cea11c0a3..3294257c2 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java @@ -12,6 +12,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; import com.github.f4b6a3.uuid.UuidCreator; import lombok.RequiredArgsConstructor; @@ -35,6 +36,7 @@ import org.lowcoder.sdk.exception.BizError; import org.springframework.stereotype.Service; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.util.function.Tuple2; @@ -189,7 +191,14 @@ public Mono> getGroups() { } return groupService.getByOrgId(orgId) .sort() - .flatMapSequential(group -> GroupView.from(group, memberRole.getValue())) + .flatMapSequential(group -> groupMemberService.getAllGroupAdmin(group.getId()) + .zipWith(groupMemberService.getGroupMembers(group.getId(), 0, -1)) + .flatMap(tuple -> { + var adminMembers = tuple.getT1(); + var users = tuple.getT2(); + return GroupView.from(group, memberRole.getValue(), adminMembers.size(), users.size()); + }) + ) .collectList(); } return groupMemberService.getUserGroupMembersInOrg(orgId, orgMember.getUserId()) @@ -198,8 +207,14 @@ public Mono> getGroups() { Map groupMemberMap = collectMap(groupMembers, GroupMember::getGroupId, it -> it); return groupService.getByIds(groupIds) .sort() - .flatMapSequential(group -> GroupView.from(group, - groupMemberMap.get(group.getId()).getRole().getValue())) + .flatMapSequential(group -> { + var adminMembers = groupMembers.stream().filter(groupMember -> groupMember.getGroupId().equals(group.getId()) && groupMember.getRole() == MemberRole.ADMIN).toList(); + var allMembers = groupMembers.stream().filter(groupMember -> groupMember.getGroupId().equals(group.getId())).toList(); + return GroupView.from(group, + groupMemberMap.get(group.getId()).getRole().getValue(), + allMembers.size(), + adminMembers.size()); + }) .collectList(); }); }); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java index 82d4b7f5b..65e38befa 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java @@ -51,7 +51,7 @@ public class GroupController implements GroupEndpoints public Mono> create(@Valid @RequestBody CreateGroupRequest newGroup) { return groupApiService.create(newGroup) .delayUntil(group -> businessEventPublisher.publishGroupCreateEvent(group)) - .flatMap(group -> GroupView.from(group, MemberRole.ADMIN.getValue())) + .flatMap(group -> GroupView.from(group, MemberRole.ADMIN.getValue(), 1, 1)) .map(ResponseView::success); } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupView.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupView.java index 7cf9a1c77..18cd19c06 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupView.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupView.java @@ -23,8 +23,10 @@ public class GroupView { private String dynamicRule; private boolean isSyncGroup; private boolean isSyncDelete; + private int adminUserCount; + private int userCount; - public static Mono from(Group group, String memberRole) { + public static Mono from(Group group, String memberRole, int adminCount, int userCount) { return Mono.deferContextual(contextView -> { Locale locale = LocaleUtils.getLocale(contextView); GroupView groupView = GroupView.builder() @@ -38,6 +40,8 @@ public static Mono from(Group group, String memberRole) { .dynamicRule(group.getDynamicRule()) .isSyncGroup(group.isSyncGroup()) .isSyncDelete(group.isSyncDeleted()) + .adminUserCount(adminCount) + .userCount(userCount) .build(); return Mono.just(groupView); }); From 831abed92397efe9ce7c24358358a9be399d2bff Mon Sep 17 00:00:00 2001 From: Thomasr Date: Tue, 5 Nov 2024 09:54:04 -0500 Subject: [PATCH 2/2] modify admin user count for all user group --- .../usermanagement/GroupApiServiceImpl.java | 33 +++++++++++++++---- 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java index 3294257c2..c54c3f526 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java @@ -30,6 +30,8 @@ import org.lowcoder.domain.group.service.GroupService; import org.lowcoder.domain.organization.model.MemberRole; import org.lowcoder.domain.organization.model.OrgMember; +import org.lowcoder.domain.organization.service.OrgMemberService; +import org.lowcoder.domain.organization.service.OrganizationService; import org.lowcoder.domain.user.model.User; import org.lowcoder.domain.user.service.UserService; import org.lowcoder.infra.util.TupleUtils; @@ -50,6 +52,8 @@ public class GroupApiServiceImpl implements GroupApiService { private final UserService userService; private final GroupService groupService; private final AbstractBizThresholdChecker bizThresholdChecker; + private final OrganizationService organizationService; + private final OrgMemberService orgMemberService; @Override public Mono getGroupMembers(String groupId, int page, int count) { @@ -182,6 +186,7 @@ public Mono> getGroups() { return sessionUserService.getVisitorOrgMemberCache() .flatMap(orgMember -> { String orgId = orgMember.getOrgId(); + Mono orgAdminCountMono = orgMemberService.getAllOrgAdmins(orgId).map(List::size); if (orgMember.isAdmin() || orgMember.isSuperAdmin()) { MemberRole memberRole; if(orgMember.isAdmin()) { @@ -193,16 +198,25 @@ public Mono> getGroups() { .sort() .flatMapSequential(group -> groupMemberService.getAllGroupAdmin(group.getId()) .zipWith(groupMemberService.getGroupMembers(group.getId(), 0, -1)) + .zipWith(orgAdminCountMono, TupleUtils::merge) .flatMap(tuple -> { var adminMembers = tuple.getT1(); var users = tuple.getT2(); - return GroupView.from(group, memberRole.getValue(), adminMembers.size(), users.size()); + var orgAdminCount = tuple.getT3(); + if(group.isAllUsersGroup()) { + return GroupView.from(group, memberRole.getValue(), orgAdminCount, users.size()); + } else { + return GroupView.from(group, memberRole.getValue(), adminMembers.size(), users.size()); + } }) ) .collectList(); } return groupMemberService.getUserGroupMembersInOrg(orgId, orgMember.getUserId()) - .flatMap(groupMembers -> { + .zipWith(orgAdminCountMono) + .flatMap(tuple -> { + List groupMembers = tuple.getT1(); + int orgAdminCount = tuple.getT2(); List groupIds = collectList(groupMembers, GroupMember::getGroupId); Map groupMemberMap = collectMap(groupMembers, GroupMember::getGroupId, it -> it); return groupService.getByIds(groupIds) @@ -210,10 +224,17 @@ public Mono> getGroups() { .flatMapSequential(group -> { var adminMembers = groupMembers.stream().filter(groupMember -> groupMember.getGroupId().equals(group.getId()) && groupMember.getRole() == MemberRole.ADMIN).toList(); var allMembers = groupMembers.stream().filter(groupMember -> groupMember.getGroupId().equals(group.getId())).toList(); - return GroupView.from(group, - groupMemberMap.get(group.getId()).getRole().getValue(), - allMembers.size(), - adminMembers.size()); + if(group.isAllUsersGroup()) { + return GroupView.from(group, + groupMemberMap.get(group.getId()).getRole().getValue(), + orgAdminCount, + allMembers.size()); + } else { + return GroupView.from(group, + groupMemberMap.get(group.getId()).getRole().getValue(), + adminMembers.size(), + allMembers.size()); + } }) .collectList(); });