diff --git a/src/main/docker/docker-compose.yaml b/src/main/docker/docker-compose.yaml index 2e816b300db2ca63dbee8fc6700eb07027ec08b2..48b6f851073ba9e3f99850ff43af8874fa12fa8e 100644 --- a/src/main/docker/docker-compose.yaml +++ b/src/main/docker/docker-compose.yaml @@ -13,4 +13,4 @@ services: ETR_NETZ: "e4k" ETR_EINSTELLUNGEN_ELSTERZERTIFIKAT_PASSWORT: "-siehe-keepass-" ETR_EINSTELLUNGEN_ELSTERZERTIFIKAT_DATEIPFAD: "/opt/ELSTER-Transfer/elster-org-cert.pfx" - ETR_ACCESS_ALLOWFROM: '\d+.\d+\.\d+\.\d+;\d*|::1;\d*|0:0:0:0:0:0:0:1;\d*' + ETR_ACCESS_ALLOWFROM: '.*' diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/muk/transfer/ElsterTransferRemoteService.java b/src/main/java/de/ozgcloud/nachrichten/postfach/muk/transfer/ElsterTransferRemoteService.java index df3ece48e86a784a3b39125554ee5d07ccac8e4a..844d00d2e88b779510edcf0e1472bd31afd4cd81 100644 --- a/src/main/java/de/ozgcloud/nachrichten/postfach/muk/transfer/ElsterTransferRemoteService.java +++ b/src/main/java/de/ozgcloud/nachrichten/postfach/muk/transfer/ElsterTransferRemoteService.java @@ -37,6 +37,7 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Stream; +import org.bson.types.ObjectId; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.stereotype.Service; @@ -148,7 +149,7 @@ public class ElsterTransferRemoteService { BereitstellungAntwort createAntwort(PostfachNachricht nachricht) { var antwort = new BereitstellungAntwort(); - antwort.setZuordnungskriterium(ObjectIdToUUIDConverter.toUUID(nachricht.getVorgangId())); + antwort.setZuordnungskriterium(ObjectIdToUUIDConverter.toUUID(nachricht.getId())); antwort.setAntwortBetreffe(Set.of(postfachProperties.getReplySubjectPrefix() + nachricht.getSubject())); antwort.setAntwortFrist(LocalDate.now().plusDays(postfachProperties.getReplyInDays())); return antwort; @@ -177,31 +178,39 @@ public class ElsterTransferRemoteService { .mailBody(postfachProperties.getBody()); if (Objects.nonNull(antwortDetails.getZuordnungskriterium())) { - var vorgangId = ObjectIdToUUIDConverter.toObjectId(antwortDetails.getZuordnungskriterium()); - nachrichtBuilder.vorgangId(vorgangId.toHexString()); - - if (Objects.nonNull(antwortDetails.getAnhaenge())) { - nachrichtBuilder.attachments(antwortDetails.getAnhaenge().stream() - .filter(Objects::nonNull) - .map(downloadAnhangDetails -> this.downloadAnhang(downloadAnhangDetails, vorgangId.toHexString())) - .filter(Optional::isPresent) - .map(Optional::get) - .toList()); - } + var nachrichtId = ObjectIdToUUIDConverter.toObjectId(antwortDetails.getZuordnungskriterium()); + nachrichtBuilder + .referencedNachricht(nachrichtId.toHexString()) + .replyOption(PostfachNachricht.ReplyOption.POSSIBLE); + // TODO update to new API as soon the new api is available. + //addAttachments(nachrichtBuilder, antwortDetails, nachrichtId); } return nachrichtBuilder.build(); } - Optional<String> downloadAnhang(DownloadAnhangDetails downloadAnhangDetails, String vorgangId) { - Optional<String> fileIdOptional = Optional.empty(); + private void addAttachments(final PostfachNachricht.PostfachNachrichtBuilder nachrichtBuilder, final AntwortDetails antwortDetails, final ObjectId nachrichtId) { + if (Objects.nonNull(antwortDetails.getAnhaenge())) { + nachrichtBuilder.attachments(antwortDetails.getAnhaenge().stream() + .filter(Objects::nonNull) + .map(downloadAnhangDetails -> saveAnhang(downloadAnhang(downloadAnhangDetails), downloadAnhangDetails, nachrichtId.toHexString())) + .filter(Optional::isPresent) + .map(Optional::get) + .toList()); + } + } + + byte[] downloadAnhang(DownloadAnhangDetails downloadAnhangDetails) { var url = postfachProperties.getServer() + downloadAnhangDetails.getDownloadUrl(); - var data = (byte[]) restClient.getForObject(url, byte[].class); + return restClient.getForObject(url, byte[].class); + } + Optional<String> saveAnhang(byte[] data, DownloadAnhangDetails downloadAnhangDetails, String nachrichtId) { + Optional<String> fileIdOptional = Optional.empty(); if (Objects.nonNull(data)) { try (var dataIn = new ByteArrayInputStream(data)) { - fileIdOptional = storeToOzgCloud(downloadAnhangDetails, vorgangId, dataIn); + fileIdOptional = storeToOzgCloud(downloadAnhangDetails, nachrichtId, dataIn); } catch (IOException e) { LOG.error("Error transferring attachment body from Elster-Transfer to OZG-Cloud.", e); throw new TechnicalException("Error downloading anhang", e); @@ -228,12 +237,11 @@ public class ElsterTransferRemoteService { return Optional.empty(); } - static OzgCloudUploadFile createOzgCloudUploadFile(final DownloadAnhangDetails downloadAnhangDetails, final String vorgangId) { + static OzgCloudUploadFile createOzgCloudUploadFile(final DownloadAnhangDetails downloadAnhangDetails, final String nachrichtId) { return OzgCloudUploadFile.builder() .fileName(downloadAnhangDetails.getDatei()) .fieldName(POSTFACH) - .contentType(downloadAnhangDetails.getMimeType()) - .vorgangId(vorgangId).build(); + .contentType(downloadAnhangDetails.getMimeType()).build(); } } diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/muk/MukPostfachRemoteServiceITCase.java b/src/test/java/de/ozgcloud/nachrichten/postfach/muk/MukPostfachRemoteServiceITCase.java index 2f51fc0da50581d163437ba6fcba67c62def91ba..a42340e3ef765f70acf21c244deb6f825e991c80 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/muk/MukPostfachRemoteServiceITCase.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/muk/MukPostfachRemoteServiceITCase.java @@ -29,6 +29,7 @@ import static org.assertj.core.api.Assertions.*; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -140,6 +141,7 @@ public class MukPostfachRemoteServiceITCase { } @Test + @Disabled("Needs to be reimplemented when the new File API is available") void shouldDownloadAntwort() { var antworten = mukPostfachRemoteService.getAllMessages().toList(); diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/muk/PostfachNachrichtTestFactory.java b/src/test/java/de/ozgcloud/nachrichten/postfach/muk/PostfachNachrichtTestFactory.java index c1886ef8b3658d31b5fc61e968354cab3f40c994..e67663c63314116907435936a7c464141cdeef09 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/muk/PostfachNachrichtTestFactory.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/muk/PostfachNachrichtTestFactory.java @@ -37,7 +37,7 @@ import de.ozgcloud.nachrichten.postfach.PostfachNachricht.Direction; public class PostfachNachrichtTestFactory { - public static final String ID = UUID.randomUUID().toString(); + public static final String ID = ObjectId.get().toHexString(); public static final String CREATED_AT_STR = "2020-04-01T10:30:10Z"; public static final ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR); public static final String CREATED_BY = UUID.randomUUID().toString(); @@ -57,7 +57,7 @@ public class PostfachNachrichtTestFactory { public static final int POSTFACH_TYPE = 1; public static final String SUBJECT = LoremIpsum.getInstance().getTitle(1); public static final String MESSAGE_ID = UUID.randomUUID().toString(); - public static final String VORGANG_ID = new ObjectId().toHexString(); + public static final String NACHRICHT_ID = ObjectId.get().toHexString(); public static PostfachNachricht create() { return createBuilder().build(); @@ -68,7 +68,7 @@ public class PostfachNachrichtTestFactory { .id(ID) .postfachAddress(postfachAddress()) .messageId(MESSAGE_ID) - .vorgangId(VORGANG_ID) + .vorgangId(NACHRICHT_ID) .direction(DIRECTION) .createdAt(CREATED_AT) .createdBy(CREATED_BY) diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/AntwortDetailsTestFactory.java b/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/AntwortDetailsTestFactory.java index 90dfc7fce3a86f71407959052b6e218bd2a26e40..44dcc3fd847856ea973a965567be4c96736d1595 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/AntwortDetailsTestFactory.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/AntwortDetailsTestFactory.java @@ -37,7 +37,7 @@ public class AntwortDetailsTestFactory { public static final String DATEI_BEZEICHNUNG = "test daten"; public static final URI DOWNLOAD_URI = URI.create("/download"); public static final String TEXT_CSV = "text/csv"; - public static final UUID ZUORDNUNG = ObjectIdToUUIDConverter.toUUID(VORGANG_ID); + public static final UUID ZUORDNUNG = ObjectIdToUUIDConverter.toUUID(NACHRICHT_ID); static AntwortDetails create() { var antwortDetails = new AntwortDetails(); diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/ElsterTransferRemoteServiceTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/ElsterTransferRemoteServiceTest.java index 3f6d7c48c594074818cd96be1f259cff6a0ff4a7..a6cd78664bf471d2026466148dc6cb2aff256e33 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/ElsterTransferRemoteServiceTest.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/ElsterTransferRemoteServiceTest.java @@ -36,6 +36,7 @@ import java.util.UUID; import org.bson.types.ObjectId; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; @@ -260,6 +261,7 @@ class ElsterTransferRemoteServiceTest { @Nested class TestLoadingAntwort { + byte[] data = "test data".getBytes(); @Test void shouldLoadAntwort() { var antwort = elsterTransferService.getAntwort(AntwortDetailsTestFactory.create()); @@ -268,15 +270,17 @@ class ElsterTransferRemoteServiceTest { } @Test + @Disabled("Needs to be reimplemented when the new File API is available") void shouldCallDownloadAntwort() { setupForAttachments(); elsterTransferService.getAntwort(AntwortDetailsTestFactory.create()); - verify(elsterTransferService).downloadAnhang(any(), anyString()); + verify(elsterTransferService).downloadAnhang(any()); } @Test + @Disabled("Needs to be reimplemented when the new File API is available") void shouldCallStoreToOzgCloud() throws IOException { setupForAttachments(); @@ -293,8 +297,6 @@ class ElsterTransferRemoteServiceTest { @Test void shouldHandleAttachmentSaveError() { - when(postfachProperties.getServer()).thenReturn("http://localhost"); - when(restClient.getForObject(matches(postfachProperties.getServer() + DOWNLOAD_URI), any())).thenReturn("Test,Data".getBytes()); when(attachmentService.store(any(), any())).thenReturn(null); DownloadAnhangDetails downloadAnhangDetails = new DownloadAnhangDetails(); @@ -303,7 +305,7 @@ class ElsterTransferRemoteServiceTest { downloadAnhangDetails.setDateiBezeichnung(OzgCloudFileTestFactory.NAME); downloadAnhangDetails.setDatei(""); - var res = elsterTransferService.downloadAnhang(downloadAnhangDetails, ObjectId.get().toHexString()); + var res = elsterTransferService.saveAnhang(data, downloadAnhangDetails, ObjectId.get().toHexString()); assertThat(res).isNotPresent(); @@ -319,13 +321,14 @@ class ElsterTransferRemoteServiceTest { } @Test + @Disabled("Needs to be reimplemented when the new File API is available") void shouldHaveVorgangId() { when(restClient.getForObject(matches(postfachProperties.getServer() + DOWNLOAD_URI), any())).thenReturn("Test,Data".getBytes()); when(attachmentService.store(any(), any())).thenReturn(OzgCloudFileId.from(new ObjectId().toHexString())); var antwort = elsterTransferService.getAntwort(AntwortDetailsTestFactory.create()); - assertThat(antwort.getVorgangId()).isEqualTo(VORGANG_ID); + assertThat(antwort.getVorgangId()).isEqualTo(NACHRICHT_ID); } @Test @@ -370,6 +373,7 @@ class ElsterTransferRemoteServiceTest { @Nested class TestExceptionHandling { + byte[] data = "test data".getBytes(); @Test void shouldThrowTechnicalExceptionOnUpload() throws IOException { doThrow(IOException.class).when(elsterTransferService).uploadFile(any()); @@ -381,11 +385,11 @@ class ElsterTransferRemoteServiceTest { @Test void shouldThrowTechnicalExceptionOnStore() throws IOException { var downloadAnhangDetails = AntwortDetailsTestFactory.createDownloadAnhangDetails(); - when(restClient.getForObject(eq("null" + downloadAnhangDetails.getDownloadUrl()), any())).thenReturn("data".getBytes()); + doThrow(IOException.class).when(elsterTransferService).storeToOzgCloud(any(), any(), any()); assertThatExceptionOfType(TechnicalException.class).isThrownBy( - () -> elsterTransferService.downloadAnhang(downloadAnhangDetails, VORGANG_ID) + () -> elsterTransferService.saveAnhang(data, downloadAnhangDetails, NACHRICHT_ID) ); } } @@ -418,6 +422,7 @@ class ElsterTransferRemoteServiceTest { } @Test + @Disabled("Needs to be reimplemented when the new File API is available") void shouldHaveVorgangId() { var file = ElsterTransferRemoteService.createOzgCloudUploadFile(downloadAnhangDetails, vorgangId); diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/MukPostfachMessageMapperTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/MukPostfachMessageMapperTest.java index 9f68f9e684bfef4c4df43e587c0d7884c03a891b..a83eac81fd0ee017b26fa5c6c6de82c32679db1e 100644 --- a/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/MukPostfachMessageMapperTest.java +++ b/src/test/java/de/ozgcloud/nachrichten/postfach/muk/transfer/MukPostfachMessageMapperTest.java @@ -64,14 +64,14 @@ class MukPostfachMessageMapperTest { void shouldMapVorgangIdToEmpfaengerreferenz() { var result = map(); - assertThat(result.getEmpfaengerreferenz()).isEqualTo(VORGANG_ID); + assertThat(result.getEmpfaengerreferenz()).isEqualTo(NACHRICHT_ID); } @Test void shouldMapVorgangIdToGeschaeftszeichen() { var result = map(); - assertThat(result.getEmpfaengerreferenz()).isEqualTo(VORGANG_ID); + assertThat(result.getEmpfaengerreferenz()).isEqualTo(NACHRICHT_ID); } @Test