Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit096a7d2

Browse files
Thomasrludomikula
Thomasr
authored andcommitted
Feat: add API to list groups and users without permissions, with search and pagination support
1 parent27ea453 commit096a7d2

File tree

4 files changed

+120
-5
lines changed

4 files changed

+120
-5
lines changed

‎server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
importreactor.core.publisher.Flux;
1616
importreactor.core.publisher.Mono;
1717

18+
importjava.util.List;
1819
importjava.util.Set;
1920

2021
publicinterfaceApplicationApiService {
@@ -66,4 +67,6 @@ Mono<Boolean> grantPermission(String applicationId,
6667
Mono<Boolean>setApplicationAsAgencyProfile(StringapplicationId,booleanagencyProfile);
6768

6869
Mono<Application>updateSlug(StringapplicationId,Stringslug);
70+
71+
Mono<List<Object>>getGroupsOrMembersWithoutPermissions(StringappId);
6972
}

‎server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java

Lines changed: 69 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,15 +22,22 @@
2222
importorg.lowcoder.api.home.UserHomeApiService;
2323
importorg.lowcoder.api.permission.PermissionHelper;
2424
importorg.lowcoder.api.permission.view.PermissionItemView;
25+
importorg.lowcoder.api.usermanagement.GroupApiService;
26+
importorg.lowcoder.api.usermanagement.OrgApiService;
2527
importorg.lowcoder.api.usermanagement.OrgDevChecker;
28+
importorg.lowcoder.api.usermanagement.view.GroupView;
29+
importorg.lowcoder.api.usermanagement.view.OrgMemberListView;
2630
importorg.lowcoder.domain.application.model.*;
2731
importorg.lowcoder.domain.application.service.ApplicationHistorySnapshotService;
2832
importorg.lowcoder.domain.application.service.ApplicationRecordService;
2933
importorg.lowcoder.domain.application.service.ApplicationService;
3034
importorg.lowcoder.domain.datasource.model.Datasource;
3135
importorg.lowcoder.domain.datasource.service.DatasourceService;
3236
importorg.lowcoder.domain.folder.service.FolderElementRelationService;
37+
importorg.lowcoder.domain.group.model.Group;
38+
importorg.lowcoder.domain.group.model.GroupMember;
3339
importorg.lowcoder.domain.interaction.UserApplicationInteractionService;
40+
importorg.lowcoder.domain.organization.model.OrgMember;
3441
importorg.lowcoder.domain.organization.model.Organization;
3542
importorg.lowcoder.domain.organization.service.OrgMemberService;
3643
importorg.lowcoder.domain.organization.service.OrganizationService;
@@ -54,13 +61,11 @@
5461
importreactor.core.publisher.Flux;
5562
importreactor.core.publisher.Mono;
5663
importreactor.core.scheduler.Schedulers;
64+
importreactor.util.function.Tuple2;
5765

5866
importjava.time.Duration;
5967
importjava.time.Instant;
60-
importjava.util.HashSet;
61-
importjava.util.List;
62-
importjava.util.Map;
63-
importjava.util.Set;
68+
importjava.util.*;
6469
importjava.util.stream.Collectors;
6570

6671
importstaticorg.lowcoder.domain.application.model.ApplicationStatus.NORMAL;
@@ -99,6 +104,8 @@ public class ApplicationApiServiceImpl implements ApplicationApiService {
99104
privatefinalApplicationHistorySnapshotServiceapplicationHistorySnapshotService;
100105
privatefinalApplicationRecordServiceapplicationRecordService;
101106
privatefinalFolderElementRelationServicefolderElementRelationService;
107+
privatefinalGroupApiServicegroupApiService;
108+
privatefinalOrgApiServiceorgApiService;
102109

103110
@Override
104111
publicMono<ApplicationView>create(CreateApplicationRequestcreateApplicationRequest) {
@@ -743,4 +750,62 @@ private Mono<Void> checkDatasourcePermissions(Application application) {
743750
});
744751
});
745752
}
753+
754+
@Override
755+
publicMono<List<Object>>getGroupsOrMembersWithoutPermissions(StringappId) {
756+
returnapplicationService.findById(appId)
757+
.flatMap(application -> {
758+
StringorgId =application.getOrganizationId();
759+
Mono<List<ResourcePermission>>applicationPermissions =resourcePermissionService.getByApplicationId(application.getId()).cache();
760+
761+
Mono<List<PermissionItemView>>groupPermissionPairsMono =applicationPermissions
762+
.flatMap(permissionHelper::getGroupPermissions);
763+
764+
Mono<List<PermissionItemView>>userPermissionPairsMono =applicationPermissions
765+
.flatMap(permissionHelper::getUserPermissions);
766+
Mono<OrgMemberListView>orgMemberListViewMono =orgApiService.getOrganizationMembers(orgId,1,0);
767+
Mono<List<GroupView>>groupsViewMono =groupApiService.getGroups();
768+
769+
returnMono.zip(groupPermissionPairsMono,userPermissionPairsMono,orgMemberListViewMono,groupsViewMono)
770+
.map(tuple -> {
771+
List<PermissionItemView>groupPermissionPairs =tuple.getT1();
772+
List<PermissionItemView>userPermissionPairs =tuple.getT2();
773+
OrgMemberListVieworgMemberListViews =tuple.getT3();
774+
List<GroupView>groupListViews =tuple.getT4();
775+
776+
Set<String>groupIdsWithPerm =groupPermissionPairs.stream()
777+
.map(PermissionItemView::getId)
778+
.collect(Collectors.toSet());
779+
780+
List<Map<String,Object>>filteredGroups =groupListViews.stream()
781+
.filter(group -> !groupIdsWithPerm.contains(group.getGroupId()))
782+
.map(group -> {
783+
Map<String,Object>map =newHashMap<>();
784+
map.put("type","Group");
785+
map.put("data",group);
786+
returnmap;
787+
})
788+
.toList();
789+
790+
Set<String>userIdsWithPerm =userPermissionPairs.stream()
791+
.map(PermissionItemView::getId)
792+
.collect(Collectors.toSet());
793+
794+
List<Map<String,Object>>filteredMembers =orgMemberListViews.getMembers().stream()
795+
.filter(member -> !userIdsWithPerm.contains(member.getUserId()))
796+
.map(member -> {
797+
Map<String,Object>map =newHashMap<>();
798+
map.put("type","User");
799+
map.put("data",member);
800+
returnmap;
801+
})
802+
.toList();
803+
804+
List<Object>result =newArrayList<>();
805+
result.addAll(filteredGroups);
806+
result.addAll(filteredMembers);
807+
returnresult;
808+
});
809+
});
810+
}
746811
}

