From f96aa629b86189cdecb16294bca53daad5358e20 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Mon, 9 Oct 2023 10:46:01 +0200
Subject: [PATCH] OZG-4428 map to formdata

---
 .../enterprise/entry/EntryFormDataField.java  | 18 +++++++++++
 .../enterprise/entry/FormDataMapper.java      | 23 ++++++++++++++
 .../entry/EntryFormDataTestFactory.java       | 31 +++++++++++++------
 .../enterprise/entry/FormDataMapperTest.java  | 26 ++++++++++++++++
 .../src/test/resources/request/simple.json    | 14 +++------
 5 files changed, 94 insertions(+), 18 deletions(-)
 create mode 100644 enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapperTest.java

diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataField.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataField.java
index 0a748a409..7a7623d46 100644
--- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataField.java
+++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataField.java
@@ -1,6 +1,9 @@
 package de.ozgcloud.eingang.enterprise.entry;
 
 import java.time.LocalDate;
+import java.util.Objects;
+
+import org.apache.commons.lang3.StringUtils;
 
 import lombok.Builder;
 import lombok.Getter;
@@ -27,4 +30,19 @@ public class EntryFormDataField implements EntryFormDataItem {
 		return true;
 	}
 
+	public Object getValue() {
+		if (StringUtils.isNotBlank(stringValue)) {
+			return stringValue;
+		}
+		if (Objects.nonNull(booleanValue)) {
+			return booleanValue;
+		}
+		if (Objects.nonNull(numberValue)) {
+			return numberValue;
+		}
+		if (Objects.nonNull(dateValue)) {
+			return dateValue;
+		}
+		return null;
+	}
 }
diff --git a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java
index 6bf2030f3..816f12e08 100644
--- a/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java
+++ b/enterprise-adapter/src/main/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapper.java
@@ -1,5 +1,9 @@
 package de.ozgcloud.eingang.enterprise.entry;
 
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.commons.lang3.tuple.Pair;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 
@@ -10,6 +14,9 @@ import de.ozgcloud.eingang.common.formdata.ZustaendigeStelle;
 @Mapper
 public interface FormDataMapper {
 
+	public static final String VALUE_KEY = "value";
+	public static final String LABEL_KEY = "label";
+
 	@Mapping(target = "antragsteller", ignore = true)
 	@Mapping(target = "attachment", ignore = true)
 	@Mapping(target = "attachments", ignore = true)
@@ -35,4 +42,20 @@ public interface FormDataMapper {
 		return ZustaendigeStelle.builder().organisationseinheitenId(organisationsEinheitenId).build();
 	}
 
+	default Map<String, Object> mapFormItems(Map<String, EntryFormDataItem> map) {
+		return map.entrySet().stream()
+				.map(entry -> Pair.of(entry.getKey(),
+						entry.getValue().isFormField() ? mapFormField((EntryFormDataField) entry.getValue())
+								: mapSubForm((EntryFormDataSubForm) entry.getValue())))
+				.collect(Collectors.toMap(Pair::getKey, Pair::getValue));
+	}
+
+	default Map<String, Object> mapFormField(EntryFormDataField field) {
+		return Map.of(LABEL_KEY, field.getLabel(), VALUE_KEY, field.getValue());
+	}
+
+	default Map<String, Object> mapSubForm(EntryFormDataSubForm subForm) {
+		return Map.of(LABEL_KEY, subForm.getLabel(), VALUE_KEY, mapFormItems(subForm.getFormItems()));
+	}
+
 }
diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataTestFactory.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataTestFactory.java
index 8c0fe75eb..634171716 100644
--- a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataTestFactory.java
+++ b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/EntryFormDataTestFactory.java
@@ -1,22 +1,35 @@
 package de.ozgcloud.eingang.enterprise.entry;
 
