4040import org .springframework .http .codec .multipart .Part ;
4141import org .springframework .stereotype .Service ;
4242import 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
4447import java .util .*;
4548import java .util .stream .Collectors ;
4952import static org .lowcoder .sdk .util .ExceptionUtils .deferredError ;
5053import static org .lowcoder .sdk .util .ExceptionUtils .ofError ;
5154import 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 ())
0 commit comments