Skip to content

Commit 012532f

Browse files
authored
Merge branch 'dev' into feat_auth_flow
2 parents f838d86 + 5022ecf commit 012532f

File tree

5 files changed

+87
-38
lines changed

5 files changed

+87
-38
lines changed

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ public Mono<List<GroupView>> getGroups() {
186186
return sessionUserService.getVisitorOrgMemberCache()
187187
.flatMap(orgMember -> {
188188
String orgId = orgMember.getOrgId();
189-
Mono<Integer> orgAdminCountMono = orgMemberService.getAllOrgAdmins(orgId).map(List::size);
189+
Mono<List<OrgMember>> orgAdminsMono = orgMemberService.getAllOrgAdmins(orgId);
190190
if (orgMember.isAdmin() || orgMember.isSuperAdmin()) {
191191
MemberRole memberRole;
192192
if(orgMember.isAdmin()) {
@@ -196,44 +196,45 @@ public Mono<List<GroupView>> getGroups() {
196196
}
197197
return groupService.getByOrgId(orgId)
198198
.sort()
199-
.flatMapSequential(group -> groupMemberService.getAllGroupAdmin(group.getId())
200-
.zipWith(groupMemberService.getGroupMembers(group.getId(), 0, -1))
201-
.zipWith(orgAdminCountMono, TupleUtils::merge)
199+
.flatMapSequential(group -> groupMemberService.getGroupMembers(group.getId(), 0, -1)
200+
.zipWith(orgAdminsMono)
202201
.flatMap(tuple -> {
203-
var adminMembers = tuple.getT1();
204-
var users = tuple.getT2();
205-
var orgAdminCount = tuple.getT3();
202+
var users = tuple.getT1().stream().filter(user -> user.getRole() != MemberRole.SUPER_ADMIN).toList();
203+
var orgAdmins = tuple.getT2();
204+
var adminMembers = orgAdmins.stream().filter(orgAdmin -> users.stream().anyMatch(member -> member.getUserId().equals(orgAdmin.getUserId()))).toList();
206205
if(group.isAllUsersGroup()) {
207-
return GroupView.from(group, memberRole.getValue(), orgAdminCount, users.size());
206+
return GroupView.from(group, memberRole.getValue(), orgAdmins.size(), users.size(), users.stream().map(GroupMember::getUserId).toList());
208207
} else {
209-
return GroupView.from(group, memberRole.getValue(), adminMembers.size(), users.size());
208+
return GroupView.from(group, memberRole.getValue(), adminMembers.size(), users.size(), users.stream().map(GroupMember::getUserId).toList());
210209
}
211210
})
212211
)
213212
.collectList();
214213
}
215214
return groupMemberService.getUserGroupMembersInOrg(orgId, orgMember.getUserId())
216-
.zipWith(orgAdminCountMono)
215+
.zipWith(orgAdminsMono)
217216
.flatMap(tuple -> {
218217
List<GroupMember> groupMembers = tuple.getT1();
219-
int orgAdminCount = tuple.getT2();
218+
List<OrgMember> orgAdmins = tuple.getT2();
220219
List<String> groupIds = collectList(groupMembers, GroupMember::getGroupId);
221220
Map<String, GroupMember> groupMemberMap = collectMap(groupMembers, GroupMember::getGroupId, it -> it);
222221
return groupService.getByIds(groupIds)
223222
.sort()
224223
.flatMapSequential(group -> {
225-
var adminMembers = groupMembers.stream().filter(groupMember -> groupMember.getGroupId().equals(group.getId()) && groupMember.getRole() == MemberRole.ADMIN).toList();
226-
var allMembers = groupMembers.stream().filter(groupMember -> groupMember.getGroupId().equals(group.getId())).toList();
224+
var allMembers = groupMembers.stream().filter(groupMember -> groupMember.getGroupId().equals(group.getId()) && groupMember.getRole() != MemberRole.SUPER_ADMIN).toList();
225+
var adminMembers = orgAdmins.stream().filter(orgAdmin -> allMembers.stream().anyMatch(member -> member.getUserId().equals(orgAdmin.getUserId()))).toList();
227226
if(group.isAllUsersGroup()) {
228227
return GroupView.from(group,
229228
groupMemberMap.get(group.getId()).getRole().getValue(),
230-
orgAdminCount,
231-
allMembers.size());
229+
orgAdmins.size(),
230+
allMembers.size(),
231+
allMembers.stream().map(GroupMember::getUserId).toList());
232232
} else {
233233
return GroupView.from(group,
234234
groupMemberMap.get(group.getId()).getRole().getValue(),
235235
adminMembers.size(),
236-
allMembers.size());
236+
allMembers.size(),
237+
allMembers.stream().map(GroupMember::getUserId).toList());
237238
}
238239
})
239240
.collectList();

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java

Lines changed: 41 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,15 @@
99
import org.apache.commons.lang3.StringUtils;
1010
import org.lowcoder.api.framework.view.ResponseView;
1111
import org.lowcoder.api.home.SessionUserService;
12-
import org.lowcoder.api.usermanagement.view.AddMemberRequest;
13-
import org.lowcoder.api.usermanagement.view.CreateGroupRequest;
14-
import org.lowcoder.api.usermanagement.view.GroupMemberAggregateView;
15-
import org.lowcoder.api.usermanagement.view.GroupView;
16-
import org.lowcoder.api.usermanagement.view.UpdateGroupRequest;
17-
import org.lowcoder.api.usermanagement.view.UpdateRoleRequest;
12+
import org.lowcoder.api.usermanagement.view.*;
1813
import org.lowcoder.api.util.BusinessEventPublisher;
1914
import org.lowcoder.api.util.GidService;
15+
import org.lowcoder.domain.group.model.GroupMember;
2016
import org.lowcoder.domain.group.service.GroupMemberService;
2117
import org.lowcoder.domain.group.service.GroupService;
2218
import org.lowcoder.domain.organization.model.MemberRole;
19+
import org.lowcoder.domain.organization.model.OrgMember;
20+
import org.lowcoder.domain.organization.service.OrgMemberService;
2321
import org.lowcoder.sdk.exception.BizError;
2422
import org.springframework.beans.factory.annotation.Autowired;
2523
import org.springframework.web.bind.annotation.PathVariable;
@@ -46,12 +44,14 @@ public class GroupController implements GroupEndpoints
4644
private GroupService groupService;
4745
@Autowired
4846
private GidService gidService;
47+
@Autowired
48+
private OrgMemberService orgMemberService;
4949

5050
@Override
5151
public Mono<ResponseView<GroupView>> create(@Valid @RequestBody CreateGroupRequest newGroup) {
5252
return groupApiService.create(newGroup)
5353
.delayUntil(group -> businessEventPublisher.publishGroupCreateEvent(group))
54-
.flatMap(group -> GroupView.from(group, MemberRole.ADMIN.getValue(), 1, 1))
54+
.flatMap(group -> GroupView.from(group, MemberRole.ADMIN.getValue(), 1, 1, List.of()))
5555
.map(ResponseView::success);
5656
}
5757

@@ -75,9 +75,40 @@ public Mono<ResponseView<Boolean>> delete(@PathVariable String groupId) {
7575
}
7676

7777
@Override
78-
public Mono<ResponseView<List<GroupView>>> getOrgGroups() {
79-
return groupApiService.getGroups()
80-
.map(ResponseView::success);
78+
public Mono<GroupListResponseView<List<GroupView>>> getOrgGroups() {
79+
return groupApiService.getGroups().flatMap(groupList -> {
80+
if(groupList.isEmpty()) return Mono.just(new GroupListResponseView<>(ResponseView.SUCCESS,
81+
"", List.of(), 0, 0, 0, 0));
82+
return sessionUserService.getVisitorOrgMemberCache()
83+
.map(OrgMember::getOrgId)
84+
.flatMap(orgId -> orgMemberService.getOrganizationMembers(orgId)
85+
.collectList()
86+
.zipWith(groupService.getDevGroup(orgId).flatMap(devGroup -> groupMemberService.getGroupMembers(devGroup.getId(), 0, -1)))
87+
.map(tuple -> {
88+
List<OrgMember> orgMembers = tuple.getT1();
89+
List<GroupMember> devMembers = tuple.getT2();
90+
int totalAdmins = orgMembers.stream().filter(OrgMember::isAdmin).toList().size();
91+
int totalAdminsAndDevelopers = orgMembers.stream()
92+
.filter(orgMember -> orgMember.isAdmin() ||
93+
devMembers.stream().anyMatch(devMember -> devMember.getUserId().equals(orgMember.getUserId()))).toList().size();
94+
int totalDevelopersOnly = orgMembers.stream()
95+
.filter(orgMember -> !orgMember.isAdmin() && !orgMember.isSuperAdmin() &&
96+
devMembers.stream().anyMatch(devMember -> devMember.getUserId().equals(orgMember.getUserId()))).toList().size();
97+
int totalOtherMembers = orgMembers.stream()
98+
.filter(orgMember -> !orgMember.isAdmin() && !orgMember.isSuperAdmin() &&
99+
devMembers.stream().noneMatch(devMember -> devMember.getUserId().equals(orgMember.getUserId()))).toList().size();
100+
101+
return new GroupListResponseView<>(ResponseView.SUCCESS,
102+
"",
103+
groupList,
104+
totalAdmins,
105+
totalAdminsAndDevelopers,
106+
totalDevelopersOnly,
107+
totalOtherMembers);
108+
})
109+
);
110+
}
111+
);
81112
}
82113

83114

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,7 @@
55
import jakarta.validation.Valid;
66

77
import org.lowcoder.api.framework.view.ResponseView;
8-
import org.lowcoder.api.usermanagement.view.AddMemberRequest;
9-
import org.lowcoder.api.usermanagement.view.CreateGroupRequest;
10-
import org.lowcoder.api.usermanagement.view.GroupMemberAggregateView;
11-
import org.lowcoder.api.usermanagement.view.GroupView;
12-
import org.lowcoder.api.usermanagement.view.UpdateGroupRequest;
13-
import org.lowcoder.api.usermanagement.view.UpdateRoleRequest;
8+
import org.lowcoder.api.usermanagement.view.*;
149
import org.lowcoder.infra.constant.NewUrl;
1510
import org.lowcoder.infra.constant.Url;
1611
import org.springframework.web.bind.annotation.DeleteMapping;
@@ -68,7 +63,7 @@ public Mono<ResponseView<Boolean>> update(@PathVariable String groupId,
6863
description = "Retrieve a list of User Groups within Lowcoder, providing an overview of available groups, based on the access rights of the currently impersonated User."
6964
)
7065
@GetMapping("/list")
71-
public Mono<ResponseView<List<GroupView>>> getOrgGroups();
66+
public Mono<GroupListResponseView<List<GroupView>>> getOrgGroups();
7267

7368
@Operation(
7469
tags = TAG_GROUP_MEMBERS,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package org.lowcoder.api.usermanagement.view;
2+
3+
import com.fasterxml.jackson.annotation.JsonInclude;
4+
import lombok.Getter;
5+
import org.lowcoder.api.framework.view.ResponseView;
6+
import org.lowcoder.sdk.exception.BizError;
7+
8+
@JsonInclude(JsonInclude.Include.NON_NULL)
9+
@Getter
10+
public class GroupListResponseView<T> extends ResponseView<T> {
11+
private final int totalAdminsAndDevelopers;
12+
private final int totalDevelopersOnly;
13+
private final int totalAdmins;
14+
private final int totalOtherMembers;
15+
public GroupListResponseView(int code, String message, T data, int totalAdmins, int totalAdminsAndDevelopers, int totalDevelopersOnly, int totalOtherMembers) {
16+
super(code, message, data);
17+
this.totalAdmins = totalAdmins;
18+
this.totalDevelopersOnly = totalDevelopersOnly;
19+
this.totalAdminsAndDevelopers = totalAdminsAndDevelopers;
20+
this.totalOtherMembers = totalOtherMembers;
21+
}
22+
}

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupView.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package org.lowcoder.api.usermanagement.view;
22

3+
import java.util.List;
34
import java.util.Locale;
5+
import java.util.Map;
46

57
import org.lowcoder.domain.group.model.Group;
68
import org.lowcoder.sdk.util.LocaleUtils;
@@ -23,10 +25,9 @@ public class GroupView {
2325
private String dynamicRule;
2426
private boolean isSyncGroup;
2527
private boolean isSyncDelete;
26-
private int adminUserCount;
27-
private int userCount;
28+
private Map<String, Object> stats;
2829

29-
public static Mono<GroupView> from(Group group, String memberRole, int adminCount, int userCount) {
30+
public static Mono<GroupView> from(Group group, String memberRole, int adminCount, int userCount, List<String> users) {
3031
return Mono.deferContextual(contextView -> {
3132
Locale locale = LocaleUtils.getLocale(contextView);
3233
GroupView groupView = GroupView.builder()
@@ -40,8 +41,7 @@ public static Mono<GroupView> from(Group group, String memberRole, int adminCoun
4041
.dynamicRule(group.getDynamicRule())
4142
.isSyncGroup(group.isSyncGroup())
4243
.isSyncDelete(group.isSyncDeleted())
43-
.adminUserCount(adminCount)
44-
.userCount(userCount)
44+
.stats(Map.of("adminUserCount", adminCount, "userCount", userCount, "users", users))
4545
.build();
4646
return Mono.just(groupView);
4747
});

0 commit comments

Comments
 (0)