From 5668c35bb602d47351a78f802d691e47c5063262 Mon Sep 17 00:00:00 2001
From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com>
Date: Tue, 18 Mar 2025 11:46:33 +0100
Subject: [PATCH] OZG-7573 OZG-7923 Mapping for GrpcRouteForwarding

---
 .../vorgang/vorgang/EingangMapper.java        |  2 +-
 .../redirect/ForwardingRequestMapper.java     | 29 +++++++-
 .../vorgang/GrpcEingangTestFactory.java       |  5 +-
 .../redirect/ForwardingRequestMapperTest.java | 73 +++++++++++++++++++
 .../redirect/GrpcEingangStubTestFactory.java  | 43 +++++++++++
 .../GrpcRouteCriteriaTestFactory.java         | 38 ++++++++++
 .../GrpcRouteForwardingTestFactory.java       | 39 ++++++++++
 .../common/grpc/GrpcFormDataTestFactory.java  |  2 +-
 8 files changed, 224 insertions(+), 7 deletions(-)
 create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcEingangStubTestFactory.java
 create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteCriteriaTestFactory.java
 create mode 100644 vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingTestFactory.java

diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangMapper.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangMapper.java
index f072e0ec6..0c5dcaafc 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangMapper.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/EingangMapper.java
@@ -36,7 +36,7 @@ import de.ozgcloud.vorgang.common.grpc.GrpcFormDataMapper;
 		nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, //
 		nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, //
 		collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
