From 354aaa34f17f9dd1edef0529a8acd9a8cd69e7a7 Mon Sep 17 00:00:00 2001
From: OZGCloud <ozgcloud@mgm-tp.com>
Date: Thu, 18 Apr 2024 12:02:53 +0200
Subject: [PATCH] =?UTF-8?q?OZG-4768=20Antwort=20zur=20R=C3=BCckfrage=20imp?=
 =?UTF-8?q?lementiert?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../antragraum/AntragraumGrpcService.java     |   8 +-
 .../antragraum/AntragraumNachrichtMapper.java |  17 +++
 .../antragraum/AntragraumService.java         |  10 ++
 .../antragraum/AntragraumGrpcServiceTest.java |  37 +++++++
 .../AntragraumNachrichtMapperTest.java        | 102 +++++++++++-------
 5 files changed, 135 insertions(+), 39 deletions(-)

diff --git a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
index 6977a57..4921595 100644
--- a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
+++ b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java
@@ -50,7 +50,11 @@ class AntragraumGrpcService extends AntragraumServiceGrpc.AntragraumServiceImplB
 
 	@Override
 	public void sendRueckfrageAnswer(GrpcSendRueckfrageAnswerRequest request, StreamObserver<GrpcCommand> streamObserver) {
-		throw new NotImplementedException("sendRueckfrageAnswer not implemented yet");
-	}
+		var answer = request.getAnswer();
+
+		var commandId = antragraumService.sendRueckfrageAnswer(request.getSamlToken(), answer.getRueckfrageId(), mapper.toPostfachNachricht(answer));
 
+		streamObserver.onNext(GrpcCommand.newBuilder().setId(commandId).build());
+		streamObserver.onCompleted();
+	}
 }
diff --git a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
index 136b02f..da60d2b 100644
--- a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
+++ b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapper.java
@@ -41,4 +41,21 @@ interface AntragraumNachrichtMapper {
 	@Mapping(source = "attachments", target = "attachmentFileIdList")
 	@Mapping(target = "status", constant = DEFAULT_STATUS)
 	GrpcRueckfrage toGrpc(PostfachNachricht postfachNachricht);
+
+	@Mapping(target = "mailBody", source = "answerText")
+	@Mapping(target = "attachments", source = "attachmentFileIdList")
+	@Mapping(target = "createdAt", ignore = true)
+	@Mapping(target = "createdBy", ignore = true)
+	@Mapping(target = "direction", ignore = true)
+	@Mapping(target = "id", ignore = true)
+	@Mapping(target = "messageCode", ignore = true)
+	@Mapping(target = "messageId", ignore = true)
+	@Mapping(target = "postfachAddress", ignore = true)
+	@Mapping(target = "postfachId", ignore = true)
+	@Mapping(target = "replyOption", ignore = true)
+	@Mapping(target = "sentAt", ignore = true)
+	@Mapping(target = "sentSuccessful", ignore = true)
+	@Mapping(target = "subject", ignore = true)
+	@Mapping(target = "vorgangId", ignore = true)
+	PostfachNachricht toPostfachNachricht(GrpcRueckfrageAnswer answer);
 }
diff --git a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
index 52ca34b..3d9ea7a 100644
--- a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
+++ b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumService.java
@@ -82,6 +82,16 @@ public class AntragraumService {
 		return postfachNachrichtService.findRueckfragen(postfachId);
 	}
 
+	public Stream<PostfachNachricht> findRueckfrageAnswers(String rueckfrageId) {
+		return postfachNachrichtService.findAnswers(rueckfrageId);
+	}
+
+	public String sendRueckfrageAnswer(String samlToken, String rueckfrageId, PostfachNachricht nachricht) {
+		verifyToken(samlToken);
+
+		return postfachNachrichtService.persistAnswer(rueckfrageId, nachricht);
+	}
+
 	void verifyToken(String token) {
 		var errors = verifier.verify(token);
 		if (CollectionUtils.isNotEmpty(errors)) {
diff --git a/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java b/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java
index e421e9f..c4a452e 100644
--- a/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java
+++ b/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcServiceTest.java
@@ -23,6 +23,7 @@ package de.ozgcloud.nachrichten.antragraum;
 import static org.mockito.ArgumentMatchers.*;
 import static org.mockito.Mockito.*;
 
+import java.util.UUID;
 import java.util.stream.Stream;
 
 import org.junit.jupiter.api.BeforeEach;
@@ -34,6 +35,7 @@ import org.mockito.Spy;
 
 import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
+import de.ozgcloud.vorgang.grpc.command.GrpcCommand;
 import io.grpc.stub.StreamObserver;
 
 class AntragraumGrpcServiceTest {
@@ -81,4 +83,39 @@ class AntragraumGrpcServiceTest {
 			}
 		}
 	}
+
+	@Nested
+	class TestSendAnswer {
+		@Mock
+		private StreamObserver<GrpcCommand> streamObserver;
+
+		@BeforeEach
+		void setup() {
+			when(antragraumService.sendRueckfrageAnswer(anyString(), anyString(), any(PostfachNachricht.class)))
+					.thenReturn(UUID.randomUUID().toString());
+			when(mapper.toPostfachNachricht(any(GrpcRueckfrageAnswer.class))).thenReturn(PostfachNachrichtTestFactory.create());
+		}
+
+		@Test
+		void shouldCallMapper() {
+			antragsraumGrpcService.sendRueckfrageAnswer(GrpcSendRueckfrageAnswerRequestTestFactory.create(), streamObserver);
+
+			verify(mapper).toPostfachNachricht(any(GrpcRueckfrageAnswer.class));
+		}
+
+		@Test
+		void shouldCallOnNext() {
+			antragsraumGrpcService.sendRueckfrageAnswer(GrpcSendRueckfrageAnswerRequestTestFactory.create(), streamObserver);
+
+			verify(streamObserver).onNext(any(GrpcCommand.class));
+		}
+
+		@Test
+		void shouldCallOnCompleted() {
+			antragsraumGrpcService.sendRueckfrageAnswer(GrpcSendRueckfrageAnswerRequestTestFactory.create(), streamObserver);
+
+			verify(streamObserver).onCompleted();
+		}
+
+	}
 }
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java b/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java
index d07db58..2a92f61 100644
--- a/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java
+++ b/src/test/java/de/ozgcloud/nachrichten/antragraum/AntragraumNachrichtMapperTest.java
@@ -24,9 +24,11 @@ import static org.assertj.core.api.Assertions.*;
 
 import java.time.format.DateTimeFormatter;
 
