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