Skip to content
Snippets Groups Projects
Commit 0d736145 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-1190 fix paging

parent 783cee10
No related branches found
No related tags found
No related merge requests found
......@@ -28,6 +28,7 @@
<spring-admin.version>2.3.1</spring-admin.version>
<commons-io.version>2.8.0</commons-io.version>
<commons-collections.version>4.4</commons-collections.version>
<spring-boot.build-image.imageName>docker.ozg-sh.de/pluto:build-latest</spring-boot.build-image.imageName>
......@@ -98,6 +99,11 @@
<artifactId>commons-io</artifactId>
<version>${commons-io.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>${commons-collections.version}</version>
</dependency>
<dependency>
<groupId>com.thedeanda</groupId>
......
......@@ -6,6 +6,7 @@ import java.util.LinkedList;
import java.util.List;
import java.util.Optional;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageImpl;
......@@ -30,14 +31,19 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository {
@Override
public Page<VorgangHeader> findAll(FindVorgangRequest request) {
return execAggration(aggregationBuilder(buildPageable(request)).withFilterBy(request.getFilterBy()).build(), buildPageable(request));
return executeRequest(request);
}
@Override
public Page<VorgangHeader> searchBy(FindVorgangRequest request) {
return execAggration(
aggregationBuilder(buildPageable(request)).withSearchBy(request.getSearchBy()).withFilterBy(request.getFilterBy()).build(),
buildPageable(request));
return executeRequest(request);
}
private Page<VorgangHeader> executeRequest(FindVorgangRequest request) {
var resultList = execAggration(
aggregationBuilder(buildPageable(request)).withSearchBy(request.getSearchBy()).withFilterBy(request.getFilterBy()).build());
return new PageImpl<>(resultList, buildPageable(request), countTotalVorgaenge(request.getFilterBy()));
}
Pageable buildPageable(FindVorgangRequest request) {
......@@ -48,14 +54,22 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository {
return new AggregationBuilder(pageRequest);
}
private Page<VorgangHeader> execAggration(Aggregation aggregation, Pageable pageable) {
private List<VorgangHeader> execAggration(Aggregation aggregation) {
var result = template.aggregate(aggregation, VorgangHeader.class, VorgangHeader.class);
return new PageImpl<>(result.getMappedResults(), pageable, countTotalVorgaenge());
return result.getMappedResults();
}
private long countTotalVorgaenge() {
return template.count(Query.query(new Criteria()), Vorgang.COLLECTION_NAME);
private long countTotalVorgaenge(FilterBy filterBy) {
return template.count(Query.query(filterToCriteria(filterBy)), Vorgang.COLLECTION_NAME);
}
private Criteria filterToCriteria(FilterBy filterBy) {
if (CollectionUtils.isEmpty(filterBy.getOrganisationseinheitIds()))
return new Criteria();
else
return new Criteria(Vorgang.FIELD_ORGANISATIONSEINHEIT).in(filterBy.getOrganisationseinheitIds());
}
@RequiredArgsConstructor
......@@ -65,7 +79,7 @@ class VorgangHeaderRepositoryImpl implements CustomVorgangHeaderRepository {
private Optional<FilterBy> filterBy = Optional.empty();
AggregationBuilder withSearchBy(String searchBy) {
this.searchBy = Optional.of(searchBy);
this.searchBy = Optional.ofNullable(searchBy);
return this;
}
......
......@@ -20,26 +20,24 @@ class VorgangRepository {
@Autowired
private MongoOperations mongoOperations;
Optional<Vorgang> findById(String vorgangId) {
public Optional<Vorgang> findById(String vorgangId) {
return Optional.ofNullable(mongoOperations.findOne(
query(where(Vorgang.MONGODB_FIELDNAME_ID).is(vorgangId)),
Vorgang.class));
}
Vorgang findByIdAndVersion(String vorgangId, long version) {
public Vorgang findByIdAndVersion(String vorgangId, long version) {
return mongoOperations.findOne(
query(where(Vorgang.MONGODB_FIELDNAME_ID).is(vorgangId).and(Vorgang.MONGODB_FIELDNAME_VERSION).is(version)),
Vorgang.class);
}
Vorgang save(Vorgang vorgang) {
public Vorgang save(Vorgang vorgang) {
return mongoOperations.save(vorgang);
}
void updateStatus(String vorgangId, long version, Status status) {
public void updateStatus(String vorgangId, long version, Status status) {
mongoOperations.updateFirst(
queryVorgangByIdAndVersion(vorgangId, version),
......@@ -49,9 +47,9 @@ class VorgangRepository {
Vorgang.class);
}
void updateStatusWithoutVersionCheck(String vorgangId, Status status) {
public void updateStatusWithoutVersionCheck(String vorgangId, Status status) {
mongoOperations.updateFirst(
query(where(Vorgang.MONGODB_FIELDNAME_ID).is(vorgangId)),
queryById(vorgangId),
new Update()
.inc(Vorgang.MONGODB_FIELDNAME_VERSION, 1)
.set(Vorgang.MONGODB_FIELDNAME_STATUS, status),
......
......@@ -2,7 +2,7 @@ package de.itvsh.ozg.pluto.vorgang;
public class FilterByTestFactory {
public static String ORGANISATIONSEINHEIT_ID = "132654";
public static String ORGANISATIONSEINHEIT_ID = ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID;
public static FilterBy createEmpty() {
return FilterBy.builder().build();
......
......@@ -4,6 +4,7 @@ import static org.assertj.core.api.Assertions.*;
import java.time.ZonedDateTime;
import java.time.temporal.ChronoUnit;
import java.util.UUID;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Nested;
......@@ -55,8 +56,12 @@ class VorgangHeaderRepositoryITCase {
@Nested
class TestWithFilterByOrganisationseinheit {
final FindVorgangRequest request = FindVorgangRequestTestFactory.createBuilder().searchBy(SEARCH_BY).filterBy(buildFilter()).limit(10)
.offset(0).build();
private FilterBy filterBy = FilterByTestFactory.createBuilder().clearOrganisationseinheitIds()
.organisationseinheitId(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID).build();
private FindVorgangRequest request = FindVorgangRequestTestFactory.createBuilder().searchBy(SEARCH_BY).offset(0)
.filterBy(filterBy).limit(10)
.build();
@ParameterizedTest
@EnumSource
......@@ -69,6 +74,7 @@ class VorgangHeaderRepositoryITCase {
assertThat(result).hasSize(1);
}
}
private Vorgang buildWithEingangKennz(String kennz, Status status) {
......@@ -84,11 +90,6 @@ class VorgangHeaderRepositoryITCase {
var eingang = EingangTestFactory.createBuilder().header(header).zustaendigeStelle(zustaendigeStelle).build();
return VorgangTestFactory.createBuilder().id(null).status(status).eingang(eingang).build();
}
private FilterBy buildFilter() {
return FilterByTestFactory.createBuilder().clearOrganisationseinheitIds()
.organisationseinheitId(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID).build();
}
}
@Nested
......@@ -207,32 +208,48 @@ class VorgangHeaderRepositoryITCase {
@Nested
class TestFilterByOrganisationseinheit {
private static final String ORGANISATIONSEINHEIT_ID = "42";
private static final String OTHER_ZUSTAENDIGESTELLE_ID = UUID.randomUUID().toString();
@BeforeEach
void prepareDatabase() {
mongoOperations.dropCollection(Vorgang.class);
mongoOperations.save(buildWithOrganisationseinheitId());
mongoOperations.save(VorgangTestFactory.createBuilder().id("42").build());
mongoOperations.save(buildWithOtherOrganisationseinheitId());
mongoOperations.save(VorgangTestFactory.createBuilder().id(null).build());
}
private Vorgang buildWithOrganisationseinheitId() {
var zustaendigeStelle = ZustaendigeStelleTestFactory.createBuilder().organisationseinheitenId(ORGANISATIONSEINHEIT_ID).build();
private Vorgang buildWithOtherOrganisationseinheitId() {
var zustaendigeStelle = ZustaendigeStelleTestFactory.createBuilder().organisationseinheitenId(OTHER_ZUSTAENDIGESTELLE_ID).build();
var eingang = EingangTestFactory.createBuilder().zustaendigeStelle(zustaendigeStelle).build();
return VorgangTestFactory.createBuilder().id("44").eingang(eingang).build();
return VorgangTestFactory.createBuilder().id(null).clearEingangs().eingang(eingang).build();
}
@Test
void shouldReturnFilteredVorgaenge() {
void shouldHaveOneAsTotalElements() {
var vorgangHeaderPage = repository.findAll(buildRequest());
assertThat(vorgangHeaderPage.getTotalElements()).isEqualTo(1);
}
@Test
void shouldReturnOnlyOneVorgang() {
var vorgangHeaderPage = repository.findAll(buildRequest());
assertThat(vorgangHeaderPage.getNumberOfElements()).isEqualTo(1);
}
@Test
void shouldHaveOnlyOnePage() {
var vorgangHeaderPage = repository.findAll(buildRequest());
assertThat(vorgangHeaderPage.getTotalPages()).isEqualTo(1);
}
private FindVorgangRequest buildRequest() {
return FindVorgangRequestTestFactory.createBuilder().offset(0).limit(10).filterBy(
FilterBy.builder().organisationseinheitId(ORGANISATIONSEINHEIT_ID).build()).searchBy(StringUtils.EMPTY).build();
return FindVorgangRequestTestFactory.createBuilder().offset(0).limit(1).searchBy(StringUtils.EMPTY)
.filterBy(FilterBy.builder().organisationseinheitId(ZustaendigeStelleTestFactory.ORGANISATIONSEINHEIT_ID).build())
.build();
}
}
}
\ No newline at end of file
......@@ -150,11 +150,13 @@ class VorgangITCase {
assertThat(response.get(0).getVorgangList()).hasSize(2);
}
}
@Nested
class TestFindAllSearchBy {
private final String SEARCH_BY = "ShouldBeIncluded";
private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder().setSearchBy(SEARCH_BY).clearFilterBy().build();
private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder().setSearchBy(SEARCH_BY).clearFilterBy()
.build();
@BeforeEach
void prepareDatabase() {
......@@ -180,7 +182,9 @@ class VorgangITCase {
private final String ORGANISATIONSEINHEIT_ID = "094321";
private final GrpcFilterBy FILTER_BY = GrpcFilterByTestFactory.createBuilder().addOrganisationseinheitId(ORGANISATIONSEINHEIT_ID).build();
private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder().setFilterBy(FILTER_BY).clearSearchBy().build();
private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder()
.setFilterBy(FILTER_BY).clearSearchBy()
.setLimit(1).build();
@BeforeEach
void prepareDatabase() {
......@@ -191,7 +195,7 @@ class VorgangITCase {
}
@Test
void shouldReturnVorgaenge() {
void shouldReturnOnlyMatchingVorgang() {
callServiceFindVorgang(request);
var response = responseObserver.getValues();
......@@ -199,6 +203,15 @@ class VorgangITCase {
assertThat(response.get(0).getVorgangList()).hasSize(1);
assertThat(response.get(0).getVorgangList().get(0).getId()).isEqualTo("2");
}
@Test
void shouldReturnOneTotalPages() {
callServiceFindVorgang(request);
var response = responseObserver.getValues();
assertThat(response.get(0).getTotal()).isEqualTo(1);
}
}
@Nested
......@@ -207,7 +220,8 @@ class VorgangITCase {
private final String SEARCH_BY = "ShouldBeIncluded";
private final String ORGANISATIONSEINHEIT_ID = "094321";
private final GrpcFilterBy FILTER_BY = GrpcFilterByTestFactory.createBuilder().addOrganisationseinheitId(ORGANISATIONSEINHEIT_ID).build();
private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder().setFilterBy(FILTER_BY).setSearchBy(SEARCH_BY).build();
private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder().setFilterBy(FILTER_BY)
.setSearchBy(SEARCH_BY).build();
@BeforeEach
void prepareDatabase() {
......@@ -227,16 +241,19 @@ class VorgangITCase {
assertThat(response.get(0).getVorgangList().get(0).getId()).isEqualTo("2");
}
}
private Vorgang buildVorgangWithRequestId(String id, String searchBy) {
return buildVorgangWithEingang(id, EingangTestFactory.createBuilder().header(buildEingangHeader(searchBy)).build());
}
private Vorgang buildVorgangWithRequestIdAndOrganisationseinheitId(String id, String organisationseinheitId, String searchBy) {
return buildVorgangWithEingang(id, EingangTestFactory.createBuilder().header(buildEingangHeader(searchBy)).zustaendigeStelle(buildZustaendigeStelle(organisationseinheitId)).build());
return buildVorgangWithEingang(id, EingangTestFactory.createBuilder().header(buildEingangHeader(searchBy))
.zustaendigeStelle(buildZustaendigeStelle(organisationseinheitId)).build());
}
private Vorgang buildVorgangWithOrganisationseinheitId(String id, String organisationseinheitId) {
return buildVorgangWithEingang(id, EingangTestFactory.createBuilder().zustaendigeStelle(buildZustaendigeStelle(organisationseinheitId)).build());
return buildVorgangWithEingang(id,
EingangTestFactory.createBuilder().zustaendigeStelle(buildZustaendigeStelle(organisationseinheitId)).build());
}
private EingangHeader buildEingangHeader(String searchBy) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment