From e939fe278fbc6fd56861941e5d04baaf95e974de Mon Sep 17 00:00:00 2001 From: Thomasr Date: Thu, 14 Nov 2024 10:46:38 -0500 Subject: [PATCH 1/6] Add pagination total --- .../ApplicationApiServiceImpl.java | 2 +- .../application/ApplicationController.java | 10 +++++--- .../lowcoder/api/home/FolderApiService.java | 2 +- .../api/home/FolderApiServiceImpl.java | 10 +++----- .../lowcoder/api/home/FolderController.java | 25 +++++++++++-------- .../lowcoder/api/home/FolderEndpoints.java | 12 ++++----- .../lowcoder/api/home/UserHomeApiService.java | 2 +- .../api/home/UserHomeApiServiceImpl.java | 8 +++--- .../api/service/FolderApiServiceTest.java | 2 +- 9 files changed, 38 insertions(+), 35 deletions(-) diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java index cac250e10..25d772cdb 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationApiServiceImpl.java @@ -170,7 +170,7 @@ private Mono autoGrantPermissionsByFolderDefault(String applicationId, @Nu @Override public Flux getRecycledApplications(String name) { - return userHomeApiService.getAllAuthorisedApplications4CurrentOrgMember(null, ApplicationStatus.RECYCLED, false, name, 0, 0); + return userHomeApiService.getAllAuthorisedApplications4CurrentOrgMember(null, ApplicationStatus.RECYCLED, false, name); } private Mono checkCurrentUserApplicationPermission(String applicationId, ResourceAction action) { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java index 91410be25..ed7079598 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/application/ApplicationController.java @@ -17,6 +17,7 @@ import org.lowcoder.api.application.view.ApplicationView; import org.lowcoder.api.application.view.MarketplaceApplicationInfoView; // should we not have a AgencyApplicationInfoView +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.home.SessionUserService; import org.lowcoder.api.home.UserHomeApiService; @@ -164,9 +165,12 @@ public Mono>> getApplications(@RequestPar @RequestParam(required = false, defaultValue = "0") Integer pageNum, @RequestParam(required = false, defaultValue = "0") Integer pageSize) { ApplicationType applicationTypeEnum = applicationType == null ? null : ApplicationType.fromValue(applicationType); - return userHomeApiService.getAllAuthorisedApplications4CurrentOrgMember(applicationTypeEnum, applicationStatus, withContainerSize, name, pageNum, pageSize) - .collectList() - .map(ResponseView::success); + var flux = userHomeApiService.getAllAuthorisedApplications4CurrentOrgMember(applicationTypeEnum, applicationStatus, withContainerSize, name).cache(); + Mono countMono = flux.count(); + var flux1 = flux.skip((long) pageNum * pageSize); + if(pageSize > 0) flux1 = flux1.take(pageSize); + return flux1.collectList().zipWith(countMono) + .map(tuple -> PageResponseView.success(tuple.getT1(), pageNum, pageSize, Math.toIntExact(tuple.getT2()))); } @Override diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiService.java index b24dc8a70..de161bb19 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiService.java @@ -27,7 +27,7 @@ public interface FolderApiService { Mono upsertLastViewTime(@Nullable String folderId); - Flux getElements(@Nullable String folderId, @Nullable ApplicationType applicationType, @Nullable String name, Integer pageNum, Integer pageSize); + Flux getElements(@Nullable String folderId, @Nullable ApplicationType applicationType, @Nullable String name); Mono grantPermission(String folderId, Set userIds, Set groupIds, ResourceRole role); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiServiceImpl.java index d1bead9e9..79fafda96 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderApiServiceImpl.java @@ -233,8 +233,8 @@ public Mono upsertLastViewTime(@Nullable String folderId) { * @return flux of {@link ApplicationInfoView} or {@link FolderInfoView} */ @Override - public Flux getElements(@Nullable String folderId, @Nullable ApplicationType applicationType, @Nullable String name, Integer pageNum, Integer pageSize) { - var retMono = buildApplicationInfoViewTree(applicationType, name) + public Flux getElements(@Nullable String folderId, @Nullable ApplicationType applicationType, @Nullable String name) { + return buildApplicationInfoViewTree(applicationType, name) .flatMap(tree -> { FolderNode folderNode = tree.get(folderId); if (folderNode == null) { @@ -264,9 +264,7 @@ public Flux getElements(@Nullable String folderId, @Nullable ApplicationType }); }) .flatMapIterable(tuple -> tuple.getT1().getChildren()) - .skip(pageNum * pageSize); - if(pageSize > 0) retMono = retMono.take(pageSize); - return retMono.map(node -> { + .map(node -> { if (node instanceof ElementNode elementNode) { return elementNode.getSelf(); } @@ -286,7 +284,7 @@ private Mono> buildApplicationInfoView .cache(); Flux applicationInfoViewFlux = - userHomeApiService.getAllAuthorisedApplications4CurrentOrgMember(applicationType, ApplicationStatus.NORMAL, false, null, 0, 0) + userHomeApiService.getAllAuthorisedApplications4CurrentOrgMember(applicationType, ApplicationStatus.NORMAL, false, null) .cache(); Mono> application2FolderMapMono = applicationInfoViewFlux diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java index 96f44dadd..31cf49494 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderController.java @@ -4,9 +4,8 @@ import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; import static org.lowcoder.sdk.util.ExceptionUtils.ofError; -import java.util.List; - import org.lowcoder.api.application.view.ApplicationPermissionView; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.util.BusinessEventPublisher; import org.lowcoder.api.util.GidService; @@ -68,16 +67,20 @@ public Mono> update(@RequestBody Folder folder) { * get all files under folder */ @Override - public Mono>> getElements(@RequestParam(value = "id", required = false) String folderId, - @RequestParam(value = "applicationType", required = false) ApplicationType applicationType, - @RequestParam(required = false) String name, - @RequestParam(required = false, defaultValue = "0") Integer pageNum, - @RequestParam(required = false, defaultValue = "0") Integer pageSize) { + public Mono> getElements(@RequestParam(value = "id", required = false) String folderId, + @RequestParam(value = "applicationType", required = false) ApplicationType applicationType, + @RequestParam(required = false) String name, + @RequestParam(required = false, defaultValue = "0") Integer pageNum, + @RequestParam(required = false, defaultValue = "0") Integer pageSize) { String objectId = gidService.convertFolderIdToObjectId(folderId); - return folderApiService.getElements(objectId, applicationType, name, pageNum, pageSize) - .collectList() - .delayUntil(__ -> folderApiService.upsertLastViewTime(objectId)) - .map(ResponseView::success); + var flux = folderApiService.getElements(objectId, applicationType, name).cache(); + var countMono = flux.count(); + var flux1 = flux.skip((long) pageNum * pageSize); + if(pageSize > 0) flux1 = flux1.take(pageSize); + return flux1.collectList() + .delayUntil(__ -> folderApiService.upsertLastViewTime(objectId)) + .zipWith(countMono) + .map(tuple -> PageResponseView.success(tuple.getT1(), pageNum, pageSize, Math.toIntExact(tuple.getT2()))); } @Override diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderEndpoints.java index bb72a02fd..43e5ce785 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/FolderEndpoints.java @@ -1,9 +1,9 @@ package org.lowcoder.api.home; -import java.util.List; import java.util.Set; import org.lowcoder.api.application.view.ApplicationPermissionView; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.domain.application.model.ApplicationType; import org.lowcoder.domain.folder.model.Folder; @@ -68,11 +68,11 @@ public interface FolderEndpoints description = "Retrieve the contents of an Application Folder within Lowcoder, including Applications and Subfolders." ) @GetMapping("/elements") - public Mono>> getElements(@RequestParam(value = "id", required = false) String folderId, - @RequestParam(value = "applicationType", required = false) ApplicationType applicationType, - @RequestParam(required = false) String name, - @RequestParam(required = false, defaultValue = "0") Integer pageNum, - @RequestParam(required = false, defaultValue = "0") Integer pageSize); + public Mono> getElements(@RequestParam(value = "id", required = false) String folderId, + @RequestParam(value = "applicationType", required = false) ApplicationType applicationType, + @RequestParam(required = false) String name, + @RequestParam(required = false, defaultValue = "0") Integer pageNum, + @RequestParam(required = false, defaultValue = "0") Integer pageSize); @Operation( tags = TAG_FOLDER_MANAGEMENT, diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiService.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiService.java index 5e0610173..e711304a4 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiService.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiService.java @@ -24,7 +24,7 @@ public interface UserHomeApiService { Mono getUserHomePageView(ApplicationType applicationType); Flux getAllAuthorisedApplications4CurrentOrgMember(@Nullable ApplicationType applicationType, - @Nullable ApplicationStatus applicationStatus, boolean withContainerSize, @Nullable String name, Integer pageNum, Integer pageSize); + @Nullable ApplicationStatus applicationStatus, boolean withContainerSize, @Nullable String name); Flux getAllAuthorisedBundles4CurrentOrgMember(@Nullable BundleStatus bundleStatus); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java index a11cc1ff0..ae5f22fcf 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/home/UserHomeApiServiceImpl.java @@ -157,7 +157,7 @@ public Mono getUserHomePageView(ApplicationType applicationTyp } return organizationService.getById(currentOrgId) - .zipWith(folderApiService.getElements(null, applicationType, null, 0, 0).collectList()) + .zipWith(folderApiService.getElements(null, applicationType, null).collectList()) .map(tuple2 -> { Organization organization = tuple2.getT1(); List list = tuple2.getT2(); @@ -189,7 +189,7 @@ public Mono getUserHomePageView(ApplicationType applicationTyp @Override public Flux getAllAuthorisedApplications4CurrentOrgMember(@Nullable ApplicationType applicationType, - @Nullable ApplicationStatus applicationStatus, boolean withContainerSize, @Nullable String name, Integer pageNum, Integer pageSize) { + @Nullable ApplicationStatus applicationStatus, boolean withContainerSize, @Nullable String name) { return sessionUserService.getVisitorOrgMemberCache() .flatMapMany(orgMember -> { @@ -207,9 +207,7 @@ public Flux getAllAuthorisedApplications4CurrentOrgMember(@ && (isNull(name) || StringUtils.containsIgnoreCase(application.getName(), name))) .cache() .collectList() - .flatMapIterable(Function.identity()) - .skip((long) pageNum * pageSize); - if(pageSize > 0) applicationFlux = applicationFlux.take(pageSize); + .flatMapIterable(Function.identity()); // last view time Mono> applicationLastViewTimeMapMono = userApplicationInteractionService.findByUserId(visitorId) diff --git a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/service/FolderApiServiceTest.java b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/service/FolderApiServiceTest.java index 1ab8556ec..c470c11d0 100644 --- a/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/service/FolderApiServiceTest.java +++ b/server/api-service/lowcoder-server/src/test/java/org/lowcoder/api/service/FolderApiServiceTest.java @@ -137,7 +137,7 @@ public void updateByGid() { public void move() { Mono> mono = folderApiService.move("app01", "folder02") - .then(folderApiService.getElements("folder02", null, null, 0, 0).collectList()); + .then(folderApiService.getElements("folder02", null, null).collectList()); StepVerifier.create(mono) .assertNext(list -> { From c9329051c908625d6bd537ba04125af75f793170 Mon Sep 17 00:00:00 2001 From: Thomasr Date: Thu, 14 Nov 2024 12:13:32 -0500 Subject: [PATCH 2/6] Add pagination to group, org, bundle --- .../java/org/lowcoder/infra/util/FluxHelper.java | 3 +++ .../org/lowcoder/api/bundle/BundleController.java | 15 ++++++++++----- .../org/lowcoder/api/bundle/BundleEndpoints.java | 7 +++++-- .../api/usermanagement/GroupController.java | 13 +++++++++---- .../api/usermanagement/GroupEndpoints.java | 3 ++- .../usermanagement/OrganizationController.java | 14 +++++++++----- .../api/usermanagement/OrganizationEndpoints.java | 5 ++++- .../view/GroupListResponseView.java | 8 +++++++- .../java/org/lowcoder/api/util/Pagination.java | 14 ++++++++++++++ 9 files changed, 63 insertions(+), 19 deletions(-) diff --git a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/util/FluxHelper.java b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/util/FluxHelper.java index ad393418b..52d7ffdb3 100644 --- a/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/util/FluxHelper.java +++ b/server/api-service/lowcoder-infra/src/main/java/org/lowcoder/infra/util/FluxHelper.java @@ -1,7 +1,10 @@ package org.lowcoder.infra.util; +import org.jetbrains.annotations.NotNull; import org.springframework.data.domain.Pageable; +import org.springframework.web.bind.annotation.RequestParam; import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; public class FluxHelper { diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bundle/BundleController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bundle/BundleController.java index d96f02a78..254e78037 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bundle/BundleController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bundle/BundleController.java @@ -1,9 +1,11 @@ package org.lowcoder.api.bundle; import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; import org.lowcoder.api.bundle.view.BundleInfoView; import org.lowcoder.api.bundle.view.BundlePermissionView; import org.lowcoder.api.bundle.view.MarketplaceBundleInfoView; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.home.UserHomeApiService; import org.lowcoder.api.util.BusinessEventPublisher; @@ -18,10 +20,12 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.List; +import static org.lowcoder.api.util.Pagination.fluxToPageResponseView; import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; import static org.lowcoder.sdk.util.ExceptionUtils.ofError; @@ -100,12 +104,13 @@ public Mono>> getRecycledBundles() { * get all files under bundle */ @Override - public Mono>> getElements(@PathVariable String bundleId, - @RequestParam(value = "applicationType", required = false) ApplicationType applicationType) { + public Mono> getElements(@PathVariable String bundleId, + @RequestParam(value = "applicationType", required = false) ApplicationType applicationType, + @RequestParam(required = false, defaultValue = "0") Integer pageNum, + @RequestParam(required = false, defaultValue = "0") Integer pageSize) { String objectId = gidService.convertBundleIdToObjectId(bundleId); - return bundleApiService.getElements(objectId, applicationType) - .collectList() - .map(ResponseView::success); + var flux = bundleApiService.getElements(objectId, applicationType).cache(); + return fluxToPageResponseView(pageNum, pageSize, flux); } @Override diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bundle/BundleEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bundle/BundleEndpoints.java index cb7e4966a..8674c62b5 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bundle/BundleEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bundle/BundleEndpoints.java @@ -7,6 +7,7 @@ import org.lowcoder.api.bundle.view.BundleInfoView; import org.lowcoder.api.bundle.view.BundlePermissionView; import org.lowcoder.api.bundle.view.MarketplaceBundleInfoView; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.domain.application.model.ApplicationType; import org.lowcoder.domain.bundle.model.Bundle; @@ -120,8 +121,10 @@ public interface BundleEndpoints description = "Retrieve the contents of an Bundle Bundle within Lowcoder, including Bundles." ) @GetMapping("/{bundleId}/elements") - public Mono>> getElements(@PathVariable String bundleId, - @RequestParam(value = "applicationType", required = false) ApplicationType applicationType); + public Mono> getElements(@PathVariable String bundleId, + @RequestParam(value = "applicationType", required = false) ApplicationType applicationType, + @RequestParam(required = false, defaultValue = "0") Integer pageNum, + @RequestParam(required = false, defaultValue = "0") Integer pageSize); @Operation( tags = TAG_BUNDLE_MANAGEMENT, diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java index 66eef1a40..490febac4 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java @@ -75,10 +75,11 @@ public Mono> delete(@PathVariable String groupId) { } @Override - public Mono>> getOrgGroups() { + public Mono>> getOrgGroups(@RequestParam(required = false, defaultValue = "0") Integer pageNum, + @RequestParam(required = false, defaultValue = "0") Integer pageSize) { return groupApiService.getGroups().flatMap(groupList -> { if(groupList.isEmpty()) return Mono.just(new GroupListResponseView<>(ResponseView.SUCCESS, - "", List.of(), 0, 0, 0, 0)); + "", List.of(), 0, 0, 0, 0, 0, pageNum, pageSize)); return sessionUserService.getVisitorOrgMemberCache() .map(OrgMember::getOrgId) .flatMap(orgId -> orgMemberService.getOrganizationMembers(orgId) @@ -98,13 +99,17 @@ public Mono>> getOrgGroups() { .filter(orgMember -> !orgMember.isAdmin() && !orgMember.isSuperAdmin() && devMembers.stream().noneMatch(devMember -> devMember.getUserId().equals(orgMember.getUserId()))).toList().size(); + var subList = groupList.subList(pageNum * pageSize, pageSize <= 0?(groupList.size() + 1):pageNum * pageSize + pageSize); return new GroupListResponseView<>(ResponseView.SUCCESS, "", - groupList, + subList, totalAdmins, totalAdminsAndDevelopers, totalDevelopersOnly, - totalOtherMembers); + totalOtherMembers, + subList.size(), + pageNum, + pageSize); }) ); } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java index 983a0bed1..61bca5017 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java @@ -63,7 +63,8 @@ public Mono> update(@PathVariable String groupId, 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." ) @GetMapping("/list") - public Mono>> getOrgGroups(); + public Mono>> getOrgGroups(@RequestParam(required = false, defaultValue = "0") Integer pageNum, + @RequestParam(required = false, defaultValue = "0") Integer pageSize); @Operation( tags = TAG_GROUP_MEMBERS, diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java index 562d072f9..d7f48573f 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java @@ -4,6 +4,7 @@ import jakarta.validation.Valid; import org.apache.commons.lang.StringUtils; import org.lowcoder.api.authentication.dto.OrganizationDomainCheckResult; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.usermanagement.view.OrgMemberListView; import org.lowcoder.api.usermanagement.view.OrgView; @@ -26,6 +27,8 @@ import java.util.List; +import static org.lowcoder.api.util.Pagination.fluxToPageResponseView; + @RestController public class OrganizationController implements OrganizationEndpoints { @@ -46,12 +49,13 @@ public class OrganizationController implements OrganizationEndpoints private UserService userService; @Override - public Mono>> getOrganizationByUser(@PathVariable String email) { - return userService.findByEmailDeep(email).flux().flatMap(user -> orgMemberService.getAllActiveOrgs(user.getId())) + public Mono> getOrganizationByUser(@PathVariable String email, + @RequestParam(required = false, defaultValue = "0") Integer pageNum, + @RequestParam(required = false, defaultValue = "0") Integer pageSize) { + var flux = userService.findByEmailDeep(email).flux().flatMap(user -> orgMemberService.getAllActiveOrgs(user.getId())) .flatMap(orgMember -> organizationService.getById(orgMember.getOrgId())) - .map(OrgView::new) - .collectList() - .map(ResponseView::success); + .map(OrgView::new).cache(); + return fluxToPageResponseView(pageNum, pageSize, flux); } @Override diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java index 5ceaa5bd4..1e5b0075b 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java @@ -4,6 +4,7 @@ import jakarta.validation.Valid; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.usermanagement.view.OrgMemberListView; import org.lowcoder.api.usermanagement.view.OrgView; @@ -44,7 +45,9 @@ public interface OrganizationEndpoints description = "Get a list of specified user's organization" ) @GetMapping("/byuser/{email}") - public Mono>> getOrganizationByUser(@PathVariable String email); + public Mono> getOrganizationByUser(@PathVariable String email, + @RequestParam(required = false, defaultValue = "0") Integer pageNum, + @RequestParam(required = false, defaultValue = "0") Integer pageSize); @Operation( tags = TAG_ORGANIZATION_MANAGEMENT, diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupListResponseView.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupListResponseView.java index 7b228d960..16af7b62a 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupListResponseView.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupListResponseView.java @@ -12,11 +12,17 @@ public class GroupListResponseView extends ResponseView { private final int totalDevelopersOnly; private final int totalAdmins; private final int totalOtherMembers; - public GroupListResponseView(int code, String message, T data, int totalAdmins, int totalAdminsAndDevelopers, int totalDevelopersOnly, int totalOtherMembers) { + private final int total; + private final int pageNum; + private final int pageSize; + public GroupListResponseView(int code, String message, T data, int totalAdmins, int totalAdminsAndDevelopers, int totalDevelopersOnly, int totalOtherMembers, int total, int pageNum, int pageSize) { super(code, message, data); this.totalAdmins = totalAdmins; this.totalDevelopersOnly = totalDevelopersOnly; this.totalAdminsAndDevelopers = totalAdminsAndDevelopers; this.totalOtherMembers = totalOtherMembers; + this.total = total; + this.pageNum = pageNum; + this.pageSize = pageSize; } } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/Pagination.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/Pagination.java index 436ac376c..051c3e006 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/Pagination.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/util/Pagination.java @@ -2,8 +2,13 @@ import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; +import org.jetbrains.annotations.NotNull; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.sdk.exception.BizException; import org.springframework.data.domain.PageRequest; +import org.springframework.web.bind.annotation.RequestParam; +import reactor.core.publisher.Flux; +import reactor.core.publisher.Mono; public class Pagination { @@ -55,4 +60,13 @@ public int page() { public int size() { return Math.min(Math.max(MIN_SIZE, size), maxSize); } + + @NotNull + public static Mono> fluxToPageResponseView(Integer pageNum, Integer pageSize, Flux flux) { + var countMono = flux.count(); + var flux1 = flux.skip((long) pageNum * pageSize); + if(pageSize > 0) flux1 = flux1.take(pageSize); + return flux1.collectList().zipWith(countMono) + .map(tuple -> PageResponseView.success(tuple.getT1(), pageNum, pageSize, Math.toIntExact(tuple.getT2()))); + } } From a7071458e8bdc0b27e085ec3fc17e299b76e1a5a Mon Sep 17 00:00:00 2001 From: Thomasr Date: Thu, 14 Nov 2024 12:16:37 -0500 Subject: [PATCH 3/6] Fix sublist params --- .../java/org/lowcoder/api/usermanagement/GroupController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java index 490febac4..20cb520d2 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java @@ -99,7 +99,7 @@ public Mono>> getOrgGroups(@RequestParam(r .filter(orgMember -> !orgMember.isAdmin() && !orgMember.isSuperAdmin() && devMembers.stream().noneMatch(devMember -> devMember.getUserId().equals(orgMember.getUserId()))).toList().size(); - var subList = groupList.subList(pageNum * pageSize, pageSize <= 0?(groupList.size() + 1):pageNum * pageSize + pageSize); + var subList = groupList.subList(pageNum * pageSize, pageSize <= 0?groupList.size():pageNum * pageSize + pageSize); return new GroupListResponseView<>(ResponseView.SUCCESS, "", subList, From 6854120901fd7f4b9f891876aadbfabd189233ef Mon Sep 17 00:00:00 2001 From: Thomasr Date: Fri, 15 Nov 2024 11:49:47 -0500 Subject: [PATCH 4/6] add pagination to groupmember, orgmember --- .../group/service/GroupMemberService.java | 2 +- .../group/service/GroupMemberServiceImpl.java | 2 +- .../SuggestAppAdminSolutionServiceImpl.java | 2 +- .../AbstractBizThresholdChecker.java | 2 +- .../usermanagement/GroupApiServiceImpl.java | 26 ++++++++++++------- .../api/usermanagement/GroupController.java | 4 +-- .../api/usermanagement/GroupEndpoints.java | 2 +- .../api/usermanagement/OrgApiServiceImpl.java | 17 +++++++++--- .../view/GroupMemberAggregateView.java | 3 +++ .../view/OrgMemberListView.java | 3 +++ 10 files changed, 43 insertions(+), 20 deletions(-) diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/service/GroupMemberService.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/service/GroupMemberService.java index 796b3e5e5..813628d06 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/service/GroupMemberService.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/service/GroupMemberService.java @@ -12,7 +12,7 @@ public interface GroupMemberService { - Mono> getGroupMembers(String groupId, int page, int count); + Mono> getGroupMembers(String groupId); Mono addMember(String orgId, String groupId, String userId, MemberRole memberRole); diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/service/GroupMemberServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/service/GroupMemberServiceImpl.java index cd178341a..82de01adf 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/service/GroupMemberServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/group/service/GroupMemberServiceImpl.java @@ -29,7 +29,7 @@ public class GroupMemberServiceImpl implements GroupMemberService { private final MongoUpsertHelper mongoUpsertHelper; @Override - public Mono> getGroupMembers(String groupId, int page, int count) { + public Mono> getGroupMembers(String groupId) { return biRelationService.getBySourceId(GROUP_MEMBER, groupId) .map(GroupMember::from) .collectList(); diff --git a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolutionServiceImpl.java b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolutionServiceImpl.java index a5063416c..c34dbb28c 100644 --- a/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolutionServiceImpl.java +++ b/server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/permission/solution/SuggestAppAdminSolutionServiceImpl.java @@ -63,7 +63,7 @@ private Mono> getSuggestAdminIds(int limit, List adminUserIdSet = newHashSet(adminUserIds); return Flux.fromIterable(adminGroupIds) - .flatMap(groupId -> groupMemberService.getGroupMembers(groupId, 1, 100)) + .flatMap(groupMemberService::getGroupMembers) .flatMapIterable(list -> list) .map(GroupMember::getUserId) .filter(it -> !adminUserIdSet.contains(it)) diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bizthreshold/AbstractBizThresholdChecker.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bizthreshold/AbstractBizThresholdChecker.java index 63abc0678..98bb015cc 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bizthreshold/AbstractBizThresholdChecker.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/bizthreshold/AbstractBizThresholdChecker.java @@ -98,7 +98,7 @@ private boolean orgAppCountBelowThreshold(String orgId, long orgAppCount) { public Mono checkMaxDeveloperCount(String orgId, String developGroupId, String userId) { return orgMemberService.getAllOrgAdmins(orgId) - .zipWith(groupMemberService.getGroupMembers(developGroupId, 1, 100)) + .zipWith(groupMemberService.getGroupMembers(developGroupId)) .zipWith(getMaxDeveloperCount(), TupleUtils::merge) .flatMap(tuple -> { List t1 = tuple.getT1(); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java index abf581586..07e97fc9d 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupApiServiceImpl.java @@ -16,6 +16,7 @@ import com.github.f4b6a3.uuid.UuidCreator; import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.tuple.Pair; import org.lowcoder.api.bizthreshold.AbstractBizThresholdChecker; import org.lowcoder.api.home.SessionUserService; import org.lowcoder.api.usermanagement.view.CreateGroupRequest; @@ -77,16 +78,16 @@ public Mono getGroupMembers(String groupId, int page, return groupAndOrgMemberInfo .filter(this::hasReadPermission) .switchIfEmpty(deferredError(BizError.NOT_AUTHORIZED, NOT_AUTHORIZED)) - .flatMap(groupMember -> groupMemberService.getGroupMembers(groupId, page, count)) - .> flatMap(members -> { + .flatMap(groupMember -> groupMemberService.getGroupMembers(groupId)) + ., Integer>> flatMap(members -> { if (members.isEmpty()) { - return Mono.just(emptyList()); + return Mono.just(Pair.of(emptyList(), 0)); } List userIds = collectList(members, GroupMember::getUserId); Mono> userMapMono = userService.getByIds(userIds); - return userMapMono.map(map -> - members.stream() + return userMapMono.map(map -> { + var list = members.stream() .map(orgMember -> { User user = map.get(orgMember.getUserId()); if (user == null) { @@ -95,13 +96,20 @@ public Mono getGroupMembers(String groupId, int page, return new GroupMemberView(orgMember, user); }) .filter(Objects::nonNull) - .toList()); + .toList(); + var pageTotal = list.size(); + list = list.subList(page * count, Math.min(page * count + count, pageTotal)); + return Pair.of(list, pageTotal); + }); }) .zipWith(visitorRoleMono) .map(tuple -> { - List t1 = tuple.getT1(); + Pair, Integer> t1 = tuple.getT1(); return GroupMemberAggregateView.builder() - .members(t1) + .members(t1.getLeft()) + .total(t1.getRight()) + .pageNum(page) + .pageSize(count) .visitorRole(tuple.getT2().getValue()) .build(); }); @@ -196,7 +204,7 @@ public Mono> getGroups() { } return groupService.getByOrgId(orgId) .sort() - .flatMapSequential(group -> groupMemberService.getGroupMembers(group.getId(), 0, -1) + .flatMapSequential(group -> groupMemberService.getGroupMembers(group.getId()) .zipWith(orgAdminsMono) .flatMap(tuple -> { var users = tuple.getT1().stream().filter(user -> user.getRole() != MemberRole.SUPER_ADMIN).toList(); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java index 20cb520d2..acde4ffd1 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java @@ -84,7 +84,7 @@ public Mono>> getOrgGroups(@RequestParam(r .map(OrgMember::getOrgId) .flatMap(orgId -> orgMemberService.getOrganizationMembers(orgId) .collectList() - .zipWith(groupService.getDevGroup(orgId).flatMap(devGroup -> groupMemberService.getGroupMembers(devGroup.getId(), 0, -1))) + .zipWith(groupService.getDevGroup(orgId).flatMap(devGroup -> groupMemberService.getGroupMembers(devGroup.getId()))) .map(tuple -> { List orgMembers = tuple.getT1(); List devMembers = tuple.getT2(); @@ -119,7 +119,7 @@ public Mono>> getOrgGroups(@RequestParam(r @Override public Mono> getGroupMembers(@PathVariable String groupId, - @RequestParam(name = "page", required = false, defaultValue = "1") int page, + @RequestParam(name = "page", required = false, defaultValue = "0") int page, @RequestParam(name = "count", required = false, defaultValue = "100") int count) { String objectId = gidService.convertGroupIdToObjectId(groupId); return groupApiService.getGroupMembers(objectId, page, count) diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java index 61bca5017..58faec633 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java @@ -74,7 +74,7 @@ public Mono>> getOrgGroups(@RequestParam(r ) @GetMapping("/{groupId}/members") public Mono> getGroupMembers(@PathVariable String groupId, - @RequestParam(name = "page", required = false, defaultValue = "1") int page, + @RequestParam(name = "page", required = false, defaultValue = "0") int page, @RequestParam(name = "count", required = false, defaultValue = "100") int count); @Operation( diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiServiceImpl.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiServiceImpl.java index 507c6effd..0a68beb8a 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiServiceImpl.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrgApiServiceImpl.java @@ -3,6 +3,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.SetUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.tuple.Pair; import org.lowcoder.api.authentication.dto.OrganizationDomainCheckResult; import org.lowcoder.api.bizthreshold.AbstractBizThresholdChecker; import org.lowcoder.api.config.ConfigView; @@ -92,7 +93,8 @@ private Mono getOrgMemberListView(String orgId, int page, int .collect(Collectors.toList()); Mono> users = userService.getByIds(userIds); - return users.map(map -> orgMembers.stream() + return users.map(map -> { + var list = orgMembers.stream() .map(orgMember -> { User user = map.get(orgMember.getUserId()); if (user == null) { @@ -102,15 +104,22 @@ private Mono getOrgMemberListView(String orgId, int page, int return build(user, orgMember); }) .filter(Objects::nonNull) - .collect(Collectors.toList()) - ); + .collect(Collectors.toList()); + var pageTotal = list.size(); + list = list.subList(page * count, Math.min(page * count + count, pageTotal)); + return Pair.of(list, pageTotal); + }); }) .zipWith(sessionUserService.getVisitorOrgMemberCache()) .map(tuple -> { - List orgMemberViews = tuple.getT1(); + List orgMemberViews = tuple.getT1().getLeft(); + var pageTotal = tuple.getT1().getRight(); OrgMember orgMember = tuple.getT2(); return OrgMemberListView.builder() .members(orgMemberViews) + .total(pageTotal) + .pageNum(page) + .pageSize(count) .visitorRole(orgMember.getRole().getValue()) .build(); }); diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupMemberAggregateView.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupMemberAggregateView.java index 1a3ec72d8..2949333e2 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupMemberAggregateView.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/GroupMemberAggregateView.java @@ -10,4 +10,7 @@ public class GroupMemberAggregateView { private String visitorRole; private List members; + private Integer total; + private Integer pageNum; + private Integer pageSize; } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/OrgMemberListView.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/OrgMemberListView.java index 4da5931e0..60baa5402 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/OrgMemberListView.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/view/OrgMemberListView.java @@ -13,6 +13,9 @@ public class OrgMemberListView { private String visitorRole; private List members; + private Integer total; + private Integer pageNum; + private Integer pageSize; @Getter @SuperBuilder From ae5dd6950a2717568d5b51fb0ccd4a6aa4d19ada Mon Sep 17 00:00:00 2001 From: Thomasr Date: Fri, 15 Nov 2024 12:16:28 -0500 Subject: [PATCH 5/6] add pagination to datasource --- .../api/datasource/DatasourceController.java | 26 ++++++++++--------- .../api/datasource/DatasourceEndpoints.java | 13 +++++++--- 2 files changed, 24 insertions(+), 15 deletions(-) diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java index f604a287b..4d0071639 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceController.java @@ -7,6 +7,7 @@ import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.BooleanUtils; import org.apache.commons.lang3.StringUtils; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.permission.view.CommonPermissionView; import org.lowcoder.api.util.BusinessEventPublisher; @@ -29,6 +30,7 @@ import java.util.List; import java.util.Locale; +import static org.lowcoder.api.util.Pagination.fluxToPageResponseView; import static org.lowcoder.plugin.api.event.LowcoderEvent.EventType.*; import static org.lowcoder.sdk.exception.BizError.INVALID_PARAMETER; import static org.lowcoder.sdk.util.ExceptionUtils.ofError; @@ -116,11 +118,11 @@ public Mono> getStructure(@PathVariable String * name, type... and the plugin definition of it, excluding the detail configs such as the connection uri, password... */ @Override - public Mono>> listJsDatasourcePlugins(@RequestParam("appId") String applicationId, @RequestParam(required = false) String name, @RequestParam(required = false) String type) { + public Mono> listJsDatasourcePlugins(@RequestParam("appId") String applicationId, @RequestParam(required = false) String name, @RequestParam(required = false) String type, + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "0") int pageSize) { String objectId = gidService.convertApplicationIdToObjectId(applicationId); - return datasourceApiService.listJsDatasourcePlugins(objectId, name, type) - .collectList() - .map(ResponseView::success); + return fluxToPageResponseView(pageNum, pageSize, datasourceApiService.listJsDatasourcePlugins(objectId, name, type)); } /** @@ -139,26 +141,26 @@ public Mono>> getPluginDynamicConfig( @SneakyThrows @Override - public Mono>> listOrgDataSources(@RequestParam(name = "orgId") String orgId, @RequestParam(required = false) String name, @RequestParam(required = false) String type) { + public Mono> listOrgDataSources(@RequestParam(name = "orgId") String orgId, @RequestParam(required = false) String name, @RequestParam(required = false) String type, + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "0") int pageSize) { if (StringUtils.isBlank(orgId)) { return ofError(BizError.INVALID_PARAMETER, "ORG_ID_EMPTY"); } String objectId = gidService.convertOrganizationIdToObjectId(orgId); - return datasourceApiService.listOrgDataSources(objectId, name, type) - .collectList() - .map(ResponseView::success); + return fluxToPageResponseView(pageNum, pageSize, datasourceApiService.listOrgDataSources(objectId, name, type)); } @Override - public Mono>> listAppDataSources(@RequestParam(name = "appId") String applicationId, @RequestParam(required = false) String name, @RequestParam(required = false) String type) { + public Mono> listAppDataSources(@RequestParam(name = "appId") String applicationId, @RequestParam(required = false) String name, @RequestParam(required = false) String type, + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "0") int pageSize) { if (StringUtils.isBlank(applicationId)) { return ofError(BizError.INVALID_PARAMETER, "INVALID_APP_ID"); } String objectId = gidService.convertApplicationIdToObjectId(applicationId); - return datasourceApiService.listAppDataSources(objectId, name, type) - .collectList() - .map(ResponseView::success); + return fluxToPageResponseView(pageNum, pageSize, datasourceApiService.listAppDataSources(objectId, name, type)); } @Override diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceEndpoints.java index bffadd018..d3608533d 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/datasource/DatasourceEndpoints.java @@ -4,6 +4,7 @@ import io.swagger.v3.oas.annotations.Operation; import jakarta.annotation.Nullable; import jakarta.validation.Valid; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.permission.view.CommonPermissionView; import org.lowcoder.domain.datasource.model.Datasource; @@ -99,7 +100,9 @@ public Mono> getStructure(@PathVariable String description = "Retrieve a list of node service plugins available within Lowcoder." ) @GetMapping("/jsDatasourcePlugins") - public Mono>> listJsDatasourcePlugins(@RequestParam("appId") String applicationId, @RequestParam(required = false) String name, @RequestParam(required = false) String type); + public Mono> listJsDatasourcePlugins(@RequestParam("appId") String applicationId, @RequestParam(required = false) String name, @RequestParam(required = false) String type, + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "0") int pageSize); /** * Proxy the request to the node service, besides, add the "extra" information from the data source config stored in the mongodb if exists to @@ -123,7 +126,9 @@ public Mono>> getPluginDynamicConfig( ) @JsonView(JsonViews.Public.class) @GetMapping("/listByOrg") - public Mono>> listOrgDataSources(@RequestParam(name = "orgId") String orgId, @RequestParam String name, @RequestParam String type); + public Mono> listOrgDataSources(@RequestParam(name = "orgId") String orgId, @RequestParam String name, @RequestParam String type, + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "0") int pageSize); @Operation( tags = TAG_DATASOURCE_MANAGEMENT, @@ -134,7 +139,9 @@ public Mono>> getPluginDynamicConfig( @Deprecated @JsonView(JsonViews.Public.class) @GetMapping("/listByApp") - public Mono>> listAppDataSources(@RequestParam(name = "appId") String applicationId, @RequestParam String name, @RequestParam String type); + public Mono> listAppDataSources(@RequestParam(name = "appId") String applicationId, @RequestParam String name, @RequestParam String type, + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "0") int pageSize); @Operation( tags = TAG_DATASOURCE_PERMISSIONS, From 2d4a12dc1a0315ddd19e11aabe48c46304db68c9 Mon Sep 17 00:00:00 2001 From: Thomasr Date: Mon, 18 Nov 2024 03:05:19 -0500 Subject: [PATCH 6/6] add pagination to library query --- .../lowcoder/api/query/LibraryQueryController.java | 13 ++++++++++--- .../lowcoder/api/query/LibraryQueryEndpoints.java | 5 ++++- .../api/query/LibraryQueryRecordController.java | 11 ++++++++--- .../api/query/LibraryQueryRecordEndpoints.java | 5 ++++- .../api/usermanagement/GroupController.java | 6 +++--- .../lowcoder/api/usermanagement/GroupEndpoints.java | 4 ++-- .../api/usermanagement/OrganizationController.java | 6 +++--- .../api/usermanagement/OrganizationEndpoints.java | 4 ++-- 8 files changed, 36 insertions(+), 18 deletions(-) diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryController.java index adcee61c2..be0e7de68 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryController.java @@ -2,6 +2,7 @@ import java.util.List; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.query.view.LibraryQueryAggregateView; import org.lowcoder.api.query.view.LibraryQueryPublishRequest; @@ -19,8 +20,11 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import static org.lowcoder.api.util.Pagination.fluxToPageResponseView; + @RestController public class LibraryQueryController implements LibraryQueryEndpoints { @@ -41,9 +45,12 @@ public Mono>> dropDownList(@Request } @Override - public Mono>> list(@RequestParam(required = false, defaultValue = "") String name) { - return libraryQueryApiService.listLibraryQueries(name) - .map(ResponseView::success); + public Mono> list(@RequestParam(required = false, defaultValue = "") String name, + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "100") int pageSize) { + var flux = libraryQueryApiService.listLibraryQueries(name) + .flatMapMany(Flux::fromIterable); + return fluxToPageResponseView(pageNum, pageSize, flux); } @Override diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryEndpoints.java index 1be240f50..c4acd3749 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryEndpoints.java @@ -4,6 +4,7 @@ import java.util.List; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.query.view.LibraryQueryAggregateView; import org.lowcoder.api.query.view.LibraryQueryPublishRequest; @@ -38,7 +39,9 @@ public interface LibraryQueryEndpoints description = "Retrieve a list of Library Queries for a specific Organization within Lowcoder." ) @GetMapping("/listByOrg") - public Mono>> list(@RequestParam(required = false, defaultValue = "") String name); + public Mono> list(@RequestParam(required = false, defaultValue = "") String name, + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "100") int pageSize); @Operation( tags = TAG_LIBRARY_QUERY_MANAGEMENT, diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryRecordController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryRecordController.java index 097f58095..31a1b8b4d 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryRecordController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryRecordController.java @@ -3,6 +3,7 @@ import java.util.List; import java.util.Map; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.query.view.LibraryQueryRecordMetaView; import org.lowcoder.domain.query.model.LibraryQueryCombineId; @@ -11,8 +12,11 @@ import org.springframework.web.bind.annotation.RestController; import lombok.RequiredArgsConstructor; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import static org.lowcoder.api.util.Pagination.fluxToPageResponseView; + @RequiredArgsConstructor @RestController public class LibraryQueryRecordController implements LibraryQueryRecordEndpoints @@ -25,9 +29,10 @@ public Mono delete(@PathVariable String libraryQueryRecordId) { } @Override - public Mono>> getByLibraryQueryId(@RequestParam(name = "libraryQueryId") String libraryQueryId) { - return libraryQueryRecordApiService.getByLibraryQueryId(libraryQueryId) - .map(ResponseView::success); + public Mono> getByLibraryQueryId(@RequestParam(name = "libraryQueryId") String libraryQueryId, + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "100") int pageSize) { + return fluxToPageResponseView(pageNum, pageSize, libraryQueryRecordApiService.getByLibraryQueryId(libraryQueryId).flatMapMany(Flux::fromIterable)); } @Override diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryRecordEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryRecordEndpoints.java index 82d47db97..7fb642fb0 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryRecordEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/query/LibraryQueryRecordEndpoints.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; +import org.lowcoder.api.framework.view.PageResponseView; import org.lowcoder.api.framework.view.ResponseView; import org.lowcoder.api.query.view.LibraryQueryRecordMetaView; import org.springframework.web.bind.annotation.DeleteMapping; @@ -39,7 +40,9 @@ public interface LibraryQueryRecordEndpoints description = "Retrieve a specific Library Query Record within Lowcoder using the associated library query ID." ) @GetMapping("/listByLibraryQueryId") - public Mono>> getByLibraryQueryId(@RequestParam(name = "libraryQueryId") String libraryQueryId); + public Mono> getByLibraryQueryId(@RequestParam(name = "libraryQueryId") String libraryQueryId, + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "100") int pageSize); @Operation( tags = TAG_LIBRARY_QUERY_RECORDS, diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java index acde4ffd1..d478bcfc2 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupController.java @@ -119,10 +119,10 @@ public Mono>> getOrgGroups(@RequestParam(r @Override public Mono> getGroupMembers(@PathVariable String groupId, - @RequestParam(name = "page", required = false, defaultValue = "0") int page, - @RequestParam(name = "count", required = false, defaultValue = "100") int count) { + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "100") int pageSize) { String objectId = gidService.convertGroupIdToObjectId(groupId); - return groupApiService.getGroupMembers(objectId, page, count) + return groupApiService.getGroupMembers(objectId, pageNum, pageSize) .map(ResponseView::success); } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java index 58faec633..4f0825333 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/GroupEndpoints.java @@ -74,8 +74,8 @@ public Mono>> getOrgGroups(@RequestParam(r ) @GetMapping("/{groupId}/members") public Mono> getGroupMembers(@PathVariable String groupId, - @RequestParam(name = "page", required = false, defaultValue = "0") int page, - @RequestParam(name = "count", required = false, defaultValue = "100") int count); + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "100") int pageSize); @Operation( tags = TAG_GROUP_MEMBERS, diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java index d7f48573f..b0acc8cf1 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationController.java @@ -90,10 +90,10 @@ public Mono> deleteLogo(@PathVariable String orgId) { @Override public Mono> getOrgMembers(@PathVariable String orgId, - @RequestParam(name = "page", required = false, defaultValue = "0") int page, - @RequestParam(name = "count", required = false, defaultValue = "1000") int count) { + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "1000") int pageSize) { String id = gidService.convertOrganizationIdToObjectId(orgId); - return orgApiService.getOrganizationMembers(id, page, count) + return orgApiService.getOrganizationMembers(id, pageNum, pageSize) .map(ResponseView::success); } diff --git a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java index 1e5b0075b..734012033 100644 --- a/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java +++ b/server/api-service/lowcoder-server/src/main/java/org/lowcoder/api/usermanagement/OrganizationEndpoints.java @@ -95,8 +95,8 @@ public Mono> uploadLogo(@PathVariable String orgId, ) @GetMapping("/{orgId}/members") public Mono> getOrgMembers(@PathVariable String orgId, - @RequestParam(name = "page", required = false, defaultValue = "0") int page, - @RequestParam(name = "count", required = false, defaultValue = "1000") int count); + @RequestParam(required = false, defaultValue = "0") int pageNum, + @RequestParam(required = false, defaultValue = "1000") int pageSize); @Operation( tags = TAG_ORGANIZATION_MEMBERS,