diff --git a/pluto-server/pom.xml b/pluto-server/pom.xml index cbb0a3ba1797a9b4f158c1ea79f84a4abbab2603..38c51b68ce30999e1882a3abe215c2e2120c3ac3 100644 --- a/pluto-server/pom.xml +++ b/pluto-server/pom.xml @@ -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> @@ -35,7 +36,7 @@ <jsoup.version>1.13.1</jsoup.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> - + </properties> <dependencies> @@ -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> diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java index ce737d3b740a438f420262c37297a3ec0602e53d..700960e4ced11bf425dd26cee744f7ad324649b3 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryImpl.java @@ -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; } diff --git a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangRepository.java b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangRepository.java index de90bb6244132751e4936d6f4d69089ff4e24fdb..1c87b0d2a6302a2145ceeab5f90e47781a05c533 100644 --- a/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangRepository.java +++ b/pluto-server/src/main/java/de/itvsh/ozg/pluto/vorgang/VorgangRepository.java @@ -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), diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/FilterByTestFactory.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/FilterByTestFactory.java index e5ef8723dcf53c227b925f254975d27a42e38447..8f631da6fb55e06f401f409b0d14a23f9fd49f5a 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/FilterByTestFactory.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/FilterByTestFactory.java @@ -2,12 +2,12 @@ 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(); } - + public static FilterBy create() { return createBuilder().build(); } diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java index 9ba0e03dd8ffb7c296ce283046e1819096fea0ab..104c17a21f7d71c7f7a56cf282a339354f955bd6 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangHeaderRepositoryITCase.java @@ -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 diff --git a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangITCase.java b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangITCase.java index 6d42c4e1c3ef175e8c2ea88d28dc2045b85e634c..c84b49ca16c63a9432a29724b97b9aef31988e38 100644 --- a/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangITCase.java +++ b/pluto-server/src/test/java/de/itvsh/ozg/pluto/vorgang/VorgangITCase.java @@ -127,130 +127,147 @@ class VorgangITCase { class TestFindVorgang { private final StreamRecorder<GrpcFindVorgangResponse> responseObserver = StreamRecorder.create(); - + @Nested class TestFindAll { - + private final GrpcFindVorgangRequest request = GrpcFindVorgangRequestTestFactory.createBuilder().clearFilterBy().clearSearchBy().build(); - + @BeforeEach void prepareDatabase() { mongoOperations.dropCollection(Vorgang.class); - + mongoOperations.save(VorgangTestFactory.createBuilder().id("1").build()); mongoOperations.save(VorgangTestFactory.createBuilder().id("2").build()); } - + @Test void shouldReturnVorgaenge() { callServiceFindVorgang(request); - + var response = responseObserver.getValues(); - + 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() { mongoOperations.dropCollection(Vorgang.class); - - mongoOperations.save(VorgangTestFactory.createBuilder().id("1"). build()); + + mongoOperations.save(VorgangTestFactory.createBuilder().id("1").build()); mongoOperations.save(buildVorgangWithRequestId("2", SEARCH_BY)); } - + @Test void shouldReturnVorgaenge() { callServiceFindVorgang(request); - + var response = responseObserver.getValues(); - + assertThat(response.get(0).getVorgangList()).hasSize(1); assertThat(response.get(0).getVorgangList().get(0).getId()).isEqualTo("2"); } } - + @Nested class TestFindAllFilterBy { - + 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() { mongoOperations.dropCollection(Vorgang.class); - - mongoOperations.save(VorgangTestFactory.createBuilder().id("1"). build()); + + mongoOperations.save(VorgangTestFactory.createBuilder().id("1").build()); mongoOperations.save(buildVorgangWithOrganisationseinheitId("2", ORGANISATIONSEINHEIT_ID)); } - + @Test - void shouldReturnVorgaenge() { + void shouldReturnOnlyMatchingVorgang() { callServiceFindVorgang(request); - + var response = responseObserver.getValues(); - + 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 class TestFindAllSearchAndFilterBy { - + 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() { mongoOperations.dropCollection(Vorgang.class); - + mongoOperations.save(VorgangTestFactory.createBuilder().id("1").build()); mongoOperations.save(buildVorgangWithRequestIdAndOrganisationseinheitId("2", ORGANISATIONSEINHEIT_ID, SEARCH_BY)); } - + @Test void shouldReturnVorgaenge() { callServiceFindVorgang(request); - + var response = responseObserver.getValues(); - + assertThat(response.get(0).getVorgangList()).hasSize(1); 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) { return EingangHeaderTestFactory.createBuilder().requestId(searchBy).build(); } - + private ZustaendigeStelle buildZustaendigeStelle(String organisationseinheitId) { return ZustaendigeStelleTestFactory.createBuilder().organisationseinheitenId(organisationseinheitId).build(); } - + private Vorgang buildVorgangWithEingang(String id, Eingang eingang) { return VorgangTestFactory.createBuilder().id(id).eingang(eingang).build(); } - + private void callServiceFindVorgang(GrpcFindVorgangRequest request) { service.findVorgang(request, responseObserver); }