+import static de.ozgcloud.eingang.enterprise.entry.FormDataMapper.*;
+
 import java.util.Map;
 
 public class EntryFormDataTestFactory {
 
+	public static final String FORM_FIELD_NAME = "field_name";
+	public static final String FORM_FIELD_VALUE = "field_string_value";
+	public static final String FORM_FIELD_LABEL = "field_label";
+
+	public static final String SUB_FORM_NAME = "antragsteller";
+	public static final String SUB_FORM_LABEL = "Antragstellende Person";
+
+	public static final String SUB_FORM_FIELD_NAME = "lastname";
+	public static final String SUB_FORM_FIELD_LABEL = "Nachname";
+	public static final String SUB_FORM_FIELD_VALUE = "Täst";
+
 	public static Map<String, EntryFormDataItem> create() {
 		return Map.of(
-				"antragsteller", EntryFormDataSubForm.builder().label("Antragstellende Person")
-						.formItem("person_oder_firma", EntryFormDataField.builder().label("Anrede").stringValue("Herr").build())
-						.formItem("vorname", EntryFormDataField.builder().label("Vorname").stringValue("Theo").build())
-						.formItem("nachname", EntryFormDataField.builder().label("Nachname").stringValue("Täst").build())
+				FORM_FIELD_NAME, EntryFormDataField.builder().label(FORM_FIELD_LABEL).stringValue(FORM_FIELD_VALUE).build(),
+				SUB_FORM_NAME, EntryFormDataSubForm.builder().label(SUB_FORM_LABEL)
+						.formItem(SUB_FORM_FIELD_NAME,
+								EntryFormDataField.builder().label(SUB_FORM_FIELD_LABEL).stringValue(SUB_FORM_FIELD_VALUE).build())
 						.build());
 	}
 
-	public static EntryFormDataSubForm.EntryFormDataSubFormBuilder createBuilder() {
-		return EntryFormDataSubForm.builder()
-				.name("antragsteller")
-				.formItem("person_oder_firma", EntryFormDataField.builder().label("Anrede").stringValue("Herr").build());
+	public static Map<String, Object> createAsFormDataMap() {
+		return Map.of(
+				FORM_FIELD_NAME, Map.of(LABEL_KEY, FORM_FIELD_LABEL, VALUE_KEY, FORM_FIELD_VALUE),
+				SUB_FORM_NAME, Map.of(LABEL_KEY, SUB_FORM_LABEL, VALUE_KEY, Map.of(
+						SUB_FORM_FIELD_NAME, Map.of(LABEL_KEY, SUB_FORM_FIELD_LABEL, VALUE_KEY, SUB_FORM_FIELD_VALUE))));
 	}
-
 }
diff --git a/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapperTest.java b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapperTest.java
new file mode 100644
index 000000000..f72588539
--- /dev/null
+++ b/enterprise-adapter/src/test/java/de/ozgcloud/eingang/enterprise/entry/FormDataMapperTest.java
@@ -0,0 +1,26 @@
+package de.ozgcloud.eingang.enterprise.entry;
+
+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.InjectMocks;
+
+class FormDataMapperTest {
+
+	@InjectMocks
+	private FormDataMapper mapper = Mappers.getMapper(FormDataMapper.class);
+
+	@Nested
+	class TestMapFormItems {
+
+		@Test
+		void shouldMapFormItems() {
+			var mapped = mapper.mapFormItems(EntryFormDataTestFactory.create());
+
+			assertThat(mapped).usingRecursiveComparison().isEqualTo(EntryFormDataTestFactory.createAsFormDataMap());
+		}
+	}
+
+}
diff --git a/enterprise-adapter/src/test/resources/request/simple.json b/enterprise-adapter/src/test/resources/request/simple.json
index f364c5827..391ec3420 100644
--- a/enterprise-adapter/src/test/resources/request/simple.json
+++ b/enterprise-adapter/src/test/resources/request/simple.json
@@ -13,18 +13,14 @@
 		"name": "Anmeldung zur Einrichtung einer zeitlich befristeten Haltverbotszone gem. § 45 Abs. 1 Straßenverkehrsordnung (StVO)"
 	},
 	"formData": {
+		"field_name": {
+			"label": "field_label",
+			"stringValue": "field_string_value"
+		},
 		"antragsteller": {
 			"label": "Antragstellende Person",
 			"formItems": {
-				"person_oder_firma": {
-					"label": "Anrede",
-					"stringValue": "Herr"
-				},
-				"vorname": {
-					"label": "Vorname",
-					"stringValue": "Theo"
-				},
-				"nachname": {
+				"lastname": {
 					"label": "Nachname",
 					"stringValue": "Täst"
 				}
-- 
GitLab