diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangService.java index 15fee3d854648fe9be203e95739242fc9c35a70e..99632a61f6593a8cb4079064f18aa82e5e9308ad 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangService.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangService.java @@ -24,14 +24,17 @@ package de.ozgcloud.apilib.vorgang; import java.util.List; +import java.util.stream.Stream; public interface OzgCloudVorgangService { - public OzgCloudVorgang getById(OzgCloudVorgangId vorgangId); + OzgCloudVorgang getById(OzgCloudVorgangId vorgangId); - public List<OzgCloudVorgangStub> find(OzgCloudVorgangQuery query, Page page); + List<OzgCloudVorgangStub> find(OzgCloudVorgangQuery query, Page page); - public List<OzgCloudVorgangStub> search(String searchString); + List<OzgCloudVorgangStub> search(String searchString); - public List<OzgCloudVorgangStub> search(String searchString, Page page); + List<OzgCloudVorgangStub> search(String searchString, Page page); + + Stream<OzgCloudVorgangStub> findDeleted(); } diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java index 07d27991d9756e2a6f18669d7e5d03dc55c32f61..e3eef0763a679e7ad45587b9393427fd579d835d 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangService.java @@ -23,7 +23,10 @@ */ package de.ozgcloud.apilib.vorgang.grpc; +import static de.ozgcloud.apilib.vorgang.grpc.StreamingUtils.*; + import java.util.List; +import java.util.stream.Stream; import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextAttachingInterceptor; import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider; @@ -34,6 +37,8 @@ import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStub; import de.ozgcloud.apilib.vorgang.Page; import de.ozgcloud.vorgang.vorgang.GrpcFilterBy; +import de.ozgcloud.vorgang.vorgang.GrpcFindDeletedVorgangRequest; +import de.ozgcloud.vorgang.vorgang.GrpcFindDeletedVorgangResponse; import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangRequest; import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangRequest.GrpcOrderBy; import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangRequest; @@ -63,8 +68,8 @@ public class GrpcOzgCloudVorgangService implements OzgCloudVorgangService { private GrpcFindVorgangWithEingangRequest buildRequest(@NonNull OzgCloudVorgangId vorgangId) { return GrpcFindVorgangWithEingangRequest.newBuilder() - .setId(vorgangId.toString()) - .build(); + .setId(vorgangId.toString()) + .build(); } @Override @@ -81,12 +86,12 @@ public class GrpcOzgCloudVorgangService implements OzgCloudVorgangService { GrpcFindVorgangRequest buildSearchRequest(@NonNull String searchString, Page page) { return GrpcFindVorgangRequest.newBuilder() - .setFilterBy(GrpcFilterBy.newBuilder().build()) - .setSearchBy(searchString) - .setOffset(page.getOffset()) - .setLimit(page.getLimit()) - .setOrderBy(GrpcOrderBy.CREATED_AT_DESC) - .build(); + .setFilterBy(GrpcFilterBy.newBuilder().build()) + .setSearchBy(searchString) + .setOffset(page.getOffset()) + .setLimit(page.getLimit()) + .setOrderBy(GrpcOrderBy.CREATED_AT_DESC) + .build(); } @Override @@ -98,11 +103,22 @@ public class GrpcOzgCloudVorgangService implements OzgCloudVorgangService { GrpcFindVorgangRequest buildFindRequest(OzgCloudVorgangQuery query, Page page) { return GrpcFindVorgangRequest.newBuilder() - .setLimit(page.getLimit()) - .setOffset(page.getOffset()) - .setQuery(queryMapper.toGrpc(query)) - .setOrderBy(GrpcOrderBy.CREATED_AT_DESC) - .build(); + .setLimit(page.getLimit()) + .setOffset(page.getOffset()) + .setQuery(queryMapper.toGrpc(query)) + .setOrderBy(GrpcOrderBy.CREATED_AT_DESC) + .build(); + } + + @Override + public Stream<OzgCloudVorgangStub> findDeleted() { + return getFindDeletedVorgangResponses() + .flatMap(response -> response.getVorgangList().stream()) + .map(stubMapper::fromGrpc); + } + + private Stream<GrpcFindDeletedVorgangResponse> getFindDeletedVorgangResponses() { + return asStream(getVorgangServiceStub().findDeletedVorgang(GrpcFindDeletedVorgangRequest.newBuilder().build())); } VorgangServiceBlockingStub getVorgangServiceStub() { diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangStubMapper.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangStubMapper.java index 505ed0096fbcc7cd347731824ec7b5a80a4f6c87..e7e046b6f233eca40d8db27f717e1f272635cfab 100644 --- a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangStubMapper.java +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangStubMapper.java @@ -34,8 +34,8 @@ import de.ozgcloud.vorgang.vorgang.GrpcVorgangHeader; public interface OzgCloudVorgangStubMapper { @Mapping(target = "header", ignore = true) - @Mapping(target = "vorgangName", ignore = true) @Mapping(target = "vorgangNummer", ignore = true) + @Mapping(target = "vorgangName", source = "name") OzgCloudVorgangStub fromGrpc(GrpcVorgangHeader vorgang); } diff --git a/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/StreamingUtils.java b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/StreamingUtils.java new file mode 100644 index 0000000000000000000000000000000000000000..b87fd479401ef7ed882e12b0f1f056c2467122ac --- /dev/null +++ b/api-lib-core/src/main/java/de/ozgcloud/apilib/vorgang/grpc/StreamingUtils.java @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.apilib.vorgang.grpc; + +import java.util.Iterator; +import java.util.Spliterators; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import lombok.AccessLevel; +import lombok.NoArgsConstructor; + +@NoArgsConstructor(access = AccessLevel.PRIVATE) +class StreamingUtils { + + static <T> Stream<T> asStream(Iterator<T> iterator) { + var spliterator = Spliterators.spliteratorUnknownSize(iterator, 0); + return StreamSupport.stream(spliterator, false); + } +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStubTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStubTestFactory.java index 36bc81efbfeb450c6f2b07aa4d08d559519f9adf..a7fa49c9f7f49c2a580288eab1fb94c1c789e376 100644 --- a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStubTestFactory.java +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/OzgCloudVorgangStubTestFactory.java @@ -30,6 +30,10 @@ public class OzgCloudVorgangStubTestFactory { } public static OzgCloudVorgangStub.OzgCloudVorgangStubBuilder createBuilder() { - return OzgCloudVorgangStub.builder(); + return OzgCloudVorgangStub.builder() + .id(OzgCloudVorgangTestFactory.ID) + .version(OzgCloudVorgangTestFactory.VERSION) + .vorgangName(OzgCloudVorgangTestFactory.VORGANG_NAME) + .header(OzgCloudVorgangHeaderTestFactory.create()); } } diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindDeletedVorgangRequestTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindDeletedVorgangRequestTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..a32ce76d6ed0070f6501dde5f520a41db094403a --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindDeletedVorgangRequestTestFactory.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.apilib.vorgang.grpc; + +import de.ozgcloud.vorgang.vorgang.GrpcFindDeletedVorgangRequest; + +class GrpcFindDeletedVorgangRequestTestFactory { + + public static GrpcFindDeletedVorgangRequest create() { + return createBuilder().build(); + } + + public static GrpcFindDeletedVorgangRequest.Builder createBuilder() { + return GrpcFindDeletedVorgangRequest.newBuilder(); + } +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindDeletedVorgangResponseTestFactory.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindDeletedVorgangResponseTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..ce958c289c3a8cbca483c864dcd071d1dccba482 --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcFindDeletedVorgangResponseTestFactory.java @@ -0,0 +1,37 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.apilib.vorgang.grpc; + +import de.ozgcloud.vorgang.vorgang.GrpcFindDeletedVorgangResponse; + +class GrpcFindDeletedVorgangResponseTestFactory { + + public static GrpcFindDeletedVorgangResponse create() { + return createBuilder().build(); + } + + public static GrpcFindDeletedVorgangResponse.Builder createBuilder() { + return GrpcFindDeletedVorgangResponse.newBuilder().addVorgang(GrpcVorgangHeaderTestFactory.create()); + } +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java index ce736cafcb7f29a200f5c9a72d85a35b2a89b21d..a6fdf181e37ea56142bde1e0a888227b7717556b 100644 --- a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/GrpcOzgCloudVorgangServiceTest.java @@ -44,6 +44,8 @@ import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStub; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStubTestFactory; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangTestFactory; import de.ozgcloud.apilib.vorgang.Page; +import de.ozgcloud.vorgang.vorgang.GrpcFindDeletedVorgangRequest; +import de.ozgcloud.vorgang.vorgang.GrpcFindDeletedVorgangResponse; import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangRequest; import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangResponse; import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangRequest; @@ -148,7 +150,7 @@ class GrpcOzgCloudVorgangServiceTest { private static final GrpcVorgangHeader VORGANG = GrpcVorgangHeaderTestFactory.create(); private static final GrpcFindVorgangResponse RESPONSE = GrpcFindVorgangResponse.newBuilder() - .addVorgang(VORGANG).build(); + .addVorgang(VORGANG).build(); @BeforeEach void init() { @@ -248,9 +250,9 @@ class GrpcOzgCloudVorgangServiceTest { class TestBuildFindRequest { private final Page page = Page.builder() - .limit(GrpcFindVorgangRequestTestFactory.LIMIT) - .offset(GrpcFindVorgangRequestTestFactory.OFFSET) - .build(); + .limit(GrpcFindVorgangRequestTestFactory.LIMIT) + .offset(GrpcFindVorgangRequestTestFactory.OFFSET) + .build(); private final OzgCloudVorgangQuery ozgCloudVorgangQuery = OzgCloudVorgangQueryTestFactory.create(); @@ -277,4 +279,40 @@ class GrpcOzgCloudVorgangServiceTest { return service.buildFindRequest(ozgCloudVorgangQuery, page); } } + + @Nested + class TestFindDeleted { + + private final GrpcFindDeletedVorgangRequest request = GrpcFindDeletedVorgangRequestTestFactory.create(); + private final GrpcFindDeletedVorgangResponse response = GrpcFindDeletedVorgangResponseTestFactory.create(); + private final OzgCloudVorgangStub vorgangStub = OzgCloudVorgangStubTestFactory.create(); + + @BeforeEach + void mock() { + doReturn(stub).when(service).getVorgangServiceStub(); + when(stub.findDeletedVorgang(request)).thenReturn(List.of(response).iterator()); + when(stubMapper.fromGrpc(response.getVorgangList().getFirst())).thenReturn(vorgangStub); + } + + @Test + void shouldCallGetVorgangServiceStub() { + service.findDeleted().toList(); + + verify(stub).findDeletedVorgang(request); + } + + @Test + void shouldMapResponse() { + service.findDeleted().toList(); + + verify(stubMapper).fromGrpc(response.getVorgangList().getFirst()); + } + + @Test + void shouldReturnVorgangStubs() { + var deleted = service.findDeleted().toList(); + + assertThat(deleted).containsExactly(vorgangStub); + } + } } diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangStubMapperTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangStubMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..699dac3370f1f2c72a27a422eee9609f8dca4f16 --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/OzgCloudVorgangStubMapperTest.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.apilib.vorgang.grpc; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; + +import de.ozgcloud.apilib.vorgang.OzgCloudVorgangStubTestFactory; + +class OzgCloudVorgangStubMapperTest { + + private OzgCloudVorgangStubMapper mapper = Mappers.getMapper(OzgCloudVorgangStubMapper.class); + + @Test + void shouldMapStubFields() { + var expected = OzgCloudVorgangStubTestFactory.createBuilder() + .header(null) + .vorgangNummer(null) + .build(); + + var mapped = mapper.fromGrpc(GrpcVorgangHeaderTestFactory.create()); + + assertThat(mapped).usingRecursiveComparison().isEqualTo(expected); + } +} diff --git a/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/StreamingUtilsTest.java b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/StreamingUtilsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..878b842148f5d1cf1861279cb1d80b227129b4d6 --- /dev/null +++ b/api-lib-core/src/test/java/de/ozgcloud/apilib/vorgang/grpc/StreamingUtilsTest.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2025 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.apilib.vorgang.grpc; + +import static org.assertj.core.api.Assertions.*; + +import java.util.List; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +class StreamingUtilsTest { + + @Nested + class TestAsStream { + + @Test + void shouldReturnStream() { + var elements = List.of("a", "b", "c"); + + var stream = StreamingUtils.asStream(elements.iterator()); + + assertThat(stream.toList()).containsExactlyElementsOf(elements); + } + } +} diff --git a/pom.xml b/pom.xml index 4b93c8fa61e8b2818adf20c5389001184caf502f..6c9a671b79b19cb0c88a901f401f62f8b0ac4f38 100644 --- a/pom.xml +++ b/pom.xml @@ -54,7 +54,7 @@ <failsafe-plugin.version>3.2.5</failsafe-plugin.version> <maven-jar-plugin.version>3.3.0</maven-jar-plugin.version> - <vorgang-manager.version>2.17.0</vorgang-manager.version> + <vorgang-manager.version>2.23.0-SNAPSHOT</vorgang-manager.version> <user-manager.version>2.1.0</user-manager.version> </properties>