‎server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@
2727
importstaticorg.lowcoder.plugin.api.event.LowcoderEvent.EventType.*;
2828
importstaticorg.lowcoder.sdk.exception.BizError.INVALID_PARAMETER;
2929
importstaticorg.lowcoder.sdk.util.ExceptionUtils.ofError;
30+
importreactor.core.publisher.Flux;
31+
importjava.util.Map;
3032

3133
@RequiredArgsConstructor
3234
@RestController
@@ -298,5 +300,36 @@ public Mono<ResponseView<Boolean>> setApplicationAsAgencyProfile(@PathVariable S
298300
.map(ResponseView::success));
299301
}
300302

301-
303+
@Override
304+
publicMono<ResponseView<List<Object>>>getGroupsOrMembersWithoutPermissions(
305+
@PathVariableStringapplicationId,
306+
@RequestParam(required =false)Stringsearch,
307+
@RequestParam(required =false,defaultValue ="1")IntegerpageNum,
308+
@RequestParam(required =false,defaultValue ="1000")IntegerpageSize) {
309+
310+
returngidService.convertLibraryQueryIdToObjectId(applicationId).flatMap(appId -> {
311+
varflx =applicationApiService.getGroupsOrMembersWithoutPermissions(appId)
312+
.flatMapMany(Flux::fromIterable)
313+
.filter(item -> {
314+
if (search ==null ||search.isBlank())returntrue;
315+
if (!(iteminstanceofMapmap))returnfalse;
316+
Objecttype =map.get("type");
317+
Objectdata =map.get("data");
318+
if ("Group".equals(type) &&datainstanceoforg.lowcoder.api.usermanagement.view.GroupViewgroup) {
319+
returngroup.getGroupName() !=null &&group.getGroupName().toLowerCase().contains(search.toLowerCase());
320+
}
321+
if ("User".equals(type) &&datainstanceoforg.lowcoder.api.usermanagement.view.OrgMemberListView.OrgMemberViewuser) {
322+
returnuser.getName() !=null &&user.getName().toLowerCase().contains(search.toLowerCase());
323+
}
324+
returnfalse;
325+
})
326+
.cache();
327+
varcountMono =flx.count();
328+
varflux1 =flx.skip((long) (pageNum -1) *pageSize);
329+
if (pageSize >0)flux1 =flux1.take(pageSize);
330+
returnflux1.collectList()
331+
.zipWith(countMono)
332+
.map(tuple ->PageResponseView.success(tuple.getT1(),pageNum,pageSize,Math.toIntExact(tuple.getT2())));
333+
});
334+
}
302335
}

‎server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationEndpoints.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,20 @@ public Mono<ResponseView<Boolean>> grantPermission(
245245
@GetMapping("/{applicationId}/permissions")
246246
publicMono<ResponseView<ApplicationPermissionView>>getApplicationPermissions(@PathVariableStringapplicationId);
247247

248+
@Operation(
249+
tags =ApplicationEndpoints.TAG_APPLICATION_PERMISSIONS,
250+
operationId ="listGroupsOrMembersWithoutPermissions",
251+
summary ="Get groups or members without permissions",
252+
description ="Retrieve the groups or members of a specific Lowcoder Application identified by its ID that do not have permissions."
253+
)
254+
@GetMapping("/{applicationId}/get_groups_or_members_without_permissions")
255+
publicMono<ResponseView<List<Object>>>getGroupsOrMembersWithoutPermissions(
256+
@PathVariableStringapplicationId,
257+
@RequestParam(required =false)Stringsearch,
258+
@RequestParam(required =false,defaultValue ="1")IntegerpageNum,
259+
@RequestParam(required =false,defaultValue ="1000")IntegerpageSize
260+
);
261+
248262
@Operation(
249263
tags =TAG_APPLICATION_MANAGEMENT,
250264
operationId ="setApplicationAsPublic",

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp