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 ())
0 commit comments