Skip to content

Commit a10c20b

Browse files
dragonpooludomikula
authored andcommitted
Fixed pagination for myorg endpoint.
1 parent d509dc7 commit a10c20b

File tree

4 files changed

+53
-14
lines changed

4 files changed

+53
-14
lines changed

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/repository/OrganizationRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
import org.lowcoder.domain.organization.model.OrganizationState;
77
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
88
import org.springframework.stereotype.Repository;
9+
import org.springframework.data.domain.Pageable;
10+
import java.util.List;
911

1012
import reactor.core.publisher.Flux;
1113
import reactor.core.publisher.Mono;
@@ -31,4 +33,7 @@ public interface OrganizationRepository extends ReactiveMongoRepository<Organiza
3133

3234
Flux<Organization> findByOrganizationDomainIsNotNull();
3335
Mono<Boolean> existsBySlug(String slug);
36+
37+
Flux<Organization> findByIdInAndNameContainingIgnoreCase(List<String> ids, String name, Pageable pageable);
38+
Mono<Long> countByIdInAndNameContainingIgnoreCase(List<String> ids, String name);
3439
}

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/service/OrganizationService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.lowcoder.infra.annotation.NonEmptyMono;
99
import org.lowcoder.infra.annotation.PossibleEmptyMono;
1010
import org.springframework.http.codec.multipart.Part;
11+
import org.springframework.data.domain.Pageable;
1112

1213
import reactor.core.publisher.Flux;
1314
import reactor.core.publisher.Mono;
@@ -52,4 +53,7 @@ public interface OrganizationService {
5253
Mono<Boolean> updateCommonSettings(String orgId, String key, Object value);
5354

5455
Mono<Organization> updateSlug(String organizationId, String newSlug);
56+
57+
Flux<Organization> findUserOrgs(String userId, String orgName, Pageable pageable);
58+
Mono<Long> countUserOrgs(String userId, String orgName);
5559
}

server/api-service/lowcoder-domain/src/main/java/org/lowcoder/domain/organization/service/OrganizationServiceImpl.java

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import org.lowcoder.domain.user.repository.UserRepository;
1919
import org.lowcoder.domain.util.SlugUtils;
2020
import org.lowcoder.infra.annotation.PossibleEmptyMono;
21+
import org.lowcoder.infra.birelation.BiRelationService;
22+
import org.lowcoder.infra.birelation.BiRelation;
2123
import org.lowcoder.infra.mongo.MongoUpsertHelper;
2224
import org.lowcoder.sdk.config.CommonConfig;
2325
import org.lowcoder.sdk.config.dynamic.Conf;
@@ -31,6 +33,7 @@
3133
import org.springframework.data.mongodb.core.query.Update;
3234
import org.springframework.http.codec.multipart.Part;
3335
import org.springframework.stereotype.Service;
36+
import org.springframework.data.domain.Pageable;
3437
import reactor.core.publisher.Flux;
3538
import reactor.core.publisher.Mono;
3639

@@ -41,6 +44,7 @@
4144
import static org.lowcoder.domain.organization.model.OrganizationState.DELETED;
4245
import static org.lowcoder.domain.util.QueryDslUtils.fieldName;
4346
import static org.lowcoder.sdk.exception.BizError.UNABLE_TO_FIND_VALID_ORG;
47+
import static org.lowcoder.infra.birelation.BiRelationBizType.ORG_MEMBER;
4448
import static org.lowcoder.sdk.util.ExceptionUtils.deferredError;
4549
import static org.lowcoder.sdk.util.ExceptionUtils.ofError;
4650
import static org.lowcoder.sdk.util.LocaleUtils.getLocale;
@@ -62,6 +66,7 @@ public class OrganizationServiceImpl implements OrganizationService {
6266
private final ApplicationContext applicationContext;
6367
private final CommonConfig commonConfig;
6468
private final ConfigCenter configCenter;
69+
private final BiRelationService biRelationService;
6570

6671
@PostConstruct
6772
private void init()
@@ -315,4 +320,31 @@ public Mono<Organization> updateSlug(String organizationId, String newSlug) {
315320
});
316321
});
317322
}
323+
324+
@Override
325+
public Flux<Organization> findUserOrgs(String userId, String orgName, Pageable pageable) {
326+
return biRelationService.getByTargetId(ORG_MEMBER, userId)
327+
.map(BiRelation::getSourceId)
328+
.collectList()
329+
.flatMapMany(orgIds -> {
330+
if (orgIds.isEmpty()) {
331+
return Flux.empty();
332+
}
333+
return repository.findByIdInAndNameContainingIgnoreCase(orgIds, orgName, pageable);
334+
});
335+
}
336+
337+
@Override
338+
public Mono<Long> countUserOrgs(String userId, String orgName) {
339+
String filter = orgName == null ? "" : orgName;
340+
return biRelationService.getByTargetId(ORG_MEMBER, userId)
341+
.map(BiRelation::getSourceId)
342+
.collectList()
343+
.flatMap(orgIds -> {
344+
if (orgIds.isEmpty()) {
345+
return Mono.just(0L);
346+
}
347+
return repository.countByIdInAndNameContainingIgnoreCase(orgIds, filter);
348+
});
349+
}
318350
}

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

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
import org.springframework.http.codec.multipart.Part;
2828
import org.springframework.web.bind.annotation.*;
2929
import org.springframework.web.server.ServerWebExchange;
30+
import org.springframework.data.domain.Pageable;
31+
import org.springframework.data.domain.PageRequest;
32+
3033
import reactor.core.publisher.Flux;
3134
import reactor.core.publisher.Mono;
3235

@@ -77,20 +80,15 @@ public Mono<ResponseView<?>> getUserOrgs(ServerWebExchange exchange,
7780
@RequestParam(required = false, defaultValue = "10") Integer pageSize) {
7881
return sessionUserService.getVisitor()
7982
.flatMap(user -> {
80-
Flux<OrgMember> orgMemberFlux = orgMemberService.getAllActiveOrgs(user.getId());
81-
82-
Flux<OrgView> orgViewFlux = orgMemberFlux
83-
.flatMap(orgMember -> organizationService.getById(orgMember.getOrgId()))
84-
.filter(org -> StringUtils.isBlank(orgName) || StringUtils.containsIgnoreCase(org.getName(), orgName))
85-
.map(OrgView::new);
86-
87-
return orgViewFlux.collectList().map(orgs -> {
88-
int total = orgs.size();
89-
int fromIndex = Math.max((pageNum - 1) * pageSize, 0);
90-
int toIndex = Math.min(fromIndex + pageSize, total);
91-
List<OrgView> pagedOrgs = fromIndex < toIndex ? orgs.subList(fromIndex, toIndex) : List.of();
92-
return PageResponseView.success(pagedOrgs, pageNum, pageSize, total);
93-
});
83+
Pageable pageable = PageRequest.of(pageNum - 1, pageSize);
84+
String filter = orgName == null ? "" : orgName;
85+
return organizationService.findUserOrgs(user.getId(), filter, pageable)
86+
.map(OrgView::new)
87+
.collectList()
88+
.zipWith(organizationService.countUserOrgs(user.getId(), filter))
89+
.map(tuple -> PageResponseView.success(
90+
tuple.getT1(), pageNum, pageSize, tuple.getT2().intValue()
91+
));
9492
})
9593
.map(ResponseView::success);
9694
}

0 commit comments

Comments
 (0)