+import org.junit.jupiter.api.Nested;
 import org.junit.jupiter.api.Test;
 import org.mapstruct.factory.Mappers;
 
+import de.ozgcloud.nachrichten.postfach.PostfachNachricht;
 import de.ozgcloud.nachrichten.postfach.PostfachNachrichtTestFactory;
 import de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory;
 
@@ -34,57 +36,83 @@ class AntragraumNachrichtMapperTest {
 
 	AntragraumNachrichtMapper mapper = Mappers.getMapper(AntragraumNachrichtMapper.class);
 
-	@Test
-	void shouldMapVorgangId() {
-		var result = map();
+	@Nested
+	class TestMapRueckfrage {
 
-		assertThat(result.getVorgangId()).isEqualTo(MessageTestFactory.VORGANG_ID);
-	}
+		@Test
+		void shouldMapVorgangId() {
+			var result = map();
 
-	@Test
-	void shouldMapId() {
-		var result = map();
+			assertThat(result.getVorgangId()).isEqualTo(MessageTestFactory.VORGANG_ID);
+		}
 
-		assertThat(result.getId()).isEqualTo(PostfachNachrichtTestFactory.ID);
-	}
+		@Test
+		void shouldMapId() {
+			var result = map();
 
-	@Test
-	void shouldMapVorgangName() {
-		var result = map();
+			assertThat(result.getId()).isEqualTo(PostfachNachrichtTestFactory.ID);
+		}
 
-		assertThat(result.getVorgangName()).isEqualTo(MessageTestFactory.SUBJECT);
-	}
+		@Test
+		void shouldMapVorgangName() {
+			var result = map();
 
-	@Test
-	void shouldMapStatus() {
-		var result = map();
+			assertThat(result.getVorgangName()).isEqualTo(MessageTestFactory.SUBJECT);
+		}
 
-		assertThat(result.getStatus()).isEqualTo(AntragraumNachrichtMapper.DEFAULT_STATUS);
-	}
+		@Test
+		void shouldMapStatus() {
+			var result = map();
 
-	@Test
-	void shouldMapSentAt() {
-		var result = map();
+			assertThat(result.getStatus()).isEqualTo(AntragraumNachrichtMapper.DEFAULT_STATUS);
+		}
 
-		assertThat(result.getSentAt()).isEqualTo(PostfachNachrichtTestFactory.SENT_AT.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
-	}
+		@Test
+		void shouldMapSendAt() {
+			var result = map();
 
-	@Test
-	void shouldMapText() {
-		var result = map();
+			assertThat(result.getSentAt()).isEqualTo(PostfachNachrichtTestFactory.SENT_AT.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
+		}
 
-		assertThat(result.getText()).isEqualTo(PostfachNachrichtTestFactory.MAIL_BODY);
-	}
+		@Test
+		void shouldMapText() {
+			var result = map();
+
+			assertThat(result.getText()).isEqualTo(PostfachNachrichtTestFactory.MAIL_BODY);
+		}
 
-	@Test
-	void shouldMapAttachments() {
-		var result = map();
+		@Test
+		void shouldMapAttachments() {
+			var result = map();
+
+			assertThat(result.getAttachmentFileIdCount()).isEqualTo(1);
+			assertThat(result.getAttachmentFileId(0)).isEqualTo(PostfachNachrichtTestFactory.ATTACHMENTS.get(0));
+		}
+
+		private GrpcRueckfrage map() {
+			return mapper.toGrpc(PostfachNachrichtTestFactory.create());
+		}
 
-		assertThat(result.getAttachmentFileIdCount()).isEqualTo(1);
-		assertThat(result.getAttachmentFileId(0)).isEqualTo(PostfachNachrichtTestFactory.ATTACHMENTS.get(0));
 	}
 
-	private GrpcRueckfrage map() {
-		return mapper.toGrpc(PostfachNachrichtTestFactory.create());
+	@Nested
+	class TestMapAnswerToPostfachNachricht {
+		@Test
+		void shouldMapText() {
+			var result = map();
+
+			assertThat(result.getMailBody()).isEqualTo(GrpcRueckfrageAnswerTestFactory.TEXT);
+		}
+
+		@Test
+		void shouldMapAttachmentIds() {
+			var result = map();
+
+			assertThat(result.getAttachments()).isEqualTo(GrpcRueckfrageAnswerTestFactory.ATTACHMENT_ID_LIST);
+		}
+
+		private PostfachNachricht map() {
+			return mapper.toPostfachNachricht(GrpcRueckfrageAnswerTestFactory.create());
+		}
 	}
 }
\ No newline at end of file
-- 
GitLab