Skip to content

Commit f4516d2

Browse files
committed
fixed orgmembers with searchMemberName and searchGroupId
1 parent 51b9205 commit f4516d2

File tree

4 files changed

+110
-1
lines changed

4 files changed

+110
-1
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,5 +53,7 @@ public interface OrgApiService {
5353
Mono<ConfigView> getOrganizationConfigs(String orgId);
5454

5555
Mono<Long> getApiUsageCount(String orgId, Boolean lastMonthOnly);
56+
57+
Mono<OrgMemberListView> getOrganizationMembersForSearch(String orgId, String searchMemberName, String searchGroupId, Integer pageNum, Integer pageSize);
5658
}
5759

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

Lines changed: 90 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@
4040
import org.springframework.http.codec.multipart.Part;
4141
import org.springframework.stereotype.Service;
4242
import reactor.core.publisher.Mono;
43+
import reactor.core.publisher.Flux;
44+
import org.lowcoder.domain.group.service.GroupMemberService;
45+
import org.lowcoder.domain.group.model.GroupMember;
4346

4447
import java.util.*;
4548
import java.util.stream.Collectors;
@@ -49,6 +52,8 @@
4952
import static org.lowcoder.sdk.util.ExceptionUtils.deferredError;
5053
import static org.lowcoder.sdk.util.ExceptionUtils.ofError;
5154
import static org.lowcoder.sdk.util.StreamUtils.collectSet;
55+
import reactor.util.function.Tuple2;
56+
import reactor.util.function.Tuples;
5257

