Skip to content

Commit 4cf2c1d

Browse files
dragonpooludomikula
authored andcommitted
fixed orgmembers with searchMemberName and searchGroupId
1 parent 5396230 commit 4cf2c1d

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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy