From cff7c9c77902f2e316b21d3c977729d8c9eca88b Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Wed, 20 Nov 2024 17:29:16 +0100
Subject: [PATCH] OZG-6477 OZG-6439 Find collaborations using remote service

---
 alfa-service/pom.xml                          |  7 +-
 .../collaboration/CollaborationMapper.java    | 13 +++
 .../CollaborationRemoteService.java           | 27 ++++++-
 .../CollaborationMapperTest.java              | 25 ++++++
 .../CollaborationRemoteServiceTest.java       | 80 +++++++++++++++++++
 .../GrpcCollaborationRequestTestFactory.java  | 28 +++++++
 .../GrpcFindRequestsRequestTestFactory.java   | 17 ++++
 .../GrpcFindRequestsResponseTestFactory.java  | 17 ++++
 pom.xml                                       |  6 ++
 9 files changed, 217 insertions(+), 3 deletions(-)
 create mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationMapper.java
 create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationMapperTest.java
 create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationRemoteServiceTest.java
 create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcCollaborationRequestTestFactory.java
 create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcFindRequestsRequestTestFactory.java
 create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcFindRequestsResponseTestFactory.java

diff --git a/alfa-service/pom.xml b/alfa-service/pom.xml
index 93c8b05cf4..d920278d4e 100644
--- a/alfa-service/pom.xml
+++ b/alfa-service/pom.xml
@@ -24,7 +24,8 @@
     unter der Lizenz sind dem Lizenztext zu entnehmen.
 
 -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
 	<modelVersion>4.0.0</modelVersion>
 
@@ -135,6 +136,10 @@
 			<groupId>de.ozgcloud.zufi</groupId>
 			<artifactId>zufi-manager-interface</artifactId>
 		</dependency>
+		<dependency>
+			<groupId>de.ozgcloud.collaboration</groupId>
+			<artifactId>collaboration-manager-interface</artifactId>
+		</dependency>
 
 		<!-- tools -->
 		<dependency>
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationMapper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationMapper.java
new file mode 100644
index 0000000000..f56d7f8552
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationMapper.java
@@ -0,0 +1,13 @@
+package de.ozgcloud.alfa.collaboration;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.ReportingPolicy;
+
+import de.ozgcloud.collaboration.request.GrpcCollaborationRequest;
+
+@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
+interface CollaborationMapper {
+
+	Collaboration fromGrpc(GrpcCollaborationRequest request, String vorgangId);
+}
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationRemoteService.java b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationRemoteService.java
index a81de9638e..1389d21221 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationRemoteService.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/collaboration/CollaborationRemoteService.java
@@ -1,14 +1,37 @@
 package de.ozgcloud.alfa.collaboration;
 
