40
40
import org .springframework .http .codec .multipart .Part ;
41
41
import org .springframework .stereotype .Service ;
42
42
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 ;
43
46
44
47
import java .util .*;
45
48
import java .util .stream .Collectors ;
49
52
import static org .lowcoder .sdk .util .ExceptionUtils .deferredError ;
50
53
import static org .lowcoder .sdk .util .ExceptionUtils .ofError ;
51
54
import static org .lowcoder .sdk .util .StreamUtils .collectSet ;
55
+ import reactor .util .function .Tuple2 ;
56
+ import reactor .util .function .Tuples ;
52
57
53
58
@ Slf4j
54
59
@ Service
@@ -72,9 +77,10 @@ public class OrgApiServiceImpl implements OrgApiService {
72
77
private GroupService groupService ;
73
78
@ Autowired
74
79
private AuthenticationService authenticationService ;
75
-
76
80
@ Autowired
77
81
private ServerLogService serverLogService ;
82
+ @ Autowired
83
+ private GroupMemberService groupMemberService ;
78
84
79
85
@ Override
80
86
public Mono <OrgMemberListView >getOrganizationMembers (String orgId ,int page ,int count ) {
@@ -84,6 +90,78 @@ public Mono<OrgMemberListView> getOrganizationMembers(String orgId, int page, in
84
90
.then (getOrgMemberListView (orgId ,page ,count ));
85
91
}
86
92
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
+
87
165
private Mono <OrgMemberListView >getOrgMemberListView (String orgId ,int page ,int count ) {
88
166
return orgMemberService .getOrganizationMembers (orgId )
89
167
.collectList ()
@@ -136,6 +214,17 @@ protected OrgMemberView build(User user, OrgMember orgMember) {
136
214
.rawUserInfos (findRawUserInfos (user ,orgId ))
137
215
.build ();
138
216
}
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
+ }
139
228
140
229
protected Map <String ,Map <String ,Object >>findRawUserInfos (User user ,String orgId ) {
141
230
return SetUtils .emptyIfNull (user .getConnections ())