From 26e9be7d599aab7e00346f75d79075867b7b7bdf Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Wed, 19 Jun 2024 16:27:02 +0200
Subject: [PATCH] OZG-5666 handle empty attachments properly; impl PR comments;
 tiny cleanup

---
 .../antragraum/AntragraumGrpcService.java     | 18 ++++---------
 .../antragraum/AntragraumService.java         | 23 +++++-----------
 .../postfach/PostfachNachrichtMapper.java     |  7 ++---
 .../antragraum/AntragraumServiceTest.java     | 26 +++++--------------
 .../postfach/PostfachNachrichtMapperTest.java | 26 ++++++++++++++++++-
 5 files changed, 47 insertions(+), 53 deletions(-)

diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
index 16a64d1..40f4824 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
@@ -44,27 +44,19 @@ class AntragraumGrpcService extends AntragraumServiceGrpc.AntragraumServiceImplB
 
 	@Override
 	public void findRueckfragen(GrpcFindRueckfragenRequest request, StreamObserver<GrpcFindRueckfragenResponse> streamObserver) {
-		var rueckfragen = buildGrpcRueckfrage(request.getSamlToken());
+		var rueckfragen = antragraumService.findRueckfragen(request.getSamlToken())
+				.map(mapper::toGrpc)
+				.map(rueckfrage -> addAnswers(request.getSamlToken(), rueckfrage));
 
 		streamObserver.onNext(buildFindRueckfragenResponse(rueckfragen));
 		streamObserver.onCompleted();
 	}
 
-	private Stream<GrpcRueckfrage> buildGrpcRueckfrage(String samlToken) {
-		return antragraumService.findRueckfragen(samlToken)
-				.map(mapper::toGrpc)
-				.map(rueckfrage -> addAnswers(samlToken, rueckfrage));
-
-	}
-
 	private GrpcRueckfrage addAnswers(String samlToken, GrpcRueckfrage rueckfrage) {
-		var rueckfrageAnswer = buildGrpcRueckfrageAnswer(samlToken, rueckfrage.getId());
-		return rueckfrage.toBuilder()
-				.addAllAnswers(rueckfrageAnswer)
-				.build();
+		return rueckfrage.toBuilder().addAllAnswers(findRueckfrageAnswers(samlToken, rueckfrage.getId())).build();
 	}
 