-interface EingangMapper {
+public interface EingangMapper {
 
 	@Mapping(source = "attachmentsList", target = "attachments")
 	@Mapping(source = "representationsList", target = "representations")
diff --git a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapper.java b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapper.java
index e47ae180e..2e3211010 100644
--- a/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapper.java
+++ b/vorgang-manager-server/src/main/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapper.java
@@ -26,12 +26,24 @@ package de.ozgcloud.vorgang.vorgang.redirect;
 import java.util.Map;
 
 import org.apache.commons.collections4.MapUtils;
+import org.mapstruct.CollectionMappingStrategy;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
+import org.mapstruct.NullValueCheckStrategy;
+import org.mapstruct.NullValuePropertyMappingStrategy;
 
 import de.ozgcloud.command.Command;
+import de.ozgcloud.eingang.forwarding.GrpcEingangStub;
+import de.ozgcloud.eingang.forwarding.GrpcRouteCriteria;
+import de.ozgcloud.eingang.forwarding.GrpcRouteForwarding;
+import de.ozgcloud.vorgang.vorgang.Eingang;
+import de.ozgcloud.vorgang.vorgang.EingangMapper;
+import de.ozgcloud.vorgang.vorgang.GrpcEingang;
 
-@Mapper(imports = MapUtils.class)
+@Mapper(imports = MapUtils.class, uses = EingangMapper.class, //
+		nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, //
+		nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, //
+		collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED)
 interface ForwardingRequestMapper {
 
 	interface CommandBodyFields {
@@ -42,7 +54,7 @@ interface ForwardingRequestMapper {
 		String PLZ = "plz";
 		String ORT = "ort";
 	}
-	
+
 	@Mapping(target = "version", source = "relationVersion")
 	@Mapping(target = "organisationEinheit", source = "bodyObject")
 	ForwardingRequest fromCommand(Command command);
@@ -57,4 +69,17 @@ interface ForwardingRequestMapper {
 	@Mapping(target = "zipCode", expression = "java(MapUtils.getString(body, CommandBodyFields.PLZ))")
 	@Mapping(target = "city", expression = "java(MapUtils.getString(body, CommandBodyFields.ORT))")
 	Address toAddress(Map<String, Object> body);
+
+	@Mapping(target = "routeCriteria", source = "request")
+	@Mapping(target = "eingangStub", source = "eingang")
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	GrpcRouteForwarding toGrpcRouteForwarding(ForwardingRequest request, Eingang eingang);
+
+	@Mapping(target = "organisationEinheitId", source = "organisationEinheit.id")
+	GrpcRouteCriteria toGrpcRouteCriteria(ForwardingRequest request);
+
+	@Mapping(target = "unknownFields", ignore = true)
+	@Mapping(target = "allFields", ignore = true)
+	GrpcEingangStub toGrpcEingangStub(GrpcEingang eingang);
 }
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcEingangTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcEingangTestFactory.java
index 79acc665d..e149cbf5b 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcEingangTestFactory.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/GrpcEingangTestFactory.java
@@ -25,12 +25,11 @@ package de.ozgcloud.vorgang.vorgang;
 
 import java.util.UUID;
 
-import de.ozgcloud.vorgang.common.grpc.GrpcSubFormTestFactory;
+import de.ozgcloud.vorgang.common.grpc.GrpcFormDataTestFactory;
 
 public class GrpcEingangTestFactory {
 
 	public static final String ID = UUID.randomUUID().toString();
-	public static final GrpcSubForm SUB_FORM = GrpcSubFormTestFactory.create();
 
 	public static GrpcEingang create() {
 		return createBuilder().build();
@@ -42,7 +41,7 @@ public class GrpcEingangTestFactory {
 				.setHeader(GrpcEingangHeaderTestFactory.create())
 				.setAntragsteller(GrpcAntragstellerTestFactory.create())
 				.setZustaendigeStelle(GrpcZustaendigeStelleTestFactory.create())
-				.setFormData(GrpcFormData.newBuilder().addForm(GrpcSubFormTestFactory.create()).build())
+				.setFormData(GrpcFormDataTestFactory.create())
 				.addAttachments(GrpcIncomingFileGroupTestFactory.create())
 				.setNumberOfAttachments(4)
 				.addRepresentations(GrpcIncomingFileTestFactory.create())
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapperTest.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapperTest.java
index 715529e26..ffa519710 100644
--- a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapperTest.java
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/ForwardingRequestMapperTest.java
@@ -32,14 +32,26 @@ import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mapstruct.factory.Mappers;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
 import org.mockito.Spy;
 
+import de.ozgcloud.eingang.forwarding.GrpcRouteCriteria;
+import de.ozgcloud.eingang.forwarding.GrpcRouteForwarding;
 import de.ozgcloud.vorgang.command.CommandTestFactory;
+import de.ozgcloud.vorgang.vorgang.Eingang;
+import de.ozgcloud.vorgang.vorgang.EingangMapper;
+import de.ozgcloud.vorgang.vorgang.EingangTestFactory;
+import de.ozgcloud.vorgang.vorgang.GrpcEingang;
+import de.ozgcloud.vorgang.vorgang.GrpcEingangTestFactory;
 import de.ozgcloud.vorgang.vorgang.redirect.ForwardingRequestMapper.CommandBodyFields;
 
 class ForwardingRequestMapperTest {
 
+	@Mock
+	private EingangMapper eingangMapper;
 	@Spy
+	@InjectMocks
 	private ForwardingRequestMapper mapper = Mappers.getMapper(ForwardingRequestMapper.class);
 	private final Map<String, Object> bodyObject = Map.of(
 			CommandBodyFields.ORGANISATION_EINHEIT_ID, OrganisationEinheitTestFactory.ID,
@@ -118,4 +130,65 @@ class ForwardingRequestMapperTest {
 			return mapper.toAddress(bodyObject);
 		}
 	}
+
+	@Nested
+	class TestToGrpcRouteForwarding {
+
+		private final ForwardingRequest request = ForwardingRequestTestFactory.create();
+		private final Eingang eingang = EingangTestFactory.create();
+		private final GrpcEingang grpcEingang = GrpcEingangTestFactory.create();
+
+		@BeforeEach
+		void init() {
+			doReturn(GrpcRouteCriteriaTestFactory.create()).when(mapper).toGrpcRouteCriteria(any());
+			when(eingangMapper.toGrpc(any())).thenReturn(grpcEingang);
+		}
+
+		@Test
+		void shouldCallEingangMapper() {
+			map();
+
+			verify(eingangMapper).toGrpc(eingang);
+		}
+
+		@Test
+		void shouldMapToGrpcRouteCriteria() {
+			map();
+
+			verify(mapper).toGrpcRouteCriteria(request);
+		}
+
+		@Test
+		void shouldMapToGrpcEingangStub() {
+			map();
+
+			verify(mapper).toGrpcEingangStub(grpcEingang);
+		}
+
+		@Test
+		void shouldMapToGrpcRouteForwarding() {
+			var mapped = map();
+
+			assertThat(mapped).isEqualTo(GrpcRouteForwardingTestFactory.create());
+		}
+
+		private GrpcRouteForwarding map() {
+			return mapper.toGrpcRouteForwarding(request, eingang);
+		}
+	}
+
+	@Nested
+	class TestToGrpcRouteCriteria {
+
+		@Test
+		void shouldMap() {
+			var mapped = map();
+
+			assertThat(mapped).isEqualTo(GrpcRouteCriteriaTestFactory.create());
+		}
+
+		private GrpcRouteCriteria map() {
+			return mapper.toGrpcRouteCriteria(ForwardingRequestTestFactory.create());
+		}
+	}
 }
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcEingangStubTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcEingangStubTestFactory.java
new file mode 100644
index 000000000..6cdd06a4a
--- /dev/null
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcEingangStubTestFactory.java
@@ -0,0 +1,43 @@
+/*
+ * 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.vorgang.vorgang.redirect;
+
+import de.ozgcloud.eingang.forwarding.GrpcEingangStub;
+import de.ozgcloud.vorgang.common.grpc.GrpcFormDataTestFactory;
+import de.ozgcloud.vorgang.vorgang.GrpcAntragstellerTestFactory;
+import de.ozgcloud.vorgang.vorgang.GrpcEingangHeaderTestFactory;
+
+class GrpcEingangStubTestFactory {
+
+	public static GrpcEingangStub create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcEingangStub.Builder createBuilder() {
+		return GrpcEingangStub.newBuilder()
+				.setHeader(GrpcEingangHeaderTestFactory.create())
+				.setAntragsteller(GrpcAntragstellerTestFactory.create())
+				.setFormData(GrpcFormDataTestFactory.create());
+	}
+}
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteCriteriaTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteCriteriaTestFactory.java
new file mode 100644
index 000000000..e28c74034
--- /dev/null
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteCriteriaTestFactory.java
@@ -0,0 +1,38 @@
+/*
+ * 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.vorgang.vorgang.redirect;
+
+import de.ozgcloud.eingang.forwarding.GrpcRouteCriteria;
+
+class GrpcRouteCriteriaTestFactory {
+
+	public static GrpcRouteCriteria create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcRouteCriteria.Builder createBuilder() {
+		return GrpcRouteCriteria.newBuilder()
+				.setOrganisationEinheitId(OrganisationEinheitTestFactory.ID);
+	}
+}
diff --git a/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingTestFactory.java b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingTestFactory.java
new file mode 100644
index 000000000..badf9c7b5
--- /dev/null
+++ b/vorgang-manager-server/src/test/java/de/ozgcloud/vorgang/vorgang/redirect/GrpcRouteForwardingTestFactory.java
@@ -0,0 +1,39 @@
+/*
+ * 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.vorgang.vorgang.redirect;
+
+import de.ozgcloud.eingang.forwarding.GrpcRouteForwarding;
+
+class GrpcRouteForwardingTestFactory {
+
+	public static GrpcRouteForwarding create() {
+		return createBuilder().build();
+	}
+
+	public static GrpcRouteForwarding.Builder createBuilder() {
+		return GrpcRouteForwarding.newBuilder()
+				.setRouteCriteria(GrpcRouteCriteriaTestFactory.create())
+				.setEingangStub(GrpcEingangStubTestFactory.create());
+	}
+}
diff --git a/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java b/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java
index b715c9098..b2ece13fb 100644
--- a/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java
+++ b/vorgang-manager-utils/src/test/java/de/ozgcloud/vorgang/common/grpc/GrpcFormDataTestFactory.java
@@ -34,6 +34,6 @@ public class GrpcFormDataTestFactory {
 
 	public static Builder createBuilder() {
 		return GrpcFormData.newBuilder()
-				.addField(GrpcFormFieldTestFactory.create());
+				.addForm(GrpcSubFormTestFactory.create());
 	}
 }
-- 
GitLab