11package org .lowcoder .api .datasource ;
22
3- import com .github .f4b6a3 .uuid .UuidCreator ;
4- import jakarta .annotation .Nullable ;
5- import lombok .RequiredArgsConstructor ;
3+ import static org .lowcoder .domain .permission .model .ResourceAction .MANAGE_DATASOURCES ;
4+ import static org .lowcoder .domain .permission .model .ResourceAction .READ_APPLICATIONS ;
5+ import static org .lowcoder .domain .permission .model .ResourceAction .USE_DATASOURCES ;
6+ import static org .lowcoder .sdk .exception .BizError .NOT_AUTHORIZED ;
7+ import static org .lowcoder .sdk .util .ExceptionUtils .deferredError ;
8+
9+ import java .util .ArrayList ;
10+ import java .util .Collections ;
11+ import java .util .HashMap ;
12+ import java .util .List ;
13+ import java .util .Map ;
14+ import java .util .Set ;
15+ import java .util .stream .Collectors ;
16+
617import org .apache .commons .collections4 .CollectionUtils ;
718import org .apache .commons .lang3 .StringUtils ;
819import org .lowcoder .api .application .ApplicationApiService ;
920import org .lowcoder .api .home .SessionUserService ;
1021import org .lowcoder .api .permission .PermissionHelper ;
1122import org .lowcoder .api .permission .view .CommonPermissionView ;
1223import org .lowcoder .api .permission .view .PermissionItemView ;
24+ import org .lowcoder .api .usermanagement .GroupApiService ;
25+ import org .lowcoder .api .usermanagement .OrgApiService ;
1326import org .lowcoder .api .usermanagement .OrgDevChecker ;
27+ import org .lowcoder .api .usermanagement .view .GroupView ;
28+ import org .lowcoder .api .usermanagement .view .OrgMemberListView ;
1429import org .lowcoder .domain .application .service .ApplicationService ;
1530import org .lowcoder .domain .datasource .model .Datasource ;
1631import org .lowcoder .domain .datasource .model .DatasourceStatus ;
3853import org .lowcoder .sdk .models .HasIdAndAuditing ;
3954import org .lowcoder .sdk .models .JsDatasourceConnectionConfig ;
4055import org .springframework .stereotype .Service ;
41- import reactor .core .publisher .Flux ;
42- import reactor .core .publisher .Mono ;
4356
44- import java .util .Collections ;
45- import java .util .List ;
46- import java .util .Map ;
47- import java .util .Set ;
48- import java .util .stream .Collectors ;
57+ import com .github .f4b6a3 .uuid .UuidCreator ;
4958
50- import static org .lowcoder .domain .permission .model .ResourceAction .*;
51- import static org .lowcoder .sdk .exception .BizError .NOT_AUTHORIZED ;
52- import static org .lowcoder .sdk .util .ExceptionUtils .deferredError ;
59+ import jakarta .annotation .Nullable ;
60+ import lombok .RequiredArgsConstructor ;
61+ import reactor .core .publisher .Flux ;
62+ import reactor .core .publisher .Mono ;
5363
5464@ RequiredArgsConstructor
5565@ Service
@@ -71,6 +81,8 @@ public class DatasourceApiServiceImpl implements DatasourceApiService {
7181private final DatasourcePluginClient datasourcePluginClient ;
7282private final DatasourceRepository datasourceRepository ;
7383private final ApplicationApiService applicationApiService ;
84+ private final OrgApiService orgApiService ;
85+ private final GroupApiService groupApiService ;
7486
7587@ Override
7688public Mono <Datasource >create (Datasource datasource ) {
@@ -267,6 +279,66 @@ public Mono<Boolean> grantPermission(String datasourceId, @Nullable Set<String>
267279 .thenReturn (true );
268280 }
269281
282+ @ Override
283+ public Mono <List <Object >>getGroupsOrMembersWithoutPermissions (String datasourceId ) {
284+ return datasourceService .getById (datasourceId )
285+ .switchIfEmpty (Mono .error (new ServerException ("data source not exist. {}" ,datasourceId )))
286+ .flatMap (datasource -> {
287+ String orgId =datasource .getOrganizationId ();
288+ Mono <List <ResourcePermission >>datasourcePermissions =resourcePermissionService .getByDataSourceId (datasource .getId ()).cache ();
289+
290+ Mono <List <PermissionItemView >>groupPermissionPairsMono =datasourcePermissions
291+ .flatMap (permissionHelper ::getGroupPermissions );
292+
293+ Mono <List <PermissionItemView >>userPermissionPairsMono =datasourcePermissions
294+ .flatMap (permissionHelper ::getUserPermissions );
295+ Mono <OrgMemberListView >orgMemberListViewMono =orgApiService .getOrganizationMembers (orgId ,1 ,0 );
296+ Mono <List <GroupView >>groupsViewMono =groupApiService .getGroups ();
297+
298+ return Mono .zip (groupPermissionPairsMono ,userPermissionPairsMono ,orgMemberListViewMono ,groupsViewMono )
299+ .map (tuple -> {
300+ List <PermissionItemView >groupPermissionPairs =tuple .getT1 ();
301+ List <PermissionItemView >userPermissionPairs =tuple .getT2 ();
302+ OrgMemberListView orgMemberListViews =tuple .getT3 ();
303+ List <GroupView >groupListViews =tuple .getT4 ();
304+
305+ Set <String >groupIdsWithPerm =groupPermissionPairs .stream ()
306+ .map (PermissionItemView ::getId )
307+ .collect (java .util .stream .Collectors .toSet ());
308+
309+ List <java .util .Map <String ,Object >>filteredGroups =groupListViews .stream ()
310+ .filter (group -> !groupIdsWithPerm .contains (group .getGroupId ()))
311+ .map (group -> {
312+ java .util .Map <String ,Object >map =new java .util .HashMap <>();
313+ map .put ("type" ,"Group" );
314+ map .put ("data" ,group );
315+ return map ;
316+ })
317+ .toList ();
318+
319+ Set <String >userIdsWithPerm =userPermissionPairs .stream ()
320+ .map (PermissionItemView ::getId )
321+ .collect (java .util .stream .Collectors .toSet ());
322+
323+ List <Map <String ,Object >>filteredMembers =orgMemberListViews .getMembers ().stream ()
324+ .filter (member -> !userIdsWithPerm .contains (member .getUserId ()))
325+ .map (member -> {
326+ Map <String ,Object >map =new HashMap <>();
327+ map .put ("type" ,"User" );
328+ map .put ("data" ,member );
329+ return map ;
330+ })
331+ .toList ();
332+
333+ List <Object >result =new ArrayList <>();
334+ result .addAll (filteredGroups );
335+ result .addAll (filteredMembers );
336+ return result ;
337+ });
338+ });
339+ }
340+
341+
270342@ Override
271343public Mono <Boolean >updatePermission (String permissionId ,ResourceRole role ) {
272344return checkBeforePermissionDeleteOrUpdate (permissionId )