-	List<GrpcRueckfrageAnswer> buildGrpcRueckfrageAnswer(String samlToken, String rueckfrageId) {
+	List<GrpcRueckfrageAnswer> findRueckfrageAnswers(String samlToken, String rueckfrageId) {
 		return antragraumService.findAnswers(samlToken, rueckfrageId).map(mapper::toRueckfrageAnswer).toList();
 	}
 
diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
index 2104fa3..0cfc23e 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
@@ -38,7 +38,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
 import org.springframework.stereotype.Service;
 
 import de.ozgcloud.nachrichten.NachrichtenManagerProperties;
-import de.ozgcloud.nachrichten.common.vorgang.Vorgang;
 import de.ozgcloud.nachrichten.common.vorgang.VorgangService;
 import de.ozgcloud.nachrichten.postfach.PersistPostfachNachrichtService;
 import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
@@ -99,26 +98,20 @@ public class AntragraumService {
 
 		var rueckfragen = postfachNachrichtService.findRueckfragen(BAYERN_ID_SERVICE_KONTO_TYPE, getPostfachId(samlToken))
 				.map(rueckfrageMapper::fromPostfachNachricht)
-				.map(rueckfrage -> enrichByAnswers(rueckfrage, findAnswers(samlToken, rueckfrage.getId()).toList())).toList();
+				.map(rueckfrage -> enrichByAnswers(rueckfrage, findAnswers(samlToken, rueckfrage.getId()))).toList();
 		return enrichRueckfragen(rueckfragen);
 	}
 
-	Rueckfrage enrichByAnswers(Rueckfrage rueckfrage, List<PostfachNachricht> answers) {
+	Rueckfrage enrichByAnswers(Rueckfrage rueckfrage, Stream<PostfachNachricht> answers) {
 		var rueckfrageBuilder = rueckfrage.toBuilder();
 
-		getFirstSentAt(answers).ifPresent(firstSentAt -> {
-			rueckfrageBuilder.answeredAt(firstSentAt);
-			rueckfrageBuilder.status(RueckfrageStatus.ANSWERED);
-		});
+		getFirstSentAt(answers).ifPresent(firstSentAt -> rueckfrageBuilder.answeredAt(firstSentAt).status(RueckfrageStatus.ANSWERED));
 
 		return rueckfrageBuilder.build();
 	}
 
-	Optional<ZonedDateTime> getFirstSentAt(List<PostfachNachricht> answers) {
-		return answers.stream()
-				.sorted(Comparator.comparing(PostfachNachricht::getSentAt))
-				.map(PostfachNachricht::getSentAt)
-				.findFirst();
+	Optional<ZonedDateTime> getFirstSentAt(Stream<PostfachNachricht> answers) {
+		return answers.sorted(Comparator.comparing(PostfachNachricht::getSentAt)).map(PostfachNachricht::getSentAt).findFirst();
 	}
 
 	Stream<Rueckfrage> enrichRueckfragen(List<Rueckfrage> rueckfragen) {
@@ -129,14 +122,10 @@ public class AntragraumService {
 	}
 
 	Stream<Rueckfrage> addVorgangName(List<Rueckfrage> rueckfragen, String vorgangId) {
-		var vorgang = getVorgang(vorgangId);
+		var vorgang = vorgangService.getVorgang(vorgangId);
 		return rueckfragen.stream().map(rueckfrage -> rueckfrage.toBuilder().vorgangName(vorgang.getName()).build());
 	}
 
-	Vorgang getVorgang(String vorgangId) {
-		return vorgangService.getVorgang(vorgangId);
-	}
-
 	public String sendRueckfrageAnswer(String samlToken, String rueckfrageId, PostfachNachricht nachricht) {
 		verifyToken(samlToken);
 
diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapper.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapper.java
index 82ac569..76cdd64 100644
--- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapper.java
+++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapper.java
@@ -71,7 +71,6 @@ public abstract class PostfachNachrichtMapper {
 		return StringBasedIdentifier.builder().postfachId(postfachId).build();
 	}
 
-	@SuppressWarnings("unchecked")
 	public GrpcPostfachMail fromMap(Map<String, Object> mailMap) {
 		var postfachMailBuilder = GrpcPostfachMail.newBuilder()
 				.setId(MapUtils.getString(mailMap, PostfachNachricht.FIELD_ID))
@@ -88,7 +87,10 @@ public abstract class PostfachNachrichtMapper {
 				.setMailBody(MapUtils.getString(mailMap, PostfachNachricht.FIELD_MAIL_BODY))
 				.setReplyOption(MapUtils.getString(mailMap, PostfachNachricht.FIELD_REPLY_OPTION));
 
-		Optional.ofNullable(mailMap.get(PostfachNachricht.FIELD_ATTACHMENTS)).map(this::getAttachments)
+		Optional.ofNullable(mailMap.get(PostfachNachricht.FIELD_ATTACHMENTS))
+				.map(String.class::cast)
+				.map(StringUtils::trimToNull)
+				.map(this::getAttachments)
 				.ifPresent(postfachMailBuilder::addAllAttachment);
 
 		Optional.ofNullable(getAsMap(mailMap, PostfachNachricht.POSTFACH_ADDRESS_FIELD))
@@ -104,7 +106,6 @@ public abstract class PostfachNachrichtMapper {
 			return Collections.singletonList(attachment);
 		}
 		return (Iterable<String>) attachments;
-
 	}
 
 	GrpcPostfachAddress buildGrpcPostfachAddress(Map<String, Object> postfachAddressMap) {
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java
index 797e455..453dca3 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumServiceTest.java
@@ -26,7 +26,6 @@ import de.ozgcloud.nachrichten.common.vorgang.VorgangTestFactory;
 import de.ozgcloud.nachrichten.postfach.PersistPostfachNachrichtService;
 import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
-import de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory;
 
 class AntragraumServiceTest {
 	@Spy
@@ -77,6 +76,7 @@ class AntragraumServiceTest {
 
 		private final Rueckfrage rueckfrage = RueckfrageTestFactory.create();
 		private final PostfachNachricht postfachNachricht = PostfachNachrichtTestFactory.create();
+		private final Stream<PostfachNachricht> answers = Stream.of(postfachNachricht);
 
 		@BeforeEach
 		void mock() {
@@ -85,7 +85,7 @@ class AntragraumServiceTest {
 			when(rueckfrageMapper.fromPostfachNachricht(any())).thenReturn(rueckfrage);
 			doReturn(rueckfrage).when(service).enrichByAnswers(any(), any());
 			doReturn(Stream.of(rueckfrage)).when(service).enrichRueckfragen(any());
-			doReturn(Stream.of(postfachNachricht)).when(service).findAnswers(any(), any());
+			doReturn(answers).when(service).findAnswers(any(), any());
 			doReturn(POSTFACH_ID).when(service).getPostfachId(any());
 		}
 
@@ -135,7 +135,7 @@ class AntragraumServiceTest {
 		void shouldCallEnrichByAnswers() {
 			service.findRueckfragen(SAML_TOKEN).toList();
 
-			verify(service).enrichByAnswers(rueckfrage, List.of(postfachNachricht));
+			verify(service).enrichByAnswers(rueckfrage, answers);
 		}
 
 		@Test
@@ -187,7 +187,7 @@ class AntragraumServiceTest {
 		}
 
 		private Rueckfrage enrichByAnswer() {
-			return service.enrichByAnswers(rueckfrage, Collections.emptyList());
+			return service.enrichByAnswers(rueckfrage, Stream.empty());
 		}
 	}
 
@@ -228,14 +228,14 @@ class AntragraumServiceTest {
 
 		@BeforeEach
 		void mock() {
-			doReturn(VorgangTestFactory.create()).when(service).getVorgang(any());
+			when(vorgangService.getVorgang(any())).thenReturn(VorgangTestFactory.create());
 		}
 
 		@Test
 		void shouldCallGetVorgang() {
 			addVorgangName().toList();
 
-			verify(service).getVorgang(RueckfrageTestFactory.VORGANG_ID);
+			verify(vorgangService).getVorgang(RueckfrageTestFactory.VORGANG_ID);
 		}
 
 		@Test
@@ -250,18 +250,6 @@ class AntragraumServiceTest {
 		}
 	}
 
-	@DisplayName("Get vorgang")
-	@Nested
-	class TestGetVorgang {
-
-		@Test
-		void shouldCallService() {
-			service.getVorgang(MessageTestFactory.VORGANG_ID);
-
-			verify(vorgangService).getVorgang(MessageTestFactory.VORGANG_ID);
-		}
-	}
-
 	@DisplayName("Get first sentAt")
 	@Nested
 	class TestGetFirstSentAt {
@@ -274,7 +262,7 @@ class AntragraumServiceTest {
 
 		@Test
 		void shouldReturnSentAt() {
-			var firstSentAt = service.getFirstSentAt(List.of(PostfachNachrichtTestFactory.create(), earlyPostfachNachricht, latePostfachNachricht));
+			var firstSentAt = service.getFirstSentAt(Stream.of(PostfachNachrichtTestFactory.create(), earlyPostfachNachricht, latePostfachNachricht));
 
 			assertThat(firstSentAt).contains(earlyZonedDateTime);
 		}
diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapperTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapperTest.java
index 032ce36..40f9862 100644
--- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapperTest.java
+++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachNachrichtMapperTest.java
@@ -31,7 +31,7 @@ import static org.mockito.Mockito.*;
 import java.util.Map;
 import java.util.UUID;
 
-import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.assertj.core.api.Assertions;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.DisplayName;
@@ -135,6 +135,30 @@ class PostfachNachrichtMapperTest {
 
 				assertDoesNotThrow(() -> fromMap(postfachNachrichtMap));
 			}
+
+			@DisplayName("on empty attachments")
+			@Nested
+			class TestOnEmptyAttachmets {
+
+				@Test
+				void shouldProceedWithEmptyAttachments() {
+					var postfachNachrichtMap = PostfachNachrichtTestFactory.asMap();
+
+					postfachNachrichtMap.put(PostfachNachricht.FIELD_ATTACHMENTS, StringUtils.EMPTY);
+
+					assertDoesNotThrow(() -> fromMap(postfachNachrichtMap));
+				}
+
+				@Test
+				void shouldKeepEmptyAttachments() {
+					var postfachNachrichtMap = PostfachNachrichtTestFactory.asMap();
+					postfachNachrichtMap.put(PostfachNachricht.FIELD_ATTACHMENTS, StringUtils.EMPTY);
+
+					var postfachNachricht = fromMap(postfachNachrichtMap);
+
+					assertThat(postfachNachricht.getAttachmentList()).isEmpty();
+				}
+			}
 		}
 
 		@DisplayName("with missing postfachAddress")
-- 
GitLab