diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocument.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocument.java new file mode 100644 index 0000000000000000000000000000000000000000..b1fc1323bb8e95568ecb066e10a8a5fa5f4bf96d --- /dev/null +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocument.java @@ -0,0 +1,13 @@ +package de.ozgcloud.nachrichten.postfach.osiv2.transfer; + +public record Osi2HtmlDocument(String html) { + + public String renderToPlainText() { + return html.replace("&", "&"); + } + + public static String renderToPlainText(String html) { + return new Osi2HtmlDocument(html).renderToPlainText(); + } + +} diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java index f5acb80a874aed8cf323aca797cbc5488f7846f5..0b20678b622bcfc0df1bc2a009554693870c277e 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java @@ -15,7 +15,7 @@ import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.V1ReplyMessage; import lombok.Builder; import lombok.Getter; -@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, imports = ZoneOffset.class) +@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, imports = { ZoneOffset.class, Osi2HtmlDocument.class }) public interface Osi2ResponseMapper { String POSTFACH_ADDRESS_VERSION = "2.0"; @@ -32,7 +32,7 @@ public interface Osi2ResponseMapper { @Mapping(target = "direction", constant = "IN") @Mapping(target = "vorgangId", source = "sequencenumber") @Mapping(target = "referencedNachricht", ignore = true) - @Mapping(target = "mailBody", source = "body") + @Mapping(target = "mailBody", expression = "java( message.getIsHtml() ? Osi2HtmlDocument.renderToPlainText(message.getBody()) : message.getBody() )") @Mapping(target = "replyOption", source = "replyAction") @Mapping(target = "attachments", ignore = true) PostfachNachricht toPostfachNachricht(V1ReplyMessage message); diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java index d11c556369fb8c3a892d1be7c46476c0b7298ca6..b4012fd71ce827623b2204ac56a62ab82ca530bf 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java @@ -49,6 +49,5 @@ public class PostfachApiFacadeService { public void deleteMessage(final String messageId) { messageExchangeApi.deleteMessage(UUID.fromString(messageId)); - } } diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java index 244a643d6f68160ea2243e9e868bf589f20291f3..84fec5a318a83aafc58fe20142b84367db2aa30f 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java @@ -11,8 +11,11 @@ public class V1ReplyMessageTestFactory { private static final String SEQUENCE_NUMMER = "OZG-Cloud-VorgangId"; private static final String SUBJECT = "Das ist das Subject"; - private static final String BODY = """ - Das ist das Multiline + public static final String HTML_REPLY_BODY = """ + Das ist das Multiline&<b>a</b><br><br/> + Body"""; + public static final String REPLY_BODY = """ + Das ist das Multiline&<b>a</b><br><br/> Body"""; private static final String DISPLAY_NAME = "Das ist der Absender"; private static final String ORIGIN_SENDER = "das ist der original Sender"; @@ -28,7 +31,7 @@ public class V1ReplyMessageTestFactory { return new V1ReplyMessage() .sequencenumber(SEQUENCE_NUMMER) .subject(SUBJECT) - .body(BODY) + .body(REPLY_BODY) .displayName(DISPLAY_NAME) .originSender(ORIGIN_SENDER) .replyAction(V1ReplyBehavior.fromValue(REPLAY_ACTION)) diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocumentTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocumentTest.java new file mode 100644 index 0000000000000000000000000000000000000000..2e0a7b669457fb3e3040982bc9198cb6693fcd48 --- /dev/null +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocumentTest.java @@ -0,0 +1,21 @@ +package de.ozgcloud.nachrichten.postfach.osiv2.transfer; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; + +class Osi2HtmlDocumentTest { + + @DisplayName("should render anchor link") + @Test + void shouldRenderAnchorLink() { + var plainText = renderPlainText("<a href=\"https://www.example.com\">&Example<br></a><br/>text"); + + assertThat("<a href=\"https://www.example.com\">&Example<br></a><br/>text").isEqualTo(plainText); + } + + private String renderPlainText(String html) { + return new Osi2HtmlDocument(html).renderToPlainText(); + } +} \ No newline at end of file diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java index 54586de660f6dacc6967dff94bdf70e6f3871d79..1c417e577b9134818309cc5a0ecdc9b976d8423a 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java @@ -1,5 +1,6 @@ package de.ozgcloud.nachrichten.postfach.osiv2.transfer; +import static de.ozgcloud.nachrichten.postfach.osiv2.factory.V1ReplyMessageTestFactory.*; import static org.assertj.core.api.Assertions.*; import java.time.ZonedDateTime; @@ -20,27 +21,27 @@ class Osi2ResponseMapperTest { @InjectMocks private Osi2ResponseMapper mapper = Mappers.getMapper(Osi2ResponseMapper.class); - private V1ReplyMessage message = V1ReplyMessageTestFactory.create(); + private final V1ReplyMessage message = V1ReplyMessageTestFactory.create(); @DisplayName("map V1ReplyMessage to PostfachNachricht") @Nested class V1ReplyMessageToPostfachNachricht { @Test - void shouldHaveId(){ + void shouldHaveId() { var postfachNachricht = mapper.toPostfachNachricht(message); assertThat(postfachNachricht.getId()).isEqualTo(UUID.nameUUIDFromBytes("123-guid-456".getBytes()).toString()); } @Test - void shouldHaveVorgangId(){ + void shouldHaveVorgangId() { var postfachNachricht = mapper.toPostfachNachricht(message); assertThat(postfachNachricht.getVorgangId()).isEqualTo("OZG-Cloud-VorgangId"); } @Test - void shouldHavePostfachAddress(){ + void shouldHavePostfachAddress() { var postfachNachricht = mapper.toPostfachNachricht(message); assertThat(postfachNachricht.getPostfachAddress().getIdentifier().toString()) @@ -48,56 +49,63 @@ class Osi2ResponseMapperTest { } @Test - void shouldHaveCreatedAt(){ + void shouldHaveCreatedAt() { var postfachNachricht = mapper.toPostfachNachricht(message); assertThat(postfachNachricht.getCreatedAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(5, ChronoUnit.SECONDS)); } @Test - void shouldHaveCreatedBy(){ + void shouldHaveCreatedBy() { var postfachNachricht = mapper.toPostfachNachricht(message); assertThat(postfachNachricht.getCreatedBy()).isEqualTo("Das ist der Absender"); } @Test - void shouldHaveSentAt(){ + void shouldHaveSentAt() { var postfachNachricht = mapper.toPostfachNachricht(message); assertThat(postfachNachricht.getSentAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(5, ChronoUnit.SECONDS)); } @Test - void shouldHaveDirection(){ + void shouldHaveDirection() { var postfachNachricht = mapper.toPostfachNachricht(message); assertThat(postfachNachricht.getDirection()).isEqualTo(PostfachNachricht.Direction.IN); } @Test - void shouldHaveSubject(){ + void shouldHaveSubject() { var postfachNachricht = mapper.toPostfachNachricht(message); assertThat(postfachNachricht.getSubject()).isEqualTo("Das ist das Subject"); } @Test - void shouldHaveBody(){ + void shouldHaveBody() { var postfachNachricht = mapper.toPostfachNachricht(message); - assertThat(postfachNachricht.getMailBody()).isEqualTo(""" - Das ist das Multiline - Body"""); + assertThat(postfachNachricht.getMailBody()).isEqualTo(REPLY_BODY); } @Test - void shouldHaveReplyOption(){ + void shouldMapHTMLBody() { + var postfachNachricht = mapper.toPostfachNachricht(message + .body(HTML_REPLY_BODY) + .isHtml(true)); + + assertThat(postfachNachricht.getMailBody()).isEqualTo(REPLY_BODY); + } + + @Test + void shouldHaveReplyOption() { var postfachNachricht = mapper.toPostfachNachricht(message); assertThat(postfachNachricht.getReplyOption()).isEqualTo(PostfachNachricht.ReplyOption.POSSIBLE); } -// TODO:prüfen das Attachments in der PostfachNachricht enthalten sind + // TODO:prüfen das Attachments in der PostfachNachricht enthalten sind } }