From 0dd2701cdc51dda01e679e1651e0daaf0d10ba82 Mon Sep 17 00:00:00 2001
From: Krzysztof <krzysztof.witukiewicz@mgm-tp.com>
Date: Mon, 10 Mar 2025 13:31:54 +0100
Subject: [PATCH] OZG-7501 OZG-7874 Fix serialization issue

---
 .../ForwardByVorgangCommandController.java    |  6 +-
 .../forwarding/ForwardVorgangCommandBody.java |  8 ++-
 .../ForwardVorgangCommandBodyMapper.java      | 41 ++++++++++++
 ...ForwardByVorgangCommandControllerTest.java | 18 +++++-
 .../ForwardVorgangCommandBodyMapperTest.java  | 63 +++++++++++++++++++
 .../ForwardVorgangCommandBodyTestFactory.java |  6 +-
 6 files changed, 134 insertions(+), 8 deletions(-)
 create mode 100644 alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java
 create mode 100644 alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java

diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java
index c9928a5d9a..fb5224959e 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandController.java
@@ -48,6 +48,7 @@ class ForwardByVorgangCommandController {
 
 	private final CommandService commandService;
 	private final OrganisationsEinheitController organisationsEinheitController;
+	private final ForwardVorgangCommandBodyMapper bodyMapper;
 
 	@PostMapping
 	public ResponseEntity<Void> createCommand(@PathVariable String vorgangId, @PathVariable long vorgangVersion, @RequestBody CreateCommand command) {
@@ -70,9 +71,6 @@ class ForwardByVorgangCommandController {
 	}
 
 	private ForwardVorgangCommandBody addOrganisationsEinheitData(OrganisationsEinheit organisationsEinheit, ForwardVorgangCommandBody body) {
-		return body.toBuilder()
-				.name(organisationsEinheit.getName())
-				.anschrift(organisationsEinheit.getAnschrift())
-				.build();
+		return bodyMapper.updateFromOrganisationsEinheit(organisationsEinheit, body);
 	}
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java
index 14c6d31e0e..db96ddecb3 100644
--- a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBody.java
@@ -25,15 +25,16 @@ package de.ozgcloud.alfa.forwarding;
 
 import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
 
-import de.ozgcloud.alfa.collaboration.Anschrift;
 import de.ozgcloud.alfa.common.LinkedResourceDeserializer;
 import de.ozgcloud.alfa.common.command.CommandBody;
 import lombok.AllArgsConstructor;
 import lombok.Builder;
 import lombok.Getter;
 import lombok.NoArgsConstructor;
+import lombok.Setter;
 
 @Getter
+@Setter
 @Builder(toBuilder = true)
 @AllArgsConstructor
 @NoArgsConstructor
@@ -43,5 +44,8 @@ public class ForwardVorgangCommandBody implements CommandBody {
 	private String organisationsEinheitId;
 
 	private String name;
-	private Anschrift anschrift;
+	private String strasse;
+	private String hausnummer;
+	private String plz;
+	private String ort;
 }
diff --git a/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.java
new file mode 100644
index 0000000000..f766f9e94b
--- /dev/null
+++ b/alfa-service/src/main/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapper.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.alfa.forwarding;
+
+import org.mapstruct.Mapper;
+import org.mapstruct.Mapping;
+import org.mapstruct.MappingTarget;
+
+import de.ozgcloud.alfa.collaboration.OrganisationsEinheit;
+
+@Mapper
+interface ForwardVorgangCommandBodyMapper {
+
+	@Mapping(target = "organisationsEinheitId", ignore = true)
+	@Mapping(target = "strasse", source = "anschrift.strasse")
+	@Mapping(target = "hausnummer", source = "anschrift.hausnummer")
+	@Mapping(target = "plz", source = "anschrift.plz")
+	@Mapping(target = "ort", source = "anschrift.ort")
+	ForwardVorgangCommandBody updateFromOrganisationsEinheit(OrganisationsEinheit organisationsEinheit, @MappingTarget ForwardVorgangCommandBody commandBody);
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java
index d048bea2da..908bf70e6b 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardByVorgangCommandControllerTest.java
@@ -45,6 +45,7 @@ import org.springframework.test.web.servlet.MockMvc;
 import org.springframework.test.web.servlet.ResultActions;
 import org.springframework.test.web.servlet.setup.MockMvcBuilders;
 
+import de.ozgcloud.alfa.collaboration.OrganisationsEinheit;
 import de.ozgcloud.alfa.collaboration.OrganisationsEinheitController;
 import de.ozgcloud.alfa.collaboration.OrganisationsEinheitTestFactory;
 import de.ozgcloud.alfa.common.command.CommandOrder;
@@ -63,6 +64,8 @@ class ForwardByVorgangCommandControllerTest {
 	@Mock
 	private OrganisationsEinheitController organisationsEinheitController;
 	@Mock
+	private ForwardVorgangCommandBodyMapper bodyMapper;
+	@Mock
 	private ProblemDetailMapper problemDetailMapper;
 	@Spy
 	@InjectMocks
@@ -78,17 +81,22 @@ class ForwardByVorgangCommandControllerTest {
 	@Nested
 	class TestCreateCommand {
 
+		@Captor
+		private ArgumentCaptor<ForwardVorgangCommandBody> bodyCaptor;
+
 		@Nested
 		class OnOrganisationsEinheitAvailable {
 
+			private final OrganisationsEinheit organisationsEinheit = OrganisationsEinheitTestFactory.create();
 			@Captor
 			private ArgumentCaptor<CreateCommand> commandCaptor;
 
 			@BeforeEach
 			void init() {
 				when(organisationsEinheitController.getById(any())).thenReturn(
-						new ResponseEntity<>(EntityModel.of(OrganisationsEinheitTestFactory.create()), HttpStatus.OK));
+						new ResponseEntity<>(EntityModel.of(organisationsEinheit), HttpStatus.OK));
 				when(commandService.createCommand(any(), anyLong())).thenReturn(CommandTestFactory.create());
+				when(bodyMapper.updateFromOrganisationsEinheit(any(), any())).thenReturn(ForwardVorgangCommandBodyTestFactory.create());
 			}
 
 			@Test
@@ -98,6 +106,14 @@ class ForwardByVorgangCommandControllerTest {
 				verify(organisationsEinheitController).getById(OrganisationsEinheitTestFactory.ID);
 			}
 
+			@Test
+			void shouldAddOrganisationsEinheitData() {
+				doRequest();
+
+				verify(controller).createCommand(any(), anyLong(), commandCaptor.capture());
+				verify(bodyMapper).updateFromOrganisationsEinheit(organisationsEinheit, (ForwardVorgangCommandBody) commandCaptor.getValue().getBody());
+			}
+
 			@Test
 			void shouldCallCommandService() {
 				doRequest();
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java
new file mode 100644
index 0000000000..a0359b4484
--- /dev/null
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyMapperTest.java
@@ -0,0 +1,63 @@
+/*
+ * 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.alfa.forwarding;
+
+import static org.assertj.core.api.Assertions.*;
+
+import java.util.UUID;
+
+import org.junit.jupiter.api.Nested;
+import org.junit.jupiter.api.Test;
+import org.mapstruct.factory.Mappers;
+
+import de.ozgcloud.alfa.collaboration.OrganisationsEinheitTestFactory;
+
+class ForwardVorgangCommandBodyMapperTest {
+
+	private final ForwardVorgangCommandBodyMapper mapper = Mappers.getMapper(ForwardVorgangCommandBodyMapper.class);
+
+	@Nested
+	class TestUpdateFromOrganisationsEinheit {
+
+		private static final String ORGANISATIONS_EINHEIT_ID = UUID.randomUUID().toString();
+
+		private final ForwardVorgangCommandBody body = ForwardVorgangCommandBody.builder()
+				.organisationsEinheitId(ORGANISATIONS_EINHEIT_ID).build();
+
+		@Test
+		void shouldUpdateFromOrganisationsEinheit() {
+			mapper.updateFromOrganisationsEinheit(OrganisationsEinheitTestFactory.create(), body);
+
+			assertThat(body).usingRecursiveComparison().ignoringFields("organisationsEinheitId")
+					.isEqualTo(ForwardVorgangCommandBodyTestFactory.create());
+		}
+
+		@Test
+		void shouldPreserveId() {
+			mapper.updateFromOrganisationsEinheit(OrganisationsEinheitTestFactory.create(), body);
+
+			assertThat(body.getOrganisationsEinheitId()).isEqualTo(ORGANISATIONS_EINHEIT_ID);
+		}
+	}
+}
diff --git a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java
index ac8f4a4d34..3f36de6314 100644
--- a/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java
+++ b/alfa-service/src/test/java/de/ozgcloud/alfa/forwarding/ForwardVorgangCommandBodyTestFactory.java
@@ -23,6 +23,7 @@
  */
 package de.ozgcloud.alfa.forwarding;
 
+import de.ozgcloud.alfa.collaboration.AnschriftTestFactory;
 import de.ozgcloud.alfa.collaboration.OrganisationsEinheitTestFactory;
 import de.ozgcloud.alfa.forwarding.ForwardVorgangCommandBody.ForwardVorgangCommandBodyBuilder;
 
@@ -36,6 +37,9 @@ class ForwardVorgangCommandBodyTestFactory {
 		return ForwardVorgangCommandBody.builder()
 				.organisationsEinheitId(OrganisationsEinheitTestFactory.ID)
 				.name(OrganisationsEinheitTestFactory.NAME)
-				.anschrift(OrganisationsEinheitTestFactory.ANSCHRIFT);
+				.strasse(AnschriftTestFactory.STRASSE)
+				.ort(AnschriftTestFactory.ORT)
+				.hausnummer(AnschriftTestFactory.HAUSNUMMER)
+				.plz(AnschriftTestFactory.PLZ);
 	}
 }
-- 
GitLab