From a349d8a6f43545ec5d2dc6bdf0e337a48e90e496 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Wed, 1 Jun 2022 10:26:28 +0200
Subject: [PATCH] OZG-1274 map client attribute 'hasPostfachNachricht'

---
 .../BinaryFileMaxSizeConstraint.java          |  2 +-
 .../common/binaryfile/BinaryFileUnit.java     |  6 ----
 .../UploadBinaryFileSizeValidator.java        |  6 ++--
 .../java/de/itvsh/goofy/vorgang/Eingang.java  |  4 ++-
 .../de/itvsh/goofy/vorgang/VorgangHeader.java |  3 +-
 .../goofy/vorgang/VorgangHeaderMapper.java    | 25 ++++++++++-----
 .../WiedervorlageRemoteService.java           |  6 ++--
 .../wiedervorlage/WiedervorlageService.java   | 10 ++----
 .../src/main/resources/application.yml        |  2 +-
 .../common/binaryfile/BinaryFileITCase.java   |  2 +-
 .../callcontext/CallContextTestFactory.java   |  5 +--
 .../GrpcClientAttributeTestFactory.java       | 31 +++++++++++++++++++
 .../vorgang/VorgangHeaderMapperTest.java      | 23 +++++++++++++-
 .../WiedervorlageServiceTest.java             |  4 +--
 14 files changed, 93 insertions(+), 36 deletions(-)
 delete mode 100644 goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/BinaryFileUnit.java
 create mode 100644 goofy-server/src/test/java/de/itvsh/goofy/vorgang/GrpcClientAttributeTestFactory.java

diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/BinaryFileMaxSizeConstraint.java b/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/BinaryFileMaxSizeConstraint.java
index 422f1d3598..58995022a3 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/BinaryFileMaxSizeConstraint.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/BinaryFileMaxSizeConstraint.java
@@ -25,5 +25,5 @@ public @interface BinaryFileMaxSizeConstraint {
 
 	int max() default UploadBinaryFileSizeValidator.DEFAULT_MAX_SIZE;
 
-	String unit() default UploadBinaryFileSizeValidator.DEFAULT_UNIT;
+	String unit() default UploadBinaryFileSizeValidator.DEFAULT_UNIT_STRING;
 }