+import java.util.function.Function;
 import java.util.stream.Stream;
 
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import de.ozgcloud.alfa.common.GrpcUtil;
+import de.ozgcloud.collaboration.request.CollaborationRequestServiceGrpc.CollaborationRequestServiceBlockingStub;
+import de.ozgcloud.collaboration.request.GrpcCollaborationRequest;
+import de.ozgcloud.collaboration.request.GrpcFindRequestsRequest;
+import net.devh.boot.grpc.client.inject.GrpcClient;
+
 @Service
 public class CollaborationRemoteService {
 
+	@GrpcClient(GrpcUtil.VORGANG_MANAGER_GRPC_CLIENT) // TODO: eigener Client für collaboration manager?
+	private CollaborationRequestServiceBlockingStub serviceStub;
+
+	@Autowired
+	private CollaborationMapper collaborationMapper;
+
 	public Stream<Collaboration> getCollaborations(String vorgangId) {
-		// TODO: Replace Dummy Data with real grpc call
-		return Stream.empty();
+		var toCollaboration = getCollaborationMapperForVorgang(vorgangId);
+		return serviceStub.findRequests(buildSearchRequest(vorgangId))
+				.getRequestsList().stream().map(toCollaboration);
+	}
+
+	GrpcFindRequestsRequest buildSearchRequest(String vorgangId) {
+		return GrpcFindRequestsRequest.newBuilder().setVorgangId(vorgangId).build();
+	}
+
+	private Function<GrpcCollaborationRequest, Collaboration> getCollaborationMapperForVorgang(String vorgangId) {
+		return request -> collaborationMapper.fromGrpc(request, vorgangId);
 	}
 }
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationMapperTest.java
new file mode 100644
index 0000000000..fb895d9fa4
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationMapperTest.java
@@ -0,0 +1,25 @@
+package de.ozgcloud.alfa.collaboration;
+
+import static org.assertj.core.api.Assertions.*;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+import org.mockito.Spy;
+
+class CollaborationMapperTest {
+
+	@Spy
+	private CollaborationMapper mapper = Mappers.getMapper(CollaborationMapper.class);
+
+	@Nested
+	class TestFromRequest {
+
+		@Test
+		void shouldMap() {
+			var collaboration = mapper.fromGrpc(GrpcCollaborationRequestTestFactory.create(), CollaborationTestFactory.VORGANG_ID);
+
+			assertThat(collaboration).usingRecursiveComparison().isEqualTo(CollaborationTestFactory.create());
+		}
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationRemoteServiceTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationRemoteServiceTest.java
new file mode 100644
index 0000000000..8d1203d6a6
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/CollaborationRemoteServiceTest.java
@@ -0,0 +1,80 @@
+package de.ozgcloud.alfa.collaboration;
+
+import static org.assertj.core.api.Assertions.*;
+import static org.mockito.Mockito.*;
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Spy;
+
+import de.ozgcloud.collaboration.request.CollaborationRequestServiceGrpc.CollaborationRequestServiceBlockingStub;
+import de.ozgcloud.collaboration.request.GrpcFindRequestsRequest;
+
+class CollaborationRemoteServiceTest {
+
+	@Spy
+	@InjectMocks
+	private CollaborationRemoteService service;
+	@Mock
+	private CollaborationRequestServiceBlockingStub stub;
+	@Mock
+	private CollaborationMapper mapper;
+
+	@Nested
+	class TestGetCollaborations {
+
+		public static final String VORGANG_ID = CollaborationTestFactory.VORGANG_ID;
+
+		private final GrpcFindRequestsRequest searchRequest = GrpcFindRequestsRequestTestFactory.create();
+		private final Collaboration collaboration = CollaborationTestFactory.create();
+
+		@BeforeEach
+		void init() {
+			doReturn(searchRequest).when(service).buildSearchRequest(VORGANG_ID);
+			when(stub.findRequests(searchRequest)).thenReturn(GrpcFindRequestsResponseTestFactory.create());
+			when(mapper.fromGrpc(GrpcFindRequestsResponseTestFactory.REQUEST, VORGANG_ID)).thenReturn(collaboration);
+		}
+
+		@Test
+		void shouldBuildSearchRequest() {
+			service.getCollaborations(VORGANG_ID).toList();
+
+			verify(service).buildSearchRequest(VORGANG_ID);
+		}
+
+		@Test
+		void shouldFindRequests() {
+			service.getCollaborations(VORGANG_ID).toList();
+
+			verify(stub).findRequests(searchRequest);
+		}
+
+		@Test
+		void shouldMapToCollaboration() {
+			service.getCollaborations(VORGANG_ID).toList();
+
+			verify(mapper).fromGrpc(GrpcFindRequestsResponseTestFactory.REQUEST, VORGANG_ID);
+		}
+
+		@Test
+		void shouldReturnCollaborations() {
+			var collaborations = service.getCollaborations(VORGANG_ID).toList();
+
+			assertThat(collaborations).containsExactly(collaboration);
+		}
+	}
+
+	@Nested
+	class TestBuildSearchRequest {
+
+		@Test
+		void shouldSetVorgangId() {
+			var request = service.buildSearchRequest(GrpcFindRequestsRequestTestFactory.VORGANG_ID);
+
+			assertThat(request).usingRecursiveComparison().isEqualTo(GrpcFindRequestsRequestTestFactory.create());
+		}
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcCollaborationRequestTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcCollaborationRequestTestFactory.java
new file mode 100644
index 0000000000..06a2cc47ac
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcCollaborationRequestTestFactory.java
@@ -0,0 +1,28 @@
+package de.ozgcloud.alfa.collaboration;
+
+import java.util.UUID;
+
+import de.ozgcloud.collaboration.request.GrpcCollaborationRequest;
+
+class GrpcCollaborationRequestTestFactory {
+
+	public static final String ID = UUID.randomUUID().toString();
+	public static final String COLLABORATION_VORGANG_ID = CollaborationTestFactory.COLLABORATION_VORGANG_ID;
+	public static final String TITEL = CollaborationTestFactory.TITEL;
+	public static final String BESCHREIBUNG = CollaborationTestFactory.BESCHREIBUNG;
+	public static final String ZUSTAENDIGE_STELLE = CollaborationTestFactory.ZUSTAENDIGE_STELLE;
+
+	public static GrpcCollaborationRequest create() {
+		return createBuilder()
+				.build();
+	}
+
+	private static GrpcCollaborationRequest.Builder createBuilder() {
+		return GrpcCollaborationRequest.newBuilder()
+				.setId(ID)
+				.setCollaborationVorgangId(COLLABORATION_VORGANG_ID)
+				.setTitel(TITEL)
+				.setBeschreibung(BESCHREIBUNG)
+				.setZustaendigeStelle(ZUSTAENDIGE_STELLE);
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcFindRequestsRequestTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcFindRequestsRequestTestFactory.java
new file mode 100644
index 0000000000..5a8eeeb6f9
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcFindRequestsRequestTestFactory.java
@@ -0,0 +1,17 @@
+package de.ozgcloud.alfa.collaboration;
+
+import de.ozgcloud.alfa.vorgang.VorgangHeaderTestFactory;
+import de.ozgcloud.collaboration.request.GrpcFindRequestsRequest;
+
+class GrpcFindRequestsRequestTestFactory {
+
+	public static final String VORGANG_ID = VorgangHeaderTestFactory.ID;
+
+	public static GrpcFindRequestsRequest create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcFindRequestsRequest.Builder createBuilder() {
+		return GrpcFindRequestsRequest.newBuilder().setVorgangId(VORGANG_ID);
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcFindRequestsResponseTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcFindRequestsResponseTestFactory.java
new file mode 100644
index 0000000000..981baf5e98
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/collaboration/GrpcFindRequestsResponseTestFactory.java
@@ -0,0 +1,17 @@
+package de.ozgcloud.alfa.collaboration;
+
+import de.ozgcloud.collaboration.request.GrpcCollaborationRequest;
+import de.ozgcloud.collaboration.request.GrpcFindRequestsResponse;
+
+class GrpcFindRequestsResponseTestFactory {
+
+	public static final GrpcCollaborationRequest REQUEST = GrpcCollaborationRequestTestFactory.create();
+
+	public static GrpcFindRequestsResponse create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcFindRequestsResponse.Builder createBuilder() {
+		return GrpcFindRequestsResponse.newBuilder().addRequests(REQUEST);
+	}
+}
diff --git a/pom.xml b/pom.xml
index 5067c9c779..380c7f1f7a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,7 @@
 		<ozgcloud-common-pdf.version>3.0.1</ozgcloud-common-pdf.version>
 		<user-manager.version>2.8.0</user-manager.version>
 		<zufi-manager.version>1.5.0</zufi-manager.version>
+		<collaboration-manager.version>0.5.0</collaboration-manager.version>
 		<spring-cloud-config-client.version>4.1.3</spring-cloud-config-client.version>
 
 		<!-- TODO: die Version über ozgcloud-common ziehen -->
@@ -140,6 +141,11 @@
 					</exclusion>
 				</exclusions>
 			</dependency>
+			<dependency>
+				<groupId>de.ozgcloud.collaboration</groupId>
+				<artifactId>collaboration-manager-interface</artifactId>
+				<version>${collaboration-manager.version}</version>
+			</dependency>
 
 			<dependency>
 				<groupId>io.jsonwebtoken</groupId>
-- 
GitLab