diff --git a/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java b/src/main/java/de/ozgcloud/nachrichten/antragraum/AntragraumGrpcService.java index 6977a57499fc8ab21257ee7ffa79ab19f62daf38..4921595ed99fe131abde54ebfccb4f42ad2a8d3e 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 136b02ff864ec238cd4db5068f2ec40b4ccecc6f..da60d2b6bc163a0aed86cbcc191ce86215de38af 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 52ca34b72393453155420fbc8f345b229b134d49..3d9ea7abd01eaa507573d2614f599654e0e2bfbf 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 e421e9f1e88b9333da6caa1427fa7a80c78dc98e..c4a452ee7608bea09b1b06e4822d0bfd890e388d 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 d07db58ecf7c183b3afef36cdcf27d8d7e7cbded..2a92f616cc2a3af18d8eb252219aa47451310967 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