diff --git a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachService.java b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachService.java index 90d28db00fc2502aa4397ce64077e7769edbcd33..6df32e72ef34ffea7b8eeedf601d29d1527cc7d9 100644 --- a/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachService.java +++ b/nachrichten-manager-server/src/main/java/de/ozgcloud/nachrichten/postfach/PostfachService.java @@ -1,8 +1,7 @@ /* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * Copyright (c) 2024. Das Land Schleswig-Holstein + * vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung * * Lizenziert unter der EUPL, Version 1.2 oder - sobald * diese von der Europäischen Kommission genehmigt wurden - @@ -31,9 +30,6 @@ import java.util.Set; import java.util.function.Predicate; import java.util.stream.Stream; -import jakarta.annotation.PostConstruct; -import jakarta.validation.Valid; - import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationEventPublisher; @@ -47,6 +43,8 @@ import de.ozgcloud.nachrichten.postfach.PostfachNachricht.Direction; import de.ozgcloud.nachrichten.postfach.PostfachNachricht.ReplyOption; import de.ozgcloud.nachrichten.postfach.osi.OsiPostfachServerProcessException; import de.ozgcloud.vorgang.callcontext.CurrentUserService; +import jakarta.annotation.PostConstruct; +import jakarta.validation.Valid; import lombok.NonNull; import lombok.extern.log4j.Log4j2; @@ -55,14 +53,13 @@ import lombok.extern.log4j.Log4j2; @Validated class PostfachService { + static final Predicate<PostfachNachricht> IS_MUK_ANSWER = nachricht -> StringUtils.isEmpty(nachricht.getVorgangId()) && StringUtils.isNotEmpty( + nachricht.getReferencedNachricht()); + static final Set<ReplyOption> REPLY_POSSIBLE_OPTION = EnumSet.of(ReplyOption.POSSIBLE, ReplyOption.MANDATORY); private static final Predicate<PostfachNachricht> IS_FROM_HUMAN_USER = nachricht -> !StringUtils.startsWith(nachricht.getCreatedBy(), "system"); private static final Set<String> POSTFACH_TYPES_WITH_ANTRAGSRAUM = Set.of("BayernId"); - @Autowired(required = false) private PostfachRemoteService postfachRemoteService; - - static final Set<ReplyOption> REPLY_POSSIBLE_OPTION = EnumSet.of(ReplyOption.POSSIBLE, ReplyOption.MANDATORY); - @Autowired private PostfachNachrichtMapper mapper; @@ -127,11 +124,20 @@ class PostfachService { } private void persistReceivedMail(PostfachNachricht nachricht) { + if (IS_MUK_ANSWER.test(nachricht)) { + nachricht = linkToVorgang(nachricht); + } + persistMail(Optional.empty(), nachricht); postfachRemoteService.deleteMessage(nachricht.getMessageId()); } + PostfachNachricht linkToVorgang(PostfachNachricht nachricht) { + var persistedNachricht = mapper.fromMapToPostfachMail(persistingService.getById(nachricht.getReferencedNachricht())); + return nachricht.toBuilder().vorgangId(persistedNachricht.getVorgangId()).build(); + } + void persistMail(Optional<String> userId, PostfachNachricht mail) { persistingService.persistNachricht(userId, mail); @@ -246,5 +252,4 @@ class PostfachService { } block.run(); } - } \ No newline at end of file diff --git a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachServiceTest.java b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachServiceTest.java index ac8d6773fd1e363c8d9552a3307ea4a11c3c613d..5b5f2a99fe19a2b6f47e676012cfe59d6f2051dc 100644 --- a/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachServiceTest.java +++ b/nachrichten-manager-server/src/test/java/de/ozgcloud/nachrichten/postfach/PostfachServiceTest.java @@ -1,8 +1,7 @@ /* - * Copyright (C) 2022 Das Land Schleswig-Holstein vertreten durch den - * Ministerpräsidenten des Landes Schleswig-Holstein - * Staatskanzlei - * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * Copyright (c) 2024. Das Land Schleswig-Holstein + * vertreten durch den Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei Abteilung Digitalisierung und zentrales IT-Management der Landesregierung * * Lizenziert unter der EUPL, Version 1.2 oder - sobald * diese von der Europäischen Kommission genehmigt wurden - @@ -23,6 +22,7 @@ */ package de.ozgcloud.nachrichten.postfach; +import static de.ozgcloud.nachrichten.postfach.osi.MessageTestFactory.*; import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; @@ -34,6 +34,7 @@ import java.util.UUID; import java.util.stream.Stream; import org.apache.logging.log4j.Logger; +import org.bson.types.ObjectId; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; @@ -65,24 +66,23 @@ import nl.altindag.log.LogCaptor; class PostfachServiceTest { + static final String COMMAND_ID = UUID.randomUUID().toString(); + static final String USER_ID = UUID.randomUUID().toString(); @Spy @InjectMocks private PostfachService service; @Mock private PostfachRemoteService postfachRemoteService; - @Mock private PersistPostfachNachrichtService persistingService; @Spy private PostfachNachrichtMapper mapper = Mappers.getMapper(PostfachNachrichtMapper.class); - @Mock private ClientAttributeService clientAttributeService; @Mock private MessageAttachmentService messageAttachmentService; @Mock private ApplicationEventPublisher publisher; - @Mock private CurrentUserService userService; @Spy @@ -90,9 +90,6 @@ class PostfachServiceTest { @Spy private Optional<InfoManagerService> infomanagerService = Optional.of(mock(InfoManagerService.class)); - static final String COMMAND_ID = UUID.randomUUID().toString(); - static final String USER_ID = UUID.randomUUID().toString(); - @Nested class TestSaveDraft { @@ -313,6 +310,10 @@ class PostfachServiceTest { @Mock private PostfachNachricht mail; + private Optional<PostfachNachricht> adjustMail() { + return service.adjustMail(mail); + } + @Nested class TestReplaceBody { @@ -336,10 +337,6 @@ class PostfachServiceTest { assertThat(result).isPresent().get().extracting(PostfachNachricht::getMailBody).isEqualTo(expectedMailBody); } } - - private Optional<PostfachNachricht> adjustMail() { - return service.adjustMail(mail); - } } } @@ -715,7 +712,7 @@ class PostfachServiceTest { @Nested class TestGetPostfachs { - private Postfach postfach = PostfachTestFactory.create(); + private final Postfach postfach = PostfachTestFactory.create(); @Test void shouldCallBuildPostfach() { @@ -798,4 +795,48 @@ class PostfachServiceTest { } } } + + @Nested + class TestSavingMukAnswer { + private final String refId = ObjectId.get().toHexString(); + private PostfachNachricht answer = PostfachNachrichtTestFactory.createBuilder().vorgangId(null).referencedNachricht(refId).build(); + + @Test + void shouldIdentifyAsAnswer() { + var isMukAnswer = PostfachService.IS_MUK_ANSWER.test(answer); + + assertThat(isMukAnswer).isTrue(); + } + + @Test + void shouldNotIdentifyAsAnswer() { + var isMukAnswer = PostfachService.IS_MUK_ANSWER.test(PostfachNachrichtTestFactory.create()); + + assertThat(isMukAnswer).isFalse(); + } + + @Nested + class TestLinkingMukAnswerToVorgang { + + @Test + void shouldLoadPersistedNachricht() { + when(service.isPostfachConfigured()).thenReturn(Boolean.TRUE); + when(postfachRemoteService.getAllMessages()).thenReturn(Stream.of(answer)); + when(persistingService.getById(anyString())).thenReturn(PostfachNachrichtTestFactory.asMap()); + + service.fetchAndPersistReplies(); + + verify(persistingService).getById(any()); + } + + @Test + void shouldSetVorgangId() { + when(persistingService.getById(anyString())).thenReturn(PostfachNachrichtTestFactory.asMap()); + + var linkedNachricht = service.linkToVorgang(answer); + + assertThat(linkedNachricht.getVorgangId()).isEqualTo(VORGANG_ID); + } + } + } } \ No newline at end of file