\ No newline at end of file
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/BinaryFileUnit.java b/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/BinaryFileUnit.java
deleted file mode 100644
index f485e7eec2..0000000000
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/BinaryFileUnit.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package de.itvsh.goofy.common.binaryfile;
-
-class BinaryFileUnit {// NOSONAR
-
-	static final String MB = "MB";
-}
\ No newline at end of file
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/UploadBinaryFileSizeValidator.java b/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/UploadBinaryFileSizeValidator.java
index 017fedfbfd..71bbb5d8ec 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/UploadBinaryFileSizeValidator.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/common/binaryfile/UploadBinaryFileSizeValidator.java
@@ -13,10 +13,12 @@ import org.springframework.util.unit.DataUnit;
 
 class UploadBinaryFileSizeValidator implements ConstraintValidator<BinaryFileMaxSizeConstraint, UploadBinaryFileRequest> {
 
-	static final String DEFAULT_UNIT = BinaryFileUnit.MB;
+	static final String DEFAULT_UNIT_STRING = "MB";
+	static final DataUnit DEFAULT_UNIT = DataUnit.fromSuffix(DEFAULT_UNIT_STRING);
+
 	static final int DEFAULT_MAX_SIZE = 40;
 
-	private final DataSize defaultDataSize = DataSize.of(DEFAULT_MAX_SIZE, DataUnit.fromSuffix(DEFAULT_UNIT));
+	private final DataSize defaultDataSize = DataSize.of(DEFAULT_MAX_SIZE, DEFAULT_UNIT);
 
 	@Autowired
 	private BinaryFileProperties binaryFileProperties;
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/Eingang.java b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/Eingang.java
index 69fd514e91..480a0fb12c 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/Eingang.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/Eingang.java
@@ -4,9 +4,11 @@ import java.util.Map;
 
 import lombok.Builder;
 import lombok.Getter;
+import lombok.ToString;
 
 @Getter
 @Builder
+@ToString
 public class Eingang {
 
 	private String id;
@@ -18,6 +20,6 @@ public class Eingang {
 	private Antragsteller antragsteller;
 	private EingangHeader header;
 
-
+	@ToString.Exclude
 	private Map<String, Object> formData;
 }
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangHeader.java b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangHeader.java
index 3d7bb25ced..da48d2c4e9 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangHeader.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangHeader.java
@@ -42,6 +42,5 @@ class VorgangHeader implements Vorgang {
 	@JsonProperty(access = Access.READ_ONLY)
 	private LocalDate nextFrist;
 
-	@Builder.Default
-	private boolean hasPostfachNachricht = true;
+	private boolean hasPostfachNachricht;
 }
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangHeaderMapper.java b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangHeaderMapper.java
index 65c2d8620e..3b2e7405e2 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangHeaderMapper.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/vorgang/VorgangHeaderMapper.java
@@ -2,6 +2,7 @@ package de.itvsh.goofy.vorgang;
 
 import java.time.LocalDate;
 import java.util.List;
+import java.util.stream.Stream;
 
 import org.apache.commons.lang3.StringUtils;
 import org.mapstruct.CollectionMappingStrategy;
@@ -18,19 +19,27 @@ import de.itvsh.ozg.pluto.vorgang.GrpcVorgangHeader;
 interface VorgangHeaderMapper {
 
 	static final String WIEDERVORLAGE_NEXT_FRIST_ATTRIBUTE_NAME = "nextWiedervorlageFrist";
+	static final String HAS_POSTFACH_NACHRICHT_ATTRIBUTE_NAME = "hasPostfachNachricht";
 
 	@Mapping(target = "nextFrist", source = "clientAttributesList")
+	@Mapping(target = "hasPostfachNachricht", source = "clientAttributesList")
 	VorgangHeader toVorgangHeader(GrpcVorgangHeader vorgangHeader);
 
 	default LocalDate mapNextFrist(List<GrpcClientAttribute> clientAttributes) {
-		var clientAttributeList = clientAttributes.stream()
-				.filter(attribute -> StringUtils.equals(attribute.getAttributeName(), WIEDERVORLAGE_NEXT_FRIST_ATTRIBUTE_NAME))
-				.map(GrpcClientAttribute::getValue)
+		return findByName(WIEDERVORLAGE_NEXT_FRIST_ATTRIBUTE_NAME, clientAttributes)
 				.map(GrpcClientAttributeValue::getStringValue)
-				.map(LocalDate::parse).toList();
-		if (clientAttributeList.isEmpty()) {
-			return null;
-		}
-		return clientAttributeList.get(0);
+				.map(LocalDate::parse).findFirst().orElse(null);
+	}
+
+	default boolean mapHasPostfachNachricht(List<GrpcClientAttribute> clientAttributes) {
+		return findByName(HAS_POSTFACH_NACHRICHT_ATTRIBUTE_NAME, clientAttributes)
+				.map(GrpcClientAttributeValue::getBoolValue)
+				.findFirst().orElse(false);
+	}
+
+	default Stream<GrpcClientAttributeValue> findByName(String attributeName, List<GrpcClientAttribute> clientAttributes) {
+		return clientAttributes.stream()
+				.filter(attribute -> StringUtils.equals(attribute.getAttributeName(), attributeName))
+				.map(GrpcClientAttribute::getValue);
 	}
 }
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageRemoteService.java b/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageRemoteService.java
index e7acc36fec..90a4a74b07 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageRemoteService.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageRemoteService.java
@@ -28,10 +28,12 @@ public class WiedervorlageRemoteService {
 	static final String CLIENT_ATTRIBUTE_NEXT_WIEDERVORLAGE_FRIST = "nextWiedervorlageFrist";
 	static final String ITEM_NAME = "Wiedervorlage";
 
-	@GrpcClient(GoofyServerApplication.GRPC_CLIENT)
-	private ClientAttributeServiceBlockingStub clientAttributeServiceStub;
 	@GrpcClient(GoofyServerApplication.GRPC_CLIENT)
 	private VorgangAttachedItemServiceBlockingStub vorgangAttachedItemServiceStub;
+
+	@GrpcClient(GoofyServerApplication.GRPC_CLIENT)
+	private ClientAttributeServiceBlockingStub clientAttributeServiceStub;
+
 	@Autowired
 	private WiedervorlageMapper mapper;
 	@Autowired
diff --git a/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageService.java b/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageService.java
index 84e1333f4d..4d6961375b 100644
--- a/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageService.java
+++ b/goofy-server/src/main/java/de/itvsh/goofy/wiedervorlage/WiedervorlageService.java
@@ -30,15 +30,11 @@ class WiedervorlageService {
 	}
 
 	Optional<LocalDate> calculateNextFrist(Stream<Wiedervorlage> wiedervorlagen) {
-		var sortedWiedervorlagen = wiedervorlagen
+		return wiedervorlagen
 				.filter(IS_NOT_DONE)
 				.sorted(Comparator.comparing(Wiedervorlage::getFrist))
-				.toList();
-
-		if (sortedWiedervorlagen.isEmpty()) {
-			return Optional.empty();
-		}
-		return Optional.of(sortedWiedervorlagen.get(0).getFrist());
+				.map(Wiedervorlage::getFrist)
+				.findFirst();
 	}
 
 	public Stream<Wiedervorlage> findByVorgangId(String vorgangId) {
diff --git a/goofy-server/src/main/resources/application.yml b/goofy-server/src/main/resources/application.yml
index 375e521387..d8cb5523c3 100644
--- a/goofy-server/src/main/resources/application.yml
+++ b/goofy-server/src/main/resources/application.yml
@@ -10,7 +10,7 @@ spring:
     pathmatch:
       matching-strategy: ant-path-matcher
   application:
-    name: Goofy
+    name: goofy
   jackson:
     deserialization: 
       'ADJUST_DATES_TO_CONTEXT_TIME_ZONE': false
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/binaryfile/BinaryFileITCase.java b/goofy-server/src/test/java/de/itvsh/goofy/common/binaryfile/BinaryFileITCase.java
index d9ef671334..314dd0914e 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/binaryfile/BinaryFileITCase.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/binaryfile/BinaryFileITCase.java
@@ -78,7 +78,7 @@ class BinaryFileITCase {
 						.andExpect(jsonPath("issues[0].messageCode").value("validation_field_file_size_exceeded"))
 						.andExpect(jsonPath("issues[0].message").value("validation_field_file_size_exceeded"))
 						.andExpect(jsonPath("issues[0].parameters[0].name").value("unit"))
-						.andExpect(jsonPath("issues[0].parameters[0].value").value(BinaryFileUnit.MB));
+						.andExpect(jsonPath("issues[0].parameters[0].value").value(UploadBinaryFileSizeValidator.DEFAULT_UNIT_STRING));
 			}
 
 			@Test
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/CallContextTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/CallContextTestFactory.java
index f8cfa40b1e..c283db65e2 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/CallContextTestFactory.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/common/callcontext/CallContextTestFactory.java
@@ -1,7 +1,6 @@
 package de.itvsh.goofy.common.callcontext;
 
-import static de.itvsh.goofy.common.callcontext.ContextService.KEY_USER_ID;
-import static de.itvsh.goofy.common.callcontext.ContextService.KEY_USER_NAME;
+import static de.itvsh.goofy.common.callcontext.ContextService.*;
 
 import java.util.Map;
 
@@ -9,6 +8,8 @@ import de.itvsh.goofy.common.user.UserTestFactory;
 
 public class CallContextTestFactory {
 
+	public static final String CLIENT_NAME = "TEST_CLIENT";
+
 	static Map<String, String> createContextMap() {
 		return Map.of(
 				KEY_USER_ID, UserTestFactory.ID.toString(),
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/vorgang/GrpcClientAttributeTestFactory.java b/goofy-server/src/test/java/de/itvsh/goofy/vorgang/GrpcClientAttributeTestFactory.java
new file mode 100644
index 0000000000..aed0796d6e
--- /dev/null
+++ b/goofy-server/src/test/java/de/itvsh/goofy/vorgang/GrpcClientAttributeTestFactory.java
@@ -0,0 +1,31 @@
+
+package de.itvsh.goofy.vorgang;
+
+import de.itvsh.goofy.common.callcontext.CallContextTestFactory;
+import de.itvsh.ozg.pluto.grpc.clientAttribute.GrpcAccessPermission;
+import de.itvsh.ozg.pluto.grpc.clientAttribute.GrpcClientAttribute;
+import de.itvsh.ozg.pluto.grpc.clientAttribute.GrpcClientAttribute.Builder;
+import de.itvsh.ozg.pluto.grpc.clientAttribute.GrpcClientAttributeValue;
+
+class GrpcClientAttributeTestFactory {
+
+	static final String CLIENT = CallContextTestFactory.CLIENT_NAME;
+	static final GrpcAccessPermission ACCESS = GrpcAccessPermission.READ_WRITE;
+
+	static final GrpcClientAttribute create() {
+		return createBuilder().build();
+	}
+
+	static final Builder createBuilder() {
+		return GrpcClientAttribute.newBuilder()
+				.setClientName(CLIENT)
+				.setAccess(ACCESS);
+	}
+
+	static final GrpcClientAttribute createWith(String attributeName, boolean value) {
+		return createBuilder().setAttributeName(attributeName)
+				.setValue(GrpcClientAttributeValue.newBuilder().setBoolValue(value).build())
+				.build();
+	}
+
+}
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/vorgang/VorgangHeaderMapperTest.java b/goofy-server/src/test/java/de/itvsh/goofy/vorgang/VorgangHeaderMapperTest.java
index d547eefa87..7ef7bfd6a8 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/vorgang/VorgangHeaderMapperTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/vorgang/VorgangHeaderMapperTest.java
@@ -75,7 +75,6 @@ class VorgangHeaderMapperTest {
 				var header = mapper.toVorgangHeader(vorgangHeaderWithEmptyClientAttributes);
 
 				assertThat(header.getNextFrist()).isNull();
-				;
 			}
 
 			@Test
@@ -94,6 +93,28 @@ class VorgangHeaderMapperTest {
 			}
 		}
 
+		@Nested
+		class HasPostfachNachricht {
+			@Test
+			void shouldSetFalseIfNotExists() {
+				var vorgangHeader = GrpcVorgangHeaderTestFactory.createBuilder().clearClientAttributes().build();
+
+				var mapped = mapper.toVorgangHeader(vorgangHeader);
+
+				assertThat(mapped.isHasPostfachNachricht()).isFalse();
+			}
+
+			@Test
+			void shouldBeTrue() {
+				var clientAttribute = GrpcClientAttributeTestFactory.createWith("hasPostfachNachricht", true);
+				var vorgangHeader = GrpcVorgangHeaderTestFactory.createBuilder().addClientAttributes(clientAttribute).build();
+
+				var mapped = mapper.toVorgangHeader(vorgangHeader);
+
+				assertThat(mapped.isHasPostfachNachricht()).isTrue();
+			}
+		}
+
 		private VorgangHeader callMapper() {
 			return mapper.toVorgangHeader(GrpcVorgangHeaderTestFactory.create());
 		}
diff --git a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageServiceTest.java b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageServiceTest.java
index db6195cb72..1609042fd1 100644
--- a/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageServiceTest.java
+++ b/goofy-server/src/test/java/de/itvsh/goofy/wiedervorlage/WiedervorlageServiceTest.java
@@ -113,7 +113,7 @@ class WiedervorlageServiceTest {
 
 				var nextFrist = calculateNextFrist(Stream.of(fristPast2Days, fristPast1Day, fristFuture1Day, fristFuture2Days));
 
-				assertThat(nextFrist.get()).isEqualTo(LocalDate.now().minus(2, ChronoUnit.DAYS));
+				assertThat(nextFrist).contains(LocalDate.now().minus(2, ChronoUnit.DAYS));
 			}
 
 			@Test
@@ -125,7 +125,7 @@ class WiedervorlageServiceTest {
 
 				var nextFrist = calculateNextFrist(Stream.of(fristPast1DayNotDone, fristPast1DayDone));
 
-				assertThat(nextFrist.get()).isEqualTo(LocalDate.now().plus(1, ChronoUnit.DAYS));
+				assertThat(nextFrist).contains(LocalDate.now().plus(1, ChronoUnit.DAYS));
 			}
 
 			private Optional<LocalDate> calculateNextFrist(Stream<Wiedervorlage> wiedervorlagen) {
-- 
GitLab