5358
@Slf4j
5459
@Service
@@ -72,9 +77,10 @@ public class OrgApiServiceImpl implements OrgApiService {
7277
private GroupService groupService;
7378
@Autowired
7479
private AuthenticationService authenticationService;
75-
7680
@Autowired
7781
private ServerLogService serverLogService;
82+
@Autowired
83+
private GroupMemberService groupMemberService;
7884

7985
@Override
8086
public Mono<OrgMemberListView> getOrganizationMembers(String orgId, int page, int count) {
@@ -84,6 +90,78 @@ public Mono<OrgMemberListView> getOrganizationMembers(String orgId, int page, in
8490
.then(getOrgMemberListView(orgId, page, count));
8591
}
8692

93+
// Update getOrgMemberListViewForSearch to filter by group membership
94+
private Mono<OrgMemberListView> getOrgMemberListViewForSearch(String orgId, String searchMemberName, String searchGroupId, Integer page, Integer pageSize) {
95+
return orgMemberService.getOrganizationMembers(orgId)
96+
.collectList()
97+
.flatMap(orgMembers -> {
98+
List<String> userIds = orgMembers.stream()
99+
.map(OrgMember::getUserId)
100+
.collect(Collectors.toList());
101+
Mono<Map<String, User>> users = userService.getByIds(userIds);
102+
103+
// If searchGroupId is provided, fetch group members
104+
Mono<Set<String>> groupUserIdsMono = StringUtils.isBlank(searchGroupId)
105+
? Mono.just(Collections.emptySet())
106+
: groupMemberService.getGroupMembers(searchGroupId)
107+
.map(list -> list.stream()
108+
.map(GroupMember::getUserId)
109+
.collect(Collectors.toSet()));
110+
111+
return Mono.zip(users, groupUserIdsMono)
112+
.map(tuple -> {
113+
Map<String, User> userMap = tuple.getT1();
114+
Set<String> groupUserIds = tuple.getT2();
115+
116+
var list = orgMembers.stream()
117+
.map(orgMember -> {
118+
User user = userMap.get(orgMember.getUserId());
119+
if (user == null) {
120+
log.warn("user {} not exist and will be removed from the result.", orgMember.getUserId());
121+
return null;
122+
}
123+
return buildOrgMemberView(user, orgMember);
124+
})
125+
.filter(Objects::nonNull)
126+
.filter(orgMemberView -> {
127+
// Filter by name
128+
boolean matchesName = StringUtils.isBlank(searchMemberName) ||
129+
StringUtils.containsIgnoreCase(orgMemberView.getName(), searchMemberName);
130+
131+
// Filter by group
132+
boolean matchesGroup = StringUtils.isBlank(searchGroupId) ||
133+
groupUserIds.contains(orgMemberView.getUserId());
134+
135+
return matchesName && matchesGroup;
136+
})
137+
.collect(Collectors.toList());
138+
var pageTotal = list.size();
139+
list = list.subList((page - 1) * pageSize, pageSize == 0 ? pageTotal : Math.min(page * pageSize, pageTotal));
140+
return Pair.of(list, pageTotal);
141+
});
142+
})
143+
.zipWith(sessionUserService.getVisitorOrgMemberCache())
144+
.map(tuple -> {
145+
List<OrgMemberView> memberViews = tuple.getT1().getLeft();
146+
var pageTotal = tuple.getT1().getRight();
147+
OrgMember orgMember = tuple.getT2();
148+
return OrgMemberListView.builder()
149+
.members(memberViews)
150+
.total(pageTotal)
151+
.pageNum(page)
152+
.pageSize(pageSize)
153+
.visitorRole(orgMember.getRole().getValue())
154+
.build();
155+
});
156+
}
157+
@Override
158+
public Mono<OrgMemberListView> getOrganizationMembersForSearch(String orgId, String searchMemberName, String searchGroupId, Integer page, Integer pageSize) {
159+
return sessionUserService.getVisitorId()
160+
.flatMap(visitorId -> orgMemberService.getOrgMember(orgId, visitorId))
161+
.switchIfEmpty(deferredError(BizError.NOT_AUTHORIZED, "NOT_AUTHORIZED"))
162+
.then(getOrgMemberListViewForSearch(orgId, searchMemberName, searchGroupId, page, pageSize));
163+
}
164+
87165
private Mono<OrgMemberListView> getOrgMemberListView(String orgId, int page, int count) {
88166
return orgMemberService.getOrganizationMembers(orgId)
89167
.collectList()
@@ -136,6 +214,17 @@ protected OrgMemberView build(User user, OrgMember orgMember) {
136214
.rawUserInfos(findRawUserInfos(user, orgId))
137215
.build();
138216
}
217+
protected OrgMemberView buildOrgMemberView(User user, OrgMember orgMember) {
218+
String orgId = orgMember.getOrgId();
219+
return OrgMemberView.builder()
220+
.name(user.getName())
221+
.userId(user.getId())
222+
.role(orgMember.getRole().getValue())
223+
.avatarUrl(user.getAvatarUrl())
224+
.joinTime(orgMember.getJoinTime())
225+
.rawUserInfos(findRawUserInfos(user, orgId))
226+
.build();
227+
}
139228

140229
protected Map<String, Map<String, Object>> findRawUserInfos(User user, String orgId) {
141230
return SetUtils.emptyIfNull(user.getConnections())

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.lowcoder.api.usermanagement.view.UpdateRoleRequest;
1313
import org.lowcoder.api.util.BusinessEventPublisher;
1414
import org.lowcoder.api.util.GidService;
15+
import org.lowcoder.domain.organization.model.OrgMember;
1516
import org.lowcoder.domain.organization.model.Organization;
1617
import org.lowcoder.domain.organization.model.Organization.OrganizationCommonSettings;
1718
import org.lowcoder.domain.organization.service.OrgMemberService;
@@ -117,6 +118,16 @@ public Mono<ResponseView<OrgMemberListView>> getOrgMembers(@PathVariable String
117118
orgApiService.getOrganizationMembers(id, pageNum, pageSize)
118119
.map(ResponseView::success));
119120
}
121+
@Override
122+
public Mono<ResponseView<OrgMemberListView>> getOrgMembersForSearch(@PathVariable String orgId,
123+
@PathVariable String searchMemberName,
124+
@PathVariable String searchGroupId,
125+
@RequestParam(required = false, defaultValue = "1") int pageNum,
126+
@RequestParam(required = false, defaultValue = "1000") int pageSize) {
127+
return gidService.convertOrganizationIdToObjectId(orgId).flatMap(id ->
128+
orgApiService.getOrganizationMembersForSearch(id, searchMemberName, searchGroupId, pageNum, pageSize)
129+
.map(ResponseView::success));
130+
}
120131

121132
@Override
122133
public Mono<ResponseView<Boolean>> updateRoleForMember(@RequestBody UpdateRoleRequest updateRoleRequest,

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,13 @@ public Mono<ResponseView<OrgMemberListView>> getOrgMembers(@PathVariable String
9898
@RequestParam(required = false, defaultValue = "1") int pageNum,
9999
@RequestParam(required = false, defaultValue = "1000") int pageSize);
100100

101+
@GetMapping("/{orgId}/{searchMemberName}/{searchGroupId}/members")
102+
public Mono<ResponseView<OrgMemberListView>> getOrgMembersForSearch(@PathVariable String orgId,
103+
@PathVariable String searchMemberName,
104+
@PathVariable String searchGroupId,
105+
@RequestParam(required = false, defaultValue = "1") int pageNum,
106+
@RequestParam(required = false, defaultValue = "1000") int pageSize);
107+
101108
@Operation(
102109
tags = TAG_ORGANIZATION_MEMBERS,
103110
operationId = "updateOrganizationMemberRole",

0 commit comments

Comments
 (0)