Skip to content

Commit c932905

Browse files
committed
Add pagination to group, org, bundle
1 parent e939fe2 commit c932905

File tree

9 files changed

+63
-19
lines changed

9 files changed

+63
-19
lines changed

server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/util/FluxHelper.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package org.lowcoder.infra.util;
22

3+
import org.jetbrains.annotations.NotNull;
34
import org.springframework.data.domain.Pageable;
5+
import org.springframework.web.bind.annotation.RequestParam;
46
import reactor.core.publisher.Flux;
7+
import reactor.core.publisher.Mono;
58

69
public class FluxHelper {
710

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bundle/BundleController.java

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
package org.lowcoder.api.bundle;
22

33
import lombok.RequiredArgsConstructor;
4+
import org.jetbrains.annotations.NotNull;
45
import org.lowcoder.api.bundle.view.BundleInfoView;
56
import org.lowcoder.api.bundle.view.BundlePermissionView;
67
import org.lowcoder.api.bundle.view.MarketplaceBundleInfoView;
8+
import org.lowcoder.api.framework.view.PageResponseView;
79
import org.lowcoder.api.framework.view.ResponseView;
810
import org.lowcoder.api.home.UserHomeApiService;
911
import org.lowcoder.api.util.BusinessEventPublisher;
@@ -18,10 +20,12 @@
1820
import org.springframework.web.bind.annotation.RequestBody;
1921
import org.springframework.web.bind.annotation.RequestParam;
2022
import org.springframework.web.bind.annotation.RestController;
23+
import reactor.core.publisher.Flux;
2124
import reactor.core.publisher.Mono;
2225

2326
import java.util.List;
2427

28+
import static org.lowcoder.api.util.Pagination.fluxToPageResponseView;
2529
import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER;
2630
import static org.lowcoder.sdk.util.ExceptionUtils.ofError;
2731

@@ -100,12 +104,13 @@ public Mono<ResponseView<List<BundleInfoView>>> getRecycledBundles() {
100104
* get all files under bundle
101105
*/
102106
@Override
103-
public Mono<ResponseView<List<?>>> getElements(@PathVariable String bundleId,
104-
@RequestParam(value = "applicationType", required = false) ApplicationType applicationType) {
107+
public Mono<PageResponseView<?>> getElements(@PathVariable String bundleId,
108+
@RequestParam(value = "applicationType", required = false) ApplicationType applicationType,
109+
@RequestParam(required = false, defaultValue = "0") Integer pageNum,
110+
@RequestParam(required = false, defaultValue = "0") Integer pageSize) {
105111
String objectId = gidService.convertBundleIdToObjectId(bundleId);
106-
return bundleApiService.getElements(objectId, applicationType)
107-
.collectList()
108-
.map(ResponseView::success);
112+
var flux = bundleApiService.getElements(objectId, applicationType).cache();
113+
return fluxToPageResponseView(pageNum, pageSize, flux);
109114
}
110115

111116
@Override

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bundle/BundleEndpoints.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.lowcoder.api.bundle.view.BundleInfoView;
88
import org.lowcoder.api.bundle.view.BundlePermissionView;
99
import org.lowcoder.api.bundle.view.MarketplaceBundleInfoView;
10+
import org.lowcoder.api.framework.view.PageResponseView;
1011
import org.lowcoder.api.framework.view.ResponseView;
1112
import org.lowcoder.domain.application.model.ApplicationType;
1213
import org.lowcoder.domain.bundle.model.Bundle;
@@ -120,8 +121,10 @@ public interface BundleEndpoints
120121
description = "Retrieve the contents of an Bundle Bundle within Lowcoder, including Bundles."
121122
)
122123
@GetMapping("/{bundleId}/elements")
123-
public Mono<ResponseView<List<?>>> getElements(@PathVariable String bundleId,
124-
@RequestParam(value = "applicationType", required = false) ApplicationType applicationType);
124+
public Mono<PageResponseView<?>> getElements(@PathVariable String bundleId,
125+
@RequestParam(value = "applicationType", required = false) ApplicationType applicationType,
126+
@RequestParam(required = false, defaultValue = "0") Integer pageNum,
127+
@RequestParam(required = false, defaultValue = "0") Integer pageSize);
125128

126129
@Operation(
127130
tags = TAG_BUNDLE_MANAGEMENT,

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,11 @@ public Mono<ResponseView<Boolean>> delete(@PathVariable String groupId) {
7575
}
7676

7777
@Override
78-
public Mono<GroupListResponseView<List<GroupView>>> getOrgGroups() {
78+
public Mono<GroupListResponseView<List<GroupView>>> getOrgGroups(@RequestParam(required = false, defaultValue = "0") Integer pageNum,
79+
@RequestParam(required = false, defaultValue = "0") Integer pageSize) {
7980
return groupApiService.getGroups().flatMap(groupList -> {
8081
if(groupList.isEmpty()) return Mono.just(new GroupListResponseView<>(ResponseView.SUCCESS,
81-
"", List.of(), 0, 0, 0, 0));
82+
"", List.of(), 0, 0, 0, 0, 0, pageNum, pageSize));
8283
return sessionUserService.getVisitorOrgMemberCache()
8384
.map(OrgMember::getOrgId)
8485
.flatMap(orgId -> orgMemberService.getOrganizationMembers(orgId)
@@ -98,13 +99,17 @@ public Mono<GroupListResponseView<List<GroupView>>> getOrgGroups() {
9899
.filter(orgMember -> !orgMember.isAdmin() && !orgMember.isSuperAdmin() &&
99100
devMembers.stream().noneMatch(devMember -> devMember.getUserId().equals(orgMember.getUserId()))).toList().size();
100101

102+
var subList = groupList.subList(pageNum * pageSize, pageSize <= 0?(groupList.size() + 1):pageNum * pageSize + pageSize);
101103
return new GroupListResponseView<>(ResponseView.SUCCESS,
102104
"",
103-
groupList,
105+
subList,
104106
totalAdmins,
105107
totalAdminsAndDevelopers,
106108
totalDevelopersOnly,
107-
totalOtherMembers);
109+
totalOtherMembers,
110+
subList.size(),
111+
pageNum,
112+
pageSize);
108113
})
109114
);
110115
}

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ public Mono<ResponseView<Boolean>> update(@PathVariable String groupId,
6363
description = "Retrieve a list of User Groups within Lowcoder, providing an overview of available groups, based on the access rights of the currently impersonated User."
6464
)
6565
@GetMapping("/list")
66-
public Mono<GroupListResponseView<List<GroupView>>> getOrgGroups();
66+
public Mono<GroupListResponseView<List<GroupView>>> getOrgGroups(@RequestParam(required = false, defaultValue = "0") Integer pageNum,
67+
@RequestParam(required = false, defaultValue = "0") Integer pageSize);
6768

6869
@Operation(
6970
tags = TAG_GROUP_MEMBERS,

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import jakarta.validation.Valid;
55
import org.apache.commons.lang.StringUtils;
66
import org.lowcoder.api.authentication.dto.OrganizationDomainCheckResult;
7+
import org.lowcoder.api.framework.view.PageResponseView;
78
import org.lowcoder.api.framework.view.ResponseView;
89
import org.lowcoder.api.usermanagement.view.OrgMemberListView;
910
import org.lowcoder.api.usermanagement.view.OrgView;
@@ -26,6 +27,8 @@
2627

2728
import java.util.List;
2829

30+
import static org.lowcoder.api.util.Pagination.fluxToPageResponseView;
31+
2932
@RestController
3033
public class OrganizationController implements OrganizationEndpoints
3134
{
@@ -46,12 +49,13 @@ public class OrganizationController implements OrganizationEndpoints
4649
private UserService userService;
4750

4851
@Override
49-
public Mono<ResponseView<List<OrgView>>> getOrganizationByUser(@PathVariable String email) {
50-
return userService.findByEmailDeep(email).flux().flatMap(user -> orgMemberService.getAllActiveOrgs(user.getId()))
52+
public Mono<PageResponseView<?>> getOrganizationByUser(@PathVariable String email,
53+
@RequestParam(required = false, defaultValue = "0") Integer pageNum,
54+
@RequestParam(required = false, defaultValue = "0") Integer pageSize) {
55+
var flux = userService.findByEmailDeep(email).flux().flatMap(user -> orgMemberService.getAllActiveOrgs(user.getId()))
5156
.flatMap(orgMember -> organizationService.getById(orgMember.getOrgId()))
52-
.map(OrgView::new)
53-
.collectList()
54-
.map(ResponseView::success);
57+
.map(OrgView::new).cache();
58+
return fluxToPageResponseView(pageNum, pageSize, flux);
5559
}
5660

5761
@Override

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import jakarta.validation.Valid;
66

7+
import org.lowcoder.api.framework.view.PageResponseView;
78
import org.lowcoder.api.framework.view.ResponseView;
89
import org.lowcoder.api.usermanagement.view.OrgMemberListView;
910
import org.lowcoder.api.usermanagement.view.OrgView;
@@ -44,7 +45,9 @@ public interface OrganizationEndpoints
4445
description = "Get a list of specified user's organization"
4546
)
4647
@GetMapping("/byuser/{email}")
47-
public Mono<ResponseView<List<OrgView>>> getOrganizationByUser(@PathVariable String email);
48+
public Mono<PageResponseView<?>> getOrganizationByUser(@PathVariable String email,
49+
@RequestParam(required = false, defaultValue = "0") Integer pageNum,
50+
@RequestParam(required = false, defaultValue = "0") Integer pageSize);
4851

4952
@Operation(
5053
tags = TAG_ORGANIZATION_MANAGEMENT,

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupListResponseView.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,17 @@ public class GroupListResponseView<T> extends ResponseView<T> {
1212
private final int totalDevelopersOnly;
1313
private final int totalAdmins;
1414
private final int totalOtherMembers;
15-
public GroupListResponseView(int code, String message, T data, int totalAdmins, int totalAdminsAndDevelopers, int totalDevelopersOnly, int totalOtherMembers) {
15+
private final int total;
16+
private final int pageNum;
17+
private final int pageSize;
18+
public GroupListResponseView(int code, String message, T data, int totalAdmins, int totalAdminsAndDevelopers, int totalDevelopersOnly, int totalOtherMembers, int total, int pageNum, int pageSize) {
1619
super(code, message, data);
1720
this.totalAdmins = totalAdmins;
1821
this.totalDevelopersOnly = totalDevelopersOnly;
1922
this.totalAdminsAndDevelopers = totalAdminsAndDevelopers;
2023
this.totalOtherMembers = totalOtherMembers;
24+
this.total = total;
25+
this.pageNum = pageNum;
26+
this.pageSize = pageSize;
2127
}
2228
}

server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/Pagination.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,13 @@
22

33
import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER;
44

5+
import org.jetbrains.annotations.NotNull;
6+
import org.lowcoder.api.framework.view.PageResponseView;
57
import org.lowcoder.sdk.exception.BizException;
68
import org.springframework.data.domain.PageRequest;
9+
import org.springframework.web.bind.annotation.RequestParam;
10+
import reactor.core.publisher.Flux;
11+
import reactor.core.publisher.Mono;
712

813
public class Pagination {
914

@@ -55,4 +60,13 @@ public int page() {
5560
public int size() {
5661
return Math.min(Math.max(MIN_SIZE, size), maxSize);
5762
}
63+
64+
@NotNull
65+
public static Mono<PageResponseView<?>> fluxToPageResponseView(Integer pageNum, Integer pageSize, Flux<?> flux) {
66+
var countMono = flux.count();
67+
var flux1 = flux.skip((long) pageNum * pageSize);
68+
if(pageSize > 0) flux1 = flux1.take(pageSize);
69+
return flux1.collectList().zipWith(countMono)
70+
.map(tuple -> PageResponseView.success(tuple.getT1(), pageNum, pageSize, Math.toIntExact(tuple.getT2())));
71+
}
5872
}

0 commit comments

Comments
 (0)