From 1b35a00cfd2121bd204c9877c66cb5452f550dc2 Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Tue, 9 Jul 2024 12:56:24 +0200 Subject: [PATCH 01/12] cosys-integration add endpoint without presigned url parameter --- .../in/streaming/GenerateDocumentDTO.java | 31 +++++++++ .../GenerateDocumentPresignedUrlsDTO.java | 36 ++++++++++ .../in/streaming/StreamingAdapter.java | 66 +++++++++++++------ .../integration/adapter/out/s3/S3Adapter.java | 31 +++++++-- .../port/in/CreateDocumentInPort.java | 16 ++++- .../port/out/SaveFileToStorageOutPort.java | 15 ++++- .../usecase/CreateDocumentUseCase.java | 30 ++++++++- .../domain/model/DocumentStorageUrl.java | 1 + .../domain/model/GenerateDocument.java | 21 ++---- ...GenerateDocumentPresignedUrlsDTOTest.java} | 38 ++++++----- .../in/streaming/StreamingAdapterTest.java | 17 +++-- .../adapter/out/cosys/CosysAdapterTest.java | 5 +- .../adapter/out/s3/S3AdapterTest.java | 25 +++---- .../usecase/CreateDocumentUseCaseTest.java | 7 +- 14 files changed, 242 insertions(+), 97 deletions(-) create mode 100644 digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/GenerateDocumentDTO.java create mode 100644 digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/GenerateDocumentPresignedUrlsDTO.java rename digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/{domain/model/GenerateDocumentTest.java => adapter/in/streaming/GenerateDocumentPresignedUrlsDTOTest.java} (76%) diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/GenerateDocumentDTO.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/GenerateDocumentDTO.java new file mode 100644 index 000000000..157cc41cf --- /dev/null +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/GenerateDocumentDTO.java @@ -0,0 +1,31 @@ +package de.muenchen.oss.digiwf.cosys.integration.adapter.in.streaming; + +import com.fasterxml.jackson.databind.JsonNode; +import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public class GenerateDocumentDTO extends GenerateDocument { + @NotBlank + private String fileContext; + + @NotBlank + private String filePath; + + public GenerateDocumentDTO( + @NotBlank(message = "client is mandatory") String client, + @NotBlank(message = "role is mandatory") String role, + @NotBlank(message = "guid is mandatory") String guid, + JsonNode variables, + String fileContext, + String filePath) { + super(client, role, guid, variables); + this.fileContext = fileContext; + this.filePath = filePath; + } +} diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/GenerateDocumentPresignedUrlsDTO.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/GenerateDocumentPresignedUrlsDTO.java new file mode 100644 index 000000000..4a7393e7a --- /dev/null +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/GenerateDocumentPresignedUrlsDTO.java @@ -0,0 +1,36 @@ +package de.muenchen.oss.digiwf.cosys.integration.adapter.in.streaming; + +import com.fasterxml.jackson.databind.JsonNode; +import de.muenchen.oss.digiwf.cosys.integration.domain.model.DocumentStorageUrl; +import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Deprecated +@EqualsAndHashCode(callSuper = true) +@Data +@NoArgsConstructor +public class GenerateDocumentPresignedUrlsDTO extends GenerateDocument { + /** + * A list of presigned urls that are used to save the cosys documents in a s3 storage + */ + @Valid + @Size(min = 1, max = 1) + private List documentStorageUrls; + + public GenerateDocumentPresignedUrlsDTO( + @NotBlank(message = "client is mandatory") String client, + @NotBlank(message = "role is mandatory") String role, + @NotBlank(message = "guid is mandatory") String guid, + JsonNode variables, + List documentStorageUrls) { + super(client, role, guid, variables); + this.documentStorageUrls = documentStorageUrls; + } +} diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapter.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapter.java index 728b21708..1fac3c56b 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapter.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapter.java @@ -2,7 +2,6 @@ import de.muenchen.oss.digiwf.cosys.integration.application.port.in.CreateDocumentInPort; -import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; import de.muenchen.oss.digiwf.message.process.api.ErrorApi; import de.muenchen.oss.digiwf.message.process.api.ProcessApi; import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; @@ -13,6 +12,7 @@ import org.springframework.messaging.Message; import java.util.Map; +import java.util.Objects; import java.util.function.Consumer; import static de.muenchen.oss.digiwf.message.common.MessageConstants.*; @@ -26,26 +26,50 @@ public class StreamingAdapter { private final ProcessApi processApi; private final ErrorApi errorApi; - public Consumer> createCosysDocument() { - return message -> { - try { - log.info("Processing generate document request from eventbus"); - final GenerateDocument document = message.getPayload(); - log.debug("Generate document request: {}", document); - this.createDocumentInPort.createDocument(document); - this.processApi.correlateMessage( - message.getHeaders().get(DIGIWF_PROCESS_INSTANCE_ID, String.class), - message.getHeaders().get(TYPE, String.class), - message.getHeaders().get(DIGIWF_INTEGRATION_NAME, String.class), - Map.of("status", true)); - } catch (final BpmnError bpmnError) { - this.errorApi.handleBpmnError(message.getHeaders(), bpmnError); - } catch (final ValidationException validationException) { - this.errorApi.handleBpmnError(message.getHeaders(), new BpmnError("VALIDATION_ERROR", validationException.getMessage())); - } catch (final IncidentError incidentError) { - this.errorApi.handleIncident(message.getHeaders(), incidentError); - } - }; + @Deprecated + public Consumer> createCosysDocument() { + return message -> withErrorHandling(message, () -> { + log.info("Processing generate document request from eventbus"); + final GenerateDocumentPresignedUrlsDTO document = message.getPayload(); + log.debug("Generate document request: {}", document); + this.createDocumentInPort.createDocument(document, document.getDocumentStorageUrls()); + this.correlateMessage( + message.getHeaders(), + Map.of("status", true) + ); + }); } + public Consumer> createCosysDocumentV2() { + return message -> withErrorHandling(message, () -> { + log.info("Processing generate document request from eventbus"); + final GenerateDocumentDTO document = message.getPayload(); + log.debug("Generate document request: {}", document); + this.createDocumentInPort.createDocument(document, document.getFileContext(), document.getFilePath()); + this.correlateMessage( + message.getHeaders(), + Map.of("status", true) + ); + }); + } + + private void withErrorHandling(final Message message, final Runnable runnable) { + try { + runnable.run(); + } catch (final BpmnError bpmnError) { + this.errorApi.handleBpmnError(message.getHeaders(), bpmnError); + } catch (final ValidationException validationException) { + this.errorApi.handleBpmnError(message.getHeaders(), new BpmnError("VALIDATION_ERROR", validationException.getMessage())); + } catch (final IncidentError incidentError) { + this.errorApi.handleIncident(message.getHeaders(), incidentError); + } + } + + private void correlateMessage(final Map originMessageHeaders, final Map message) { + String processInstanceId = Objects.requireNonNull(originMessageHeaders.get(DIGIWF_PROCESS_INSTANCE_ID).toString()); + String type = Objects.requireNonNull(originMessageHeaders.get(TYPE).toString()); + String integrationName = Objects.requireNonNull(originMessageHeaders.get(DIGIWF_INTEGRATION_NAME).toString()); + log.info("sending response message for process {}: {}", processInstanceId, message); + this.processApi.correlateMessage(processInstanceId, type, integrationName, message); + } } diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java index 7e384c8a6..a56ace752 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java @@ -2,17 +2,20 @@ import de.muenchen.oss.digiwf.cosys.integration.application.port.out.SaveFileToStorageOutPort; import de.muenchen.oss.digiwf.cosys.integration.domain.model.DocumentStorageUrl; -import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageClientErrorException; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageException; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageServerErrorException; +import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFileRepository; import de.muenchen.oss.digiwf.s3.integration.client.repository.transfer.S3FileTransferRepository; import de.muenchen.oss.digiwf.s3.integration.client.service.FileService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import lombok.val; import org.springframework.util.unit.DataSize; +import java.util.List; + @Slf4j @RequiredArgsConstructor public class S3Adapter implements SaveFileToStorageOutPort { @@ -20,13 +23,17 @@ public class S3Adapter implements SaveFileToStorageOutPort { private static final String S3_FILE_SAVE_ERROR = "S3_FILE_SAVE_ERROR"; private static final String S3_FILE_SIZE_ERROR = "S3_FILE_SIZE_ERROR"; private final S3FileTransferRepository s3FileTransferRepository; + private final DocumentStorageFileRepository documentStorageFileRepository; private final FileService fileService; @Override - public void saveDocumentInStorage(final GenerateDocument generateDocument, final byte[] data) { + public void saveDocumentInStorage( + final List documentStorageUrls, + final byte[] data + ) { try { validateFileSize(data); - for (final DocumentStorageUrl presignedUrl : generateDocument.getDocumentStorageUrls()) { + for (final DocumentStorageUrl presignedUrl : documentStorageUrls) { if (presignedUrl.getAction().equalsIgnoreCase("POST")) { this.s3FileTransferRepository.saveFile(presignedUrl.getUrl(), data); } else if (presignedUrl.getAction().equalsIgnoreCase("PUT")) { @@ -36,12 +43,28 @@ public void saveDocumentInStorage(final GenerateDocument generateDocument, final } } } catch (final DocumentStorageClientErrorException | DocumentStorageServerErrorException | - DocumentStorageException ex) { + DocumentStorageException ex) { log.debug("Document could not be saved.", ex); throw new BpmnError(S3_FILE_SAVE_ERROR, ex.getMessage()); } } + @Override + public void saveDocumentInStorage( + final String fileContext, + final String filePath, + final byte[] data + ) { + val fullFilePath = String.format("%s/%s", fileContext, filePath).replace("//", "/"); + try { + documentStorageFileRepository.saveFile(fullFilePath, data, 1, null); + } catch (DocumentStorageException | DocumentStorageClientErrorException | + DocumentStorageServerErrorException e) { + log.debug("Document could not be saved.", e); + throw new BpmnError(S3_FILE_SAVE_ERROR, e.getMessage()); + } + } + private void validateFileSize(final byte[] data) { if (!fileService.isValidFileSize(data)) throw new BpmnError(S3_FILE_SIZE_ERROR, diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/port/in/CreateDocumentInPort.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/port/in/CreateDocumentInPort.java index ae20fe234..f1c4358ad 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/port/in/CreateDocumentInPort.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/port/in/CreateDocumentInPort.java @@ -1,10 +1,24 @@ package de.muenchen.oss.digiwf.cosys.integration.application.port.in; +import de.muenchen.oss.digiwf.cosys.integration.domain.model.DocumentStorageUrl; import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; + +import java.util.List; public interface CreateDocumentInPort { - void createDocument(@Valid final GenerateDocument generateDocument); + @Deprecated + void createDocument( + @Valid final GenerateDocument generateDocument, + @Valid @Size(min = 1, max = 1) final List documentStorageUrls + ); + void createDocument( + @Valid final GenerateDocument generateDocument, + @NotBlank final String fileContext, + @NotBlank final String filePath + ); } diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/port/out/SaveFileToStorageOutPort.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/port/out/SaveFileToStorageOutPort.java index 87c140b2f..eebc73ef2 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/port/out/SaveFileToStorageOutPort.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/port/out/SaveFileToStorageOutPort.java @@ -1,9 +1,20 @@ package de.muenchen.oss.digiwf.cosys.integration.application.port.out; -import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; +import de.muenchen.oss.digiwf.cosys.integration.domain.model.DocumentStorageUrl; + +import java.util.List; public interface SaveFileToStorageOutPort { + @Deprecated + void saveDocumentInStorage( + final List documentStorageUrls, + final byte[] data + ); - void saveDocumentInStorage(final GenerateDocument generateDocument, final byte[] data); + void saveDocumentInStorage( + final String fileContext, + final String filePath, + final byte[] data + ); } diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCase.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCase.java index 4a6f061b8..388187d98 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCase.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCase.java @@ -3,11 +3,16 @@ import de.muenchen.oss.digiwf.cosys.integration.application.port.in.CreateDocumentInPort; import de.muenchen.oss.digiwf.cosys.integration.application.port.out.GenerateDocumentOutPort; import de.muenchen.oss.digiwf.cosys.integration.application.port.out.SaveFileToStorageOutPort; +import de.muenchen.oss.digiwf.cosys.integration.domain.model.DocumentStorageUrl; import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; import jakarta.validation.Valid; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import java.util.List; + @Slf4j @RequiredArgsConstructor @@ -22,11 +27,30 @@ public class CreateDocumentUseCase implements CreateDocumentInPort { * * @param generateDocument Data for generating documents */ + @Deprecated @Override - public void createDocument(@Valid final GenerateDocument generateDocument) { + public void createDocument( + @Valid final GenerateDocument generateDocument, + @Valid @Size(min = 1, max = 1) final List documentStorageUrls + ) { final byte[] data = this.generateDocumentOutPort.generateCosysDocument(generateDocument).block(); - this.saveFileToStorageOutPort.saveDocumentInStorage(generateDocument, data); + this.saveFileToStorageOutPort.saveDocumentInStorage(documentStorageUrls, data); } - + /** + * Generate a document in Cosys and save it in S3 using file context and path. + * + * @param generateDocument Data for generating documents + * @param fileContext File context to save document to + * @param filePath Path to save document to + */ + @Override + public void createDocument( + @Valid final GenerateDocument generateDocument, + @NotBlank final String fileContext, + @NotBlank final String filePath + ) { + final byte[] data = this.generateDocumentOutPort.generateCosysDocument(generateDocument).block(); + this.saveFileToStorageOutPort.saveDocumentInStorage(fileContext, filePath, data); + } } diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/domain/model/DocumentStorageUrl.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/domain/model/DocumentStorageUrl.java index cc6ffe4c2..16c901c2c 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/domain/model/DocumentStorageUrl.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/domain/model/DocumentStorageUrl.java @@ -7,6 +7,7 @@ import lombok.Data; import lombok.RequiredArgsConstructor; +@Deprecated @Data @Builder @RequiredArgsConstructor diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/domain/model/GenerateDocument.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/domain/model/GenerateDocument.java index 89b23ae24..59e0a191c 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/domain/model/GenerateDocument.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/domain/model/GenerateDocument.java @@ -5,16 +5,12 @@ package de.muenchen.oss.digiwf.cosys.integration.domain.model; import com.fasterxml.jackson.databind.JsonNode; -import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import java.util.List; - /** * Dto for generating documents. */ @@ -23,35 +19,26 @@ @AllArgsConstructor @NoArgsConstructor public class GenerateDocument { - - /** * Client that is used in cosys */ @NotBlank(message = "client is mandatory") - private String client; + protected String client; /** * Role that is used in cosys */ @NotBlank(message = "role is mandatory") - private String role; + protected String role; /** * The GUID of the target template to be filled */ @NotBlank(message = "guid is mandatory") - private String guid; + protected String guid; /** * All data to be filled into template */ - private JsonNode variables; - - /** - * A list of presigned urls that are used to save the cosys documents in a s3 storage - */ - @Valid - @Size(min = 1, max = 1) - private List documentStorageUrls; + protected JsonNode variables; } diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/domain/model/GenerateDocumentTest.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/GenerateDocumentPresignedUrlsDTOTest.java similarity index 76% rename from digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/domain/model/GenerateDocumentTest.java rename to digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/GenerateDocumentPresignedUrlsDTOTest.java index 828aa7c63..75b4d9dbf 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/domain/model/GenerateDocumentTest.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/GenerateDocumentPresignedUrlsDTOTest.java @@ -1,8 +1,10 @@ -package de.muenchen.oss.digiwf.cosys.integration.domain.model; +package de.muenchen.oss.digiwf.cosys.integration.adapter.in.streaming; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import de.muenchen.oss.digiwf.cosys.integration.domain.model.DocumentStorageUrl; +import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; import jakarta.validation.ConstraintViolation; import jakarta.validation.Validation; import jakarta.validation.Validator; @@ -20,7 +22,7 @@ * * @author ext.dl.moesle */ -public class GenerateDocumentTest { +public class GenerateDocumentPresignedUrlsDTOTest { private final Validator validator = Validation.buildDefaultValidatorFactory().getValidator(); @@ -32,13 +34,12 @@ void testGenerateDocumentValidationSuccess() { .action(action) .path("/path/to/file") .build(); - final GenerateDocument validDocument = GenerateDocument.builder() - .client("client") - .role("role") - .guid("guid") - .variables(jsonNode()) - .documentStorageUrls(List.of(validDocumentStorageUrl)) - .build(); + final GenerateDocumentPresignedUrlsDTO validDocument = new GenerateDocumentPresignedUrlsDTO( + "client", + "role", + "guid", + jsonNode(), + List.of(validDocumentStorageUrl)); final Set> v = this.validator.validate(validDocument); Assertions.assertTrue(v.isEmpty()); }); @@ -57,15 +58,15 @@ void testGenerateDocumentValidationFailsForMissingArgument() { @Test void testGenerateDocumentValidationFailsForNestedDocumentStorageUrls() { Set> violations; - final GenerateDocument.GenerateDocumentBuilder documentBuilder = GenerateDocument.builder() - .client("client") - .role("role") - .guid("guid") - .variables(jsonNode()); // documentStorageUrls are missing violations = this.validator.validate( - documentBuilder.documentStorageUrls(new ArrayList<>()).build() + new GenerateDocumentPresignedUrlsDTO( + "client", + "role", + "guid", + jsonNode(), + new ArrayList<>()) ); Assertions.assertEquals(1, violations.size()); @@ -76,7 +77,12 @@ void testGenerateDocumentValidationFailsForNestedDocumentStorageUrls() { .path("/path/to/file") .build(); violations = this.validator.validate( - documentBuilder.documentStorageUrls(List.of(documentStorageUrl, documentStorageUrl)).build() + new GenerateDocumentPresignedUrlsDTO( + "client", + "role", + "guid", + jsonNode(), + List.of(documentStorageUrl, documentStorageUrl)) ); Assertions.assertEquals(2, violations.size()); } diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapterTest.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapterTest.java index 6969933d2..76713c5c3 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapterTest.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapterTest.java @@ -2,7 +2,6 @@ import de.muenchen.oss.digiwf.cosys.integration.application.port.in.CreateDocumentInPort; import de.muenchen.oss.digiwf.cosys.integration.domain.model.DocumentStorageUrl; -import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; import de.muenchen.oss.digiwf.message.process.api.ErrorApi; import de.muenchen.oss.digiwf.message.process.api.ProcessApi; import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; @@ -31,16 +30,16 @@ class StreamingAdapterTest { private final DocumentStorageUrl documentStorageUrl = new DocumentStorageUrl("URL", "Path", "POST"); private final MessageHeaders messageHeaders = new MessageHeaders(Map.of(DIGIWF_PROCESS_INSTANCE_ID, this.processInstanceId, DIGIWF_INTEGRATION_NAME, "integrationName", TYPE, "type")); private final List listOfURls = List.of(documentStorageUrl); - private final GenerateDocument generateDocument = new GenerateDocument("Client", "Role", "guid", null, listOfURls); - Message message; + private final GenerateDocumentPresignedUrlsDTO generateDocument = new GenerateDocumentPresignedUrlsDTO("Client", "Role", "guid", null, listOfURls); + Message message; private StreamingAdapter streamingAdapter; @BeforeEach void setup() { this.streamingAdapter = new StreamingAdapter(createDocumentMock, processApiMock, errorApiMock); - this.message = new Message() { + this.message = new Message<>() { @Override - public GenerateDocument getPayload() { + public GenerateDocumentPresignedUrlsDTO getPayload() { return generateDocument; } @@ -54,13 +53,13 @@ public MessageHeaders getHeaders() { @Test void cosysIntegrationCreateDocumentSuccessfully() { streamingAdapter.createCosysDocument().accept(this.message); - verify(createDocumentMock).createDocument(generateDocument); + verify(createDocumentMock).createDocument(generateDocument, generateDocument.getDocumentStorageUrls()); verifyNoMoreInteractions(createDocumentMock); } @Test void cosysIntegrationHandlesValidationException() { - doThrow(new ValidationException("ValidationException")).when(createDocumentMock).createDocument(any()); + doThrow(new ValidationException("ValidationException")).when(createDocumentMock).createDocument(any(), any()); streamingAdapter.createCosysDocument().accept(this.message); final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); verify(errorApiMock).handleBpmnError(messageHeaderArgumentCaptor.capture(), any(BpmnError.class)); @@ -70,7 +69,7 @@ void cosysIntegrationHandlesValidationException() { @Test void cosysIntegrationHandlesBpmnError() { - doThrow(new BpmnError("S3_FILE_SAVE_ERROR", "BpmnErrorCode")).when(createDocumentMock).createDocument(any()); + doThrow(new BpmnError("S3_FILE_SAVE_ERROR", "BpmnErrorCode")).when(createDocumentMock).createDocument(any(), any()); streamingAdapter.createCosysDocument().accept(this.message); final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); verify(errorApiMock).handleBpmnError(messageHeaderArgumentCaptor.capture(), any(BpmnError.class)); @@ -80,7 +79,7 @@ void cosysIntegrationHandlesBpmnError() { @Test void cosysIntegrationIncidentError() { - doThrow(new IncidentError("IncidentError")).when(createDocumentMock).createDocument(any()); + doThrow(new IncidentError("IncidentError")).when(createDocumentMock).createDocument(any(), any()); streamingAdapter.createCosysDocument().accept(this.message); final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); verify(errorApiMock).handleIncident(messageHeaderArgumentCaptor.capture(), any(IncidentError.class)); diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/cosys/CosysAdapterTest.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/cosys/CosysAdapterTest.java index 8b57a009d..c68578407 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/cosys/CosysAdapterTest.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/cosys/CosysAdapterTest.java @@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.ObjectMapper; import de.muenchen.oss.digiwf.cosys.integration.api.GenerationApi; import de.muenchen.oss.digiwf.cosys.integration.configuration.CosysConfiguration; -import de.muenchen.oss.digiwf.cosys.integration.domain.model.DocumentStorageUrl; import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; import lombok.val; import org.junit.jupiter.api.BeforeEach; @@ -15,7 +14,6 @@ import java.io.File; import java.io.IOException; -import java.util.List; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; @@ -81,8 +79,7 @@ private GenerateDocument generateDocument() { "client", "role", "guid", - new ObjectMapper().readTree("{\"name\":\"John\", \"age\":30}"), - List.of(DocumentStorageUrl.builder().url("").build()) + new ObjectMapper().readTree("{\"name\":\"John\", \"age\":30}") ); } catch (JsonProcessingException e) { throw new RuntimeException(e); diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java index 5ee182be4..19bc24c32 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java @@ -1,11 +1,11 @@ package de.muenchen.oss.digiwf.cosys.integration.adapter.out.s3; import de.muenchen.oss.digiwf.cosys.integration.domain.model.DocumentStorageUrl; -import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageClientErrorException; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageException; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageServerErrorException; +import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFileRepository; import de.muenchen.oss.digiwf.s3.integration.client.repository.transfer.S3FileTransferRepository; import de.muenchen.oss.digiwf.s3.integration.client.service.FileService; import org.junit.jupiter.api.BeforeEach; @@ -27,11 +27,13 @@ class S3AdapterTest { private static final byte[] TOO_LARGE_FILE = (DATA + "!").getBytes(); // 1 Mbyte over allowed private final S3FileTransferRepository s3FileTransferRepository = mock(S3FileTransferRepository.class); + private final DocumentStorageFileRepository documentStorageFileRepository = mock(DocumentStorageFileRepository.class); private final FileService fileService = new FileService(null, ALLOWED_FILE_SIZE, ALLOWED_BATCH_SIZE); private S3Adapter s3Adapter; + @BeforeEach void setup() { - s3Adapter = new S3Adapter(s3FileTransferRepository, fileService); + s3Adapter = new S3Adapter(s3FileTransferRepository, documentStorageFileRepository, fileService); } @Test @@ -40,9 +42,7 @@ void saveDocumentInStorage() throws DocumentStorageException, DocumentStorageCli final DocumentStorageUrl documentStorageUrl = new DocumentStorageUrl("URL", "Path", "POST"); List listOfURls = List.of(documentStorageUrl); - final GenerateDocument generateDocument = new GenerateDocument("Client", "Role", "guid", null, listOfURls); - - s3Adapter.saveDocumentInStorage(generateDocument, DATA_AS_BYTE_ARRAY); + s3Adapter.saveDocumentInStorage(listOfURls, DATA_AS_BYTE_ARRAY); verify(s3FileTransferRepository).saveFile("URL", DATA_AS_BYTE_ARRAY); verifyNoMoreInteractions(s3FileTransferRepository); @@ -55,9 +55,7 @@ void updateDocumentInStorage() throws DocumentStorageException, DocumentStorageC final DocumentStorageUrl documentStorageUrl = new DocumentStorageUrl("URL", "Path", "PUT"); List listOfURls = List.of(documentStorageUrl); - final GenerateDocument generateDocument = new GenerateDocument("Client", "Role", "guid", null, listOfURls); - - s3Adapter.saveDocumentInStorage(generateDocument, DATA_AS_BYTE_ARRAY); + s3Adapter.saveDocumentInStorage(listOfURls, DATA_AS_BYTE_ARRAY); verify(s3FileTransferRepository).updateFile("URL", DATA_AS_BYTE_ARRAY); verifyNoMoreInteractions(s3FileTransferRepository); @@ -70,9 +68,7 @@ void saveDocumentInStorageWithGetRequest() { final DocumentStorageUrl documentStorageUrl = new DocumentStorageUrl("URL", "Path", "GET"); List listOfURls = List.of(documentStorageUrl); - final GenerateDocument generateDocument = new GenerateDocument("Client", "Role", "guid", null, listOfURls); - - BpmnError bpmnError = assertThrows(BpmnError.class, () -> s3Adapter.saveDocumentInStorage(generateDocument, DATA_AS_BYTE_ARRAY)); + BpmnError bpmnError = assertThrows(BpmnError.class, () -> s3Adapter.saveDocumentInStorage(listOfURls, DATA_AS_BYTE_ARRAY)); String expectedMessage = "Document storage action GET is not supported."; String actualMessage = bpmnError.getErrorMessage(); @@ -91,9 +87,7 @@ void saveDocumentInStorageWithThrowsDocumentStorageException() final DocumentStorageUrl documentStorageUrl = new DocumentStorageUrl("URL", "Path", "POST"); List listOfURls = List.of(documentStorageUrl); - final GenerateDocument generateDocument = new GenerateDocument("Client", "Role", "guid", null, listOfURls); - - BpmnError bpmnError = assertThrows(BpmnError.class, () -> s3Adapter.saveDocumentInStorage(generateDocument, DATA_AS_BYTE_ARRAY)); + BpmnError bpmnError = assertThrows(BpmnError.class, () -> s3Adapter.saveDocumentInStorage(listOfURls, DATA_AS_BYTE_ARRAY)); String expectedMessage = "DocumentStorageClientErrorException"; String actualMessage = bpmnError.getErrorMessage(); @@ -109,11 +103,10 @@ void testSaveDocumentInStorageThrowsBpmnErrorForInvalidFileSize() { final DocumentStorageUrl documentStorageUrl = new DocumentStorageUrl("URL", "Path", "POST"); final List listOfURls = List.of(documentStorageUrl); - final GenerateDocument generateDocument = new GenerateDocument("Client", "Role", "guid", null, listOfURls); String expectedMessage = String.format("Invalid file size %d MB. Allowed are %d MB.", DataSize.ofBytes(TOO_LARGE_FILE.length).toMegabytes(), ALLOWED_FILE_SIZE.toMegabytes()); - assertThatThrownBy(() -> s3Adapter.saveDocumentInStorage(generateDocument, TOO_LARGE_FILE)) + assertThatThrownBy(() -> s3Adapter.saveDocumentInStorage(listOfURls, TOO_LARGE_FILE)) .isInstanceOf(BpmnError.class) .extracting("errorCode", "errorMessage") .containsExactly("S3_FILE_SIZE_ERROR", expectedMessage); diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCaseTest.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCaseTest.java index dfe84c3d8..00408c7ee 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCaseTest.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCaseTest.java @@ -32,7 +32,7 @@ class CreateDocumentUseCaseTest { private final DocumentStorageUrl documentStorageUrl = new DocumentStorageUrl("URL", "Path", "POST"); private final List listOfURls = List.of(documentStorageUrl); - private final GenerateDocument generateDocument = new GenerateDocument("Client", "Role", "guid", new ObjectMapper().readTree("{\"key1\":\"value\"}"), listOfURls); + private final GenerateDocument generateDocument = new GenerateDocument("Client", "Role", "guid", new ObjectMapper().readTree("{\"key1\":\"value\"}")); CreateDocumentUseCaseTest() throws JsonProcessingException { } @@ -42,13 +42,12 @@ void createDocument() { when(generateDocumentOutPort.generateCosysDocument(any())).thenReturn(Mono.just("Document".getBytes())); final CreateDocumentUseCase useCase = new CreateDocumentUseCase(saveFileToStorageOutPort, generateDocumentOutPort); - useCase.createDocument(generateDocument); + useCase.createDocument(generateDocument, listOfURls); verify(generateDocumentOutPort).generateCosysDocument(generateDocument); verifyNoMoreInteractions(generateDocumentOutPort); - verify(saveFileToStorageOutPort).saveDocumentInStorage(generateDocument, "Document".getBytes()); + verify(saveFileToStorageOutPort).saveDocumentInStorage(listOfURls, "Document".getBytes()); verifyNoMoreInteractions(saveFileToStorageOutPort); } - } From 50deed2d5b443e211b5ff5292283b7dde082e41d Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Tue, 9 Jul 2024 13:15:25 +0200 Subject: [PATCH 02/12] cosys-integration add new code to tests --- .../integration/adapter/out/s3/S3Adapter.java | 1 + .../in/streaming/StreamingAdapterTest.java | 65 ++++++++++++++----- .../adapter/out/s3/S3AdapterTest.java | 33 ++++++++-- .../usecase/CreateDocumentUseCaseTest.java | 16 ++++- 4 files changed, 93 insertions(+), 22 deletions(-) diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java index a56ace752..373d098b8 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java @@ -57,6 +57,7 @@ public void saveDocumentInStorage( ) { val fullFilePath = String.format("%s/%s", fileContext, filePath).replace("//", "/"); try { + validateFileSize(data); documentStorageFileRepository.saveFile(fullFilePath, data, 1, null); } catch (DocumentStorageException | DocumentStorageClientErrorException | DocumentStorageServerErrorException e) { diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapterTest.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapterTest.java index 76713c5c3..bfa902d1a 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapterTest.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/in/streaming/StreamingAdapterTest.java @@ -30,17 +30,30 @@ class StreamingAdapterTest { private final DocumentStorageUrl documentStorageUrl = new DocumentStorageUrl("URL", "Path", "POST"); private final MessageHeaders messageHeaders = new MessageHeaders(Map.of(DIGIWF_PROCESS_INSTANCE_ID, this.processInstanceId, DIGIWF_INTEGRATION_NAME, "integrationName", TYPE, "type")); private final List listOfURls = List.of(documentStorageUrl); - private final GenerateDocumentPresignedUrlsDTO generateDocument = new GenerateDocumentPresignedUrlsDTO("Client", "Role", "guid", null, listOfURls); - Message message; + private final GenerateDocumentPresignedUrlsDTO generateDocumentPresignedUrlsDTO = new GenerateDocumentPresignedUrlsDTO("Client", "Role", "guid", null, listOfURls); + private final GenerateDocumentDTO generateDocumentDTO = new GenerateDocumentDTO("Client", "Role", "guid", null, "fileContext", "filePath.txt"); + Message messagePresignedUrls; + Message message; private StreamingAdapter streamingAdapter; @BeforeEach void setup() { this.streamingAdapter = new StreamingAdapter(createDocumentMock, processApiMock, errorApiMock); - this.message = new Message<>() { + this.messagePresignedUrls = new Message<>() { @Override public GenerateDocumentPresignedUrlsDTO getPayload() { - return generateDocument; + return generateDocumentPresignedUrlsDTO; + } + + @Override + public MessageHeaders getHeaders() { + return messageHeaders; + } + }; + this.message = new Message<>() { + @Override + public GenerateDocumentDTO getPayload() { + return generateDocumentDTO; } @Override @@ -52,39 +65,61 @@ public MessageHeaders getHeaders() { @Test void cosysIntegrationCreateDocumentSuccessfully() { - streamingAdapter.createCosysDocument().accept(this.message); - verify(createDocumentMock).createDocument(generateDocument, generateDocument.getDocumentStorageUrls()); + // deprecated + streamingAdapter.createCosysDocument().accept(this.messagePresignedUrls); + verify(createDocumentMock).createDocument(generateDocumentPresignedUrlsDTO, generateDocumentPresignedUrlsDTO.getDocumentStorageUrls()); + // v2 + streamingAdapter.createCosysDocumentV2().accept(this.message); + verify(createDocumentMock).createDocument(generateDocumentDTO, generateDocumentDTO.getFileContext(), generateDocumentDTO.getFilePath()); verifyNoMoreInteractions(createDocumentMock); } @Test void cosysIntegrationHandlesValidationException() { doThrow(new ValidationException("ValidationException")).when(createDocumentMock).createDocument(any(), any()); - streamingAdapter.createCosysDocument().accept(this.message); - final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + // deprecated + streamingAdapter.createCosysDocument().accept(this.messagePresignedUrls); + ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); verify(errorApiMock).handleBpmnError(messageHeaderArgumentCaptor.capture(), any(BpmnError.class)); - verifyNoMoreInteractions(errorApiMock); assertTrue(messageHeaderArgumentCaptor.getValue().containsKey(DIGIWF_PROCESS_INSTANCE_ID)); + // v2 + streamingAdapter.createCosysDocumentV2().accept(this.message); + messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + verify(errorApiMock).handleBpmnError(messageHeaderArgumentCaptor.capture(), any(BpmnError.class)); + assertTrue(messageHeaderArgumentCaptor.getValue().containsKey(DIGIWF_PROCESS_INSTANCE_ID)); + verifyNoMoreInteractions(errorApiMock); } @Test void cosysIntegrationHandlesBpmnError() { doThrow(new BpmnError("S3_FILE_SAVE_ERROR", "BpmnErrorCode")).when(createDocumentMock).createDocument(any(), any()); - streamingAdapter.createCosysDocument().accept(this.message); - final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + // deprecated + streamingAdapter.createCosysDocument().accept(this.messagePresignedUrls); + ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + verify(errorApiMock).handleBpmnError(messageHeaderArgumentCaptor.capture(), any(BpmnError.class)); + assertTrue(messageHeaderArgumentCaptor.getValue().containsKey(DIGIWF_PROCESS_INSTANCE_ID)); + // v2 + streamingAdapter.createCosysDocumentV2().accept(this.message); + messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); verify(errorApiMock).handleBpmnError(messageHeaderArgumentCaptor.capture(), any(BpmnError.class)); - verifyNoMoreInteractions(errorApiMock); assertTrue(messageHeaderArgumentCaptor.getValue().containsKey(DIGIWF_PROCESS_INSTANCE_ID)); + verifyNoMoreInteractions(errorApiMock); } @Test void cosysIntegrationIncidentError() { doThrow(new IncidentError("IncidentError")).when(createDocumentMock).createDocument(any(), any()); - streamingAdapter.createCosysDocument().accept(this.message); - final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + // deprecated + streamingAdapter.createCosysDocument().accept(this.messagePresignedUrls); + ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); verify(errorApiMock).handleIncident(messageHeaderArgumentCaptor.capture(), any(IncidentError.class)); - verifyNoMoreInteractions(errorApiMock); assertTrue(messageHeaderArgumentCaptor.getValue().containsKey(DIGIWF_PROCESS_INSTANCE_ID)); + // v2 + streamingAdapter.createCosysDocumentV2().accept(this.message); + messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + verify(errorApiMock).handleIncident(messageHeaderArgumentCaptor.capture(), any(IncidentError.class)); + assertTrue(messageHeaderArgumentCaptor.getValue().containsKey(DIGIWF_PROCESS_INSTANCE_ID)); + verifyNoMoreInteractions(errorApiMock); } } diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java index 19bc24c32..7599f7820 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java @@ -38,30 +38,31 @@ void setup() { @Test void saveDocumentInStorage() throws DocumentStorageException, DocumentStorageClientErrorException, DocumentStorageServerErrorException { - + // deprecated final DocumentStorageUrl documentStorageUrl = new DocumentStorageUrl("URL", "Path", "POST"); List listOfURls = List.of(documentStorageUrl); - s3Adapter.saveDocumentInStorage(listOfURls, DATA_AS_BYTE_ARRAY); - verify(s3FileTransferRepository).saveFile("URL", DATA_AS_BYTE_ARRAY); + // v2 + s3Adapter.saveDocumentInStorage("fileContext", "filePath.txt", DATA_AS_BYTE_ARRAY); + verify(documentStorageFileRepository).saveFile("fileContext/filePath.txt", DATA_AS_BYTE_ARRAY, 1, null); verifyNoMoreInteractions(s3FileTransferRepository); } + @Deprecated @Test void updateDocumentInStorage() throws DocumentStorageException, DocumentStorageClientErrorException, DocumentStorageServerErrorException { - + // deprecated final DocumentStorageUrl documentStorageUrl = new DocumentStorageUrl("URL", "Path", "PUT"); List listOfURls = List.of(documentStorageUrl); - s3Adapter.saveDocumentInStorage(listOfURls, DATA_AS_BYTE_ARRAY); - verify(s3FileTransferRepository).updateFile("URL", DATA_AS_BYTE_ARRAY); verifyNoMoreInteractions(s3FileTransferRepository); } + @Deprecated @Test void saveDocumentInStorageWithGetRequest() { @@ -81,6 +82,7 @@ void saveDocumentInStorageWithGetRequest() { @Test void saveDocumentInStorageWithThrowsDocumentStorageException() throws DocumentStorageException, DocumentStorageClientErrorException, DocumentStorageServerErrorException { + // deprecated doThrow(new DocumentStorageException("DocumentStorageClientErrorException", new Exception())).when(s3FileTransferRepository) .saveFile(anyString(), any()); @@ -95,11 +97,22 @@ void saveDocumentInStorageWithThrowsDocumentStorageException() assertEquals(expectedMessage, actualMessage); assertEquals("S3_FILE_SAVE_ERROR", bpmnError.getErrorCode()); + // v2 + doThrow(new DocumentStorageException("DocumentStorageClientErrorException", new Exception())).when(documentStorageFileRepository) + .saveFile(anyString(), any(), eq(1), isNull()); + bpmnError = assertThrows(BpmnError.class, () -> s3Adapter.saveDocumentInStorage("fileContext", "filePath.txt", DATA_AS_BYTE_ARRAY)); + expectedMessage = "DocumentStorageClientErrorException"; + actualMessage = bpmnError.getErrorMessage(); + + assertEquals(expectedMessage, actualMessage); + + assertEquals("S3_FILE_SAVE_ERROR", bpmnError.getErrorCode()); } @Test void testSaveDocumentInStorageThrowsBpmnErrorForInvalidFileSize() { + // deprecated final DocumentStorageUrl documentStorageUrl = new DocumentStorageUrl("URL", "Path", "POST"); final List listOfURls = List.of(documentStorageUrl); @@ -110,6 +123,14 @@ void testSaveDocumentInStorageThrowsBpmnErrorForInvalidFileSize() { .isInstanceOf(BpmnError.class) .extracting("errorCode", "errorMessage") .containsExactly("S3_FILE_SIZE_ERROR", expectedMessage); + // v2 + expectedMessage = String.format("Invalid file size %d MB. Allowed are %d MB.", DataSize.ofBytes(TOO_LARGE_FILE.length).toMegabytes(), + ALLOWED_FILE_SIZE.toMegabytes()); + + assertThatThrownBy(() -> s3Adapter.saveDocumentInStorage("fileContext", "filePath.txt", TOO_LARGE_FILE)) + .isInstanceOf(BpmnError.class) + .extracting("errorCode", "errorMessage") + .containsExactly("S3_FILE_SIZE_ERROR", expectedMessage); } } diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCaseTest.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCaseTest.java index 00408c7ee..ac4bcc66e 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCaseTest.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/application/usecase/CreateDocumentUseCaseTest.java @@ -38,7 +38,7 @@ class CreateDocumentUseCaseTest { } @Test - void createDocument() { + void createDocumentPresignedUrls() { when(generateDocumentOutPort.generateCosysDocument(any())).thenReturn(Mono.just("Document".getBytes())); final CreateDocumentUseCase useCase = new CreateDocumentUseCase(saveFileToStorageOutPort, generateDocumentOutPort); @@ -50,4 +50,18 @@ void createDocument() { verify(saveFileToStorageOutPort).saveDocumentInStorage(listOfURls, "Document".getBytes()); verifyNoMoreInteractions(saveFileToStorageOutPort); } + + @Test + void createDocument() { + when(generateDocumentOutPort.generateCosysDocument(any())).thenReturn(Mono.just("Document".getBytes())); + + final CreateDocumentUseCase useCase = new CreateDocumentUseCase(saveFileToStorageOutPort, generateDocumentOutPort); + useCase.createDocument(generateDocument, "fileContext", "path.file"); + + verify(generateDocumentOutPort).generateCosysDocument(generateDocument); + verifyNoMoreInteractions(generateDocumentOutPort); + + verify(saveFileToStorageOutPort).saveDocumentInStorage("fileContext", "path.file", "Document".getBytes()); + verifyNoMoreInteractions(saveFileToStorageOutPort); + } } From bbc8d1ba16e603c2286f6ea7a03ae29c61fe503f Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Wed, 10 Jul 2024 07:00:22 +0200 Subject: [PATCH 03/12] mail-integration init endpoint without presigned url parameter --- .../adapter/in/streaming/BasicMailDto.java | 3 + .../in/streaming/MailWithLogoAndLinkDto.java | 4 +- .../in/streaming/StreamingAdapter.java | 2 + .../integration/adapter/out/s3/S3Adapter.java | 62 ++++++++++++++++++- .../port/out/LoadMailAttachmentOutPort.java | 4 ++ .../application/usecase/SendMailUseCase.java | 10 ++- .../integration/domain/model/BasicMail.java | 7 +++ .../domain/model/PresignedUrl.java | 1 + .../domain/model/TemplateMail.java | 4 +- .../integration/domain/model/TextMail.java | 4 +- ...ilWithLogoAndLinkStreamingAdapterTest.java | 4 ++ .../SendMailWithTextStreamingAdapterTest.java | 2 + .../adapter/out/s3/S3AdapterTest.java | 6 +- .../usecase/SendMailUseCaseTest.java | 6 ++ .../configuration/MailAutoConfiguration.java | 9 ++- 15 files changed, 116 insertions(+), 12 deletions(-) diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/BasicMailDto.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/BasicMailDto.java index 24498a4c1..a58fa173c 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/BasicMailDto.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/BasicMailDto.java @@ -44,6 +44,9 @@ public class BasicMailDto { private String replyTo; @Valid + @Deprecated private List attachments; + private String fileContext; + private String filePaths; } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkDto.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkDto.java index 0b3214112..b70c3d421 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkDto.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkDto.java @@ -43,8 +43,8 @@ public class MailWithLogoAndLinkDto extends BasicMailDto { */ private String buttonLink; - public MailWithLogoAndLinkDto(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, List attachments, String template, String text, String bottomBody, String buttonText, String buttonLink) { - super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments); + public MailWithLogoAndLinkDto(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, List attachments, String fileContext, String filePaths, String template, String text, String bottomBody, String buttonText, String buttonLink) { + super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments, fileContext, filePaths); this.template = template; this.text = text; this.bottomBody = bottomBody; diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapter.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapter.java index 4c099be75..378fb1bfc 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapter.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapter.java @@ -80,6 +80,8 @@ private TemplateMail convertToTemplateMail(BasicMailDto basicMail, String templa basicMail.getSubject(), basicMail.getReplyTo(), basicMail.getAttachments(), + basicMail.getFileContext(), + basicMail.getFilePaths(), template, content); } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java index e51f13dab..5d8752da3 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java @@ -7,18 +7,30 @@ import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageClientErrorException; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageException; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageServerErrorException; +import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFileRepository; +import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFolderRepository; import de.muenchen.oss.digiwf.s3.integration.client.repository.transfer.S3FileTransferRepository; import de.muenchen.oss.digiwf.s3.integration.client.service.FileService; import jakarta.mail.util.ByteArrayDataSource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.StringUtils; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; +import java.util.Set; + @Slf4j @RequiredArgsConstructor public class S3Adapter implements LoadMailAttachmentOutPort { + public static final String LOAD_FOLDER_FAILED = "LOAD_FOLDER_FAILED"; + public static final String LOAD_FILE_FAILED = "LOAD_FILE_FAILED"; private final S3FileTransferRepository s3FileTransferRepository; + private final DocumentStorageFileRepository documentStorageFileRepository; + private final DocumentStorageFolderRepository documentStorageFolderRepository; private final FileService fileService; @Override @@ -35,7 +47,55 @@ public FileAttachment loadAttachment(final PresignedUrl attachment) throws BpmnE } catch (final DocumentStorageException | DocumentStorageServerErrorException | DocumentStorageClientErrorException e) { log.debug("An attachment could not be loaded from presigned url: {}", attachment); - throw new BpmnError("LOAD_FILE_FAILED", "An attachment could not be loaded from presigned url: " + attachment); + throw new BpmnError(LOAD_FILE_FAILED, "An attachment could not be loaded from presigned url: " + attachment); + } + } + + @Override + public List loadAttachments(final String fileContext, final List filePaths) { + final List attachments = new ArrayList<>(); + filePaths.forEach(path -> { + final String fullPath = fileContext + "/" + path; + if (fullPath.endsWith("/")) { + attachments.addAll(getFilesFromFolder(fullPath)); + } else { + attachments.add(getFile(fullPath)); + } + }); + return attachments; + } + + private List getFilesFromFolder(final String folderPath) { + try { + final List contents = new ArrayList<>(); + final Set filepath; + filepath = documentStorageFolderRepository.getAllFilesInFolderRecursively(folderPath, null).block(); + if (Objects.isNull(filepath)) + throw new BpmnError(LOAD_FOLDER_FAILED, "An folder could not be loaded from url: " + folderPath); + filepath.forEach(file -> contents.add(getFile(file))); + return contents; + } catch (final DocumentStorageException | DocumentStorageServerErrorException | + DocumentStorageClientErrorException e) { + throw new BpmnError(LOAD_FOLDER_FAILED, "An folder could not be loaded from path: " + folderPath); + } + } + + private FileAttachment getFile(final String filePath) { + try { + final byte[] bytes; + bytes = this.documentStorageFileRepository.getFile(filePath, 3, null); + final String mimeType = fileService.detectFileType(bytes); + final String filename = FilenameUtils.getBaseName(filePath); + final ByteArrayDataSource file = new ByteArrayDataSource(bytes, mimeType); + + // check if mimeType exists + if (!fileService.isSupported(mimeType)) + throw new BpmnError("FILE_TYPE_NOT_SUPPORTED", "The type of this file is not supported: " + filePath); + + return new FileAttachment(filename, file); + } catch (final DocumentStorageException | DocumentStorageServerErrorException | + DocumentStorageClientErrorException e) { + throw new BpmnError(LOAD_FILE_FAILED, "An file could not be loaded from path: " + filePath); } } } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/out/LoadMailAttachmentOutPort.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/out/LoadMailAttachmentOutPort.java index f696f492a..7b2aca7be 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/out/LoadMailAttachmentOutPort.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/out/LoadMailAttachmentOutPort.java @@ -3,7 +3,11 @@ import de.muenchen.oss.digiwf.email.integration.domain.model.PresignedUrl; import de.muenchen.oss.digiwf.email.model.FileAttachment; +import java.util.List; + public interface LoadMailAttachmentOutPort { FileAttachment loadAttachment(final PresignedUrl attachment); + + List loadAttachments(final String fileContext, final List filePaths); } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCase.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCase.java index 808e49328..85097b08d 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCase.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCase.java @@ -15,6 +15,7 @@ import lombok.extern.slf4j.Slf4j; import lombok.val; import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.validation.annotation.Validated; import java.io.IOException; @@ -67,8 +68,13 @@ public void sendMailWithTemplate(@Valid final TemplateMail mail) throws BpmnErro private de.muenchen.oss.digiwf.email.model.Mail createMail(BasicMail mail) { // load Attachments - final List attachments = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(mail.getAttachments())) { + List attachments = new ArrayList<>(); + // new via paths + if (StringUtils.isNotBlank(mail.getFileContext()) && StringUtils.isNotBlank(mail.getFilePaths())) { + attachments = this.loadAttachmentOutPort.loadAttachments(mail.getFileContext(), mail.parseFilePaths()); + } + // deprecated via input presigned urls + else if (CollectionUtils.isNotEmpty(mail.getAttachments())) { for (val attachment : mail.getAttachments()) { attachments.add(this.loadAttachmentOutPort.loadAttachment(attachment)); } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/BasicMail.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/BasicMail.java index 049566822..9fe875e11 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/BasicMail.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/BasicMail.java @@ -43,4 +43,11 @@ public class BasicMail { @Valid private List attachments; + private String fileContext; + private String filePaths; + + public List parseFilePaths() { + return List.of(this.filePaths.split("[,;]")); + } + } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/PresignedUrl.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/PresignedUrl.java index a2613d7d2..330bbf5e2 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/PresignedUrl.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/PresignedUrl.java @@ -9,6 +9,7 @@ /** * Attachment File you want to get from the S3 storage. */ +@Deprecated @Data @RequiredArgsConstructor @AllArgsConstructor diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TemplateMail.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TemplateMail.java index 8627270a7..283fc81f2 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TemplateMail.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TemplateMail.java @@ -27,8 +27,8 @@ public class TemplateMail extends BasicMail { @NotEmpty(message = "No content given") private Map content; - public TemplateMail(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, List attachments, String template, Map content) { - super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments); + public TemplateMail(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, List attachments, String fileContext, String filePaths, String template, Map content) { + super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments, fileContext, filePaths); this.template = template; this.content = content; } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TextMail.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TextMail.java index f60351de3..2a90ff5b5 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TextMail.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TextMail.java @@ -21,8 +21,8 @@ public class TextMail extends BasicMail { @NotBlank(message = "No body given") private String body; - public TextMail(String receivers, String receiversCc, String receiversBcc, String subject, String body, String replyTo, List attachments) { - super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments); + public TextMail(String receivers, String receiversCc, String receiversBcc, String subject, String body, String replyTo, List attachments, String fileContext, String filePaths) { + super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments, fileContext, filePaths); this.body = body; } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkStreamingAdapterTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkStreamingAdapterTest.java index 79fddfddd..76f02f4af 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkStreamingAdapterTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkStreamingAdapterTest.java @@ -28,6 +28,8 @@ class SendMailWithLogoAndLinkStreamingAdapterTest extends StreamingAdapterTestBa "Test Mail", "digiwf@muenchen.de", null, + null, + null, "template", "text", "bottomBody", @@ -62,6 +64,8 @@ void testEmailIntegrationSendsMailSuccessfully() { "Test Mail", "digiwf@muenchen.de", null, + null, + null, "template", Map.of("mail", mailWithLogoAndLinkDto) ); diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextStreamingAdapterTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextStreamingAdapterTest.java index 148c19c46..5b2b4b79e 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextStreamingAdapterTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextStreamingAdapterTest.java @@ -27,6 +27,8 @@ class SendMailWithTextStreamingAdapterTest extends StreamingAdapterTestBase { "Test Mail", "This is a test mail", "digiwf@muenchen.de", + null, + null, null ); diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java index e4d631ba7..484f608e8 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java @@ -6,6 +6,8 @@ import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageClientErrorException; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageException; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageServerErrorException; +import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFileRepository; +import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFolderRepository; import de.muenchen.oss.digiwf.s3.integration.client.repository.transfer.S3FileTransferRepository; import de.muenchen.oss.digiwf.s3.integration.client.service.FileService; import lombok.extern.slf4j.Slf4j; @@ -27,13 +29,15 @@ class S3AdapterTest { private final S3FileTransferRepository s3FileTransferRepository = mock(S3FileTransferRepository.class); + private final DocumentStorageFileRepository documentStorageFileRepository = mock(DocumentStorageFileRepository.class); + private final DocumentStorageFolderRepository documentStorageFolderRepository = mock(DocumentStorageFolderRepository.class); private final FileService fileService = new FileService(null, DataSize.ofMegabytes(50), DataSize.ofMegabytes(110)); private S3Adapter s3Adapter; @BeforeEach void setup() { - s3Adapter = new S3Adapter(s3FileTransferRepository, fileService); + s3Adapter = new S3Adapter(s3FileTransferRepository, documentStorageFileRepository, documentStorageFolderRepository, fileService); } @Test diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCaseTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCaseTest.java index c120d5dde..9682637ce 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCaseTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCaseTest.java @@ -33,6 +33,8 @@ class SendMailUseCaseTest { "Test Mail", "This is a test mail", "digiwf@muenchen.de", + null, + null, null ); private final MailWithLogoAndLinkDto mailWithLogoAndLinkDto = new MailWithLogoAndLinkDto( @@ -42,6 +44,8 @@ class SendMailUseCaseTest { "Test Mail", "digiwf@muenchen.de", null, + null, + null, "template", "text", "bottomBody", @@ -55,6 +59,8 @@ class SendMailUseCaseTest { "Test Mail", "digiwf@muenchen.de", null, + null, + null, "template", Map.of("mail", mailWithLogoAndLinkDto) ); diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java index 753d482d7..f36ac2c78 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java @@ -13,6 +13,8 @@ import de.muenchen.oss.digiwf.email.integration.infrastructure.MonitoringService; import de.muenchen.oss.digiwf.message.process.api.ErrorApi; import de.muenchen.oss.digiwf.message.process.api.ProcessApi; +import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFileRepository; +import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFolderRepository; import de.muenchen.oss.digiwf.s3.integration.client.repository.transfer.S3FileTransferRepository; import de.muenchen.oss.digiwf.s3.integration.client.service.FileService; import io.micrometer.core.instrument.MeterRegistry; @@ -54,8 +56,11 @@ public MonitoringService getMonitoringService(final MeterRegistry meterRegistry) @Bean @ConditionalOnMissingBean - public LoadMailAttachmentOutPort getLoadMailAttachmentPort(final S3FileTransferRepository s3FileTransferRepository, final FileService fileService) { - return new S3Adapter(s3FileTransferRepository, fileService); + public LoadMailAttachmentOutPort getLoadMailAttachmentPort(final S3FileTransferRepository s3FileTransferRepository, + final DocumentStorageFileRepository documentStorageFileRepository, + final DocumentStorageFolderRepository documentStorageFolderRepository, + final FileService fileService) { + return new S3Adapter(s3FileTransferRepository, documentStorageFileRepository, documentStorageFolderRepository, fileService); } @Bean From 88240b28e7d26821478a79ff53ff6e50ee5b51e6 Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Wed, 10 Jul 2024 09:29:25 +0200 Subject: [PATCH 04/12] docs endpoints without presigned url parameter --- .../cosys_generate_document_template_V02.json | 16 ++ .../email-integration/sendMailV02.json | 27 ++- .../email-integration/sendMailWithLogo.json | 27 ++- .../sendMailWithLogoAndLink.json | 27 ++- .../s3_create_presigned_url_template.json | 2 +- .../modeling/bausteine/integrationen/index.md | 180 ++++++++++-------- 6 files changed, 177 insertions(+), 102 deletions(-) diff --git a/docs/src/.vuepress/public/element-template/cosys_generate_document_template_V02.json b/docs/src/.vuepress/public/element-template/cosys_generate_document_template_V02.json index 854deb305..0b517666a 100644 --- a/docs/src/.vuepress/public/element-template/cosys_generate_document_template_V02.json +++ b/docs/src/.vuepress/public/element-template/cosys_generate_document_template_V02.json @@ -1,6 +1,7 @@ { "name": "Cosys: Dokument erstellen (alle Daten) (V02)", "id": "de.muenchen.digitalwf.templates.GenerateDocumentWithAllVariablesV02", + "version": 3, "appliesTo": [ "bpmn:CallActivity" ], @@ -43,6 +44,21 @@ "notEmpty": true } }, + { + "label": "File Context", + "type": "String", + "editable": false, + "value": "${app_file_context}", + "binding": { + "type": "camunda:in", + "expression": true, + "name": "fileContext", + "target": "fileContext" + }, + "constraints": { + "notEmpty": true + } + }, { "label": "Client", "type": "String", diff --git a/docs/src/.vuepress/public/element-template/email-integration/sendMailV02.json b/docs/src/.vuepress/public/element-template/email-integration/sendMailV02.json index f1bc1f267..d68cad660 100644 --- a/docs/src/.vuepress/public/element-template/email-integration/sendMailV02.json +++ b/docs/src/.vuepress/public/element-template/email-integration/sendMailV02.json @@ -1,6 +1,7 @@ { "name": "Mail: E-Mail senden", "id": "de.muenchen.digitalwf.templates.send-mail-V02", + "version": 2, "appliesTo": [ "bpmn:CallActivity" ], @@ -45,6 +46,21 @@ "notEmpty": true } }, + { + "label": "File Context", + "type": "String", + "editable": false, + "value": "${app_file_context}", + "binding": { + "type": "camunda:in", + "expression": true, + "name": "fileContext", + "target": "fileContext" + }, + "constraints": { + "notEmpty": true + } + }, { "label": "Receiver", "type": "String", @@ -174,15 +190,14 @@ } }, { - "label": "Attachment Paths (S3)", + "label": "Pfad(e) im S3", "type": "String", "value": "", - "description": "Array of presigned urls created with s3 integration", "binding": { "type": "camunda:inputParameter", "expression": true, - "name": "attachments", - "target": "attachments" + "name": "filePaths", + "target": "filePaths" }, "constraints": { "notEmpty": false @@ -190,11 +205,11 @@ }, { "type": "Hidden", - "value": "${attachments}", + "value": "${filePaths}", "binding": { "type": "camunda:in", "expression": true, - "target": "attachments" + "target": "filePaths" }, "constraints": { "notEmpty": true diff --git a/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogo.json b/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogo.json index 304180be1..1083ce44c 100644 --- a/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogo.json +++ b/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogo.json @@ -1,6 +1,7 @@ { "name": "Mail: E-Mail aus Vorlage mit Logo senden", "id": "de.muenchen.digitalwf.templates.send-email-with-logo", + "version": 2, "appliesTo": [ "bpmn:CallActivity" ], @@ -45,6 +46,21 @@ "notEmpty": true } }, + { + "label": "File Context", + "type": "String", + "editable": false, + "value": "${app_file_context}", + "binding": { + "type": "camunda:in", + "expression": true, + "name": "fileContext", + "target": "fileContext" + }, + "constraints": { + "notEmpty": true + } + }, { "label": "E-Mail Template", "type": "String", @@ -203,15 +219,14 @@ } }, { - "label": "Attachment Paths (S3)", + "label": "Pfad(e) im S3", "type": "String", "value": "", - "description": "Array of presigned urls created with s3 integration", "binding": { "type": "camunda:inputParameter", "expression": true, - "name": "attachments", - "target": "attachments" + "name": "filePaths", + "target": "filePaths" }, "constraints": { "notEmpty": false @@ -219,11 +234,11 @@ }, { "type": "Hidden", - "value": "${attachments}", + "value": "${filePaths}", "binding": { "type": "camunda:in", "expression": true, - "target": "attachments" + "target": "filePaths" }, "constraints": { "notEmpty": true diff --git a/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogoAndLink.json b/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogoAndLink.json index 08372e3af..7c716a8b5 100644 --- a/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogoAndLink.json +++ b/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogoAndLink.json @@ -1,6 +1,7 @@ { "name": "Mail: E-Mail aus Vorlage mit Logo und Link senden", "id": "de.muenchen.digitalwf.templates.send-email-with-logo-and-link", + "version": 2, "appliesTo": [ "bpmn:CallActivity" ], @@ -45,6 +46,21 @@ "notEmpty": true } }, + { + "label": "File Context", + "type": "String", + "editable": false, + "value": "${app_file_context}", + "binding": { + "type": "camunda:in", + "expression": true, + "name": "fileContext", + "target": "fileContext" + }, + "constraints": { + "notEmpty": true + } + }, { "label": "E-Mail Template", "type": "String", @@ -231,15 +247,14 @@ } }, { - "label": "Attachment Paths (S3)", + "label": "Pfad(e) im S3", "type": "String", "value": "", - "description": "Array of presigned urls created with s3 integration", "binding": { "type": "camunda:inputParameter", "expression": true, - "name": "attachments", - "target": "attachments" + "name": "filePaths", + "target": "filePaths" }, "constraints": { "notEmpty": false @@ -247,11 +262,11 @@ }, { "type": "Hidden", - "value": "${attachments}", + "value": "${filePaths}", "binding": { "type": "camunda:in", "expression": true, - "target": "attachments" + "target": "filePaths" }, "constraints": { "notEmpty": true diff --git a/docs/src/.vuepress/public/element-template/s3-integration/s3_create_presigned_url_template.json b/docs/src/.vuepress/public/element-template/s3-integration/s3_create_presigned_url_template.json index 4d1ce505e..2484044ae 100644 --- a/docs/src/.vuepress/public/element-template/s3-integration/s3_create_presigned_url_template.json +++ b/docs/src/.vuepress/public/element-template/s3-integration/s3_create_presigned_url_template.json @@ -1,5 +1,5 @@ { - "name": "S3: Presigned Url erstellen V02", + "name": "S3: Presigned Url erstellen V02 (Deprecated)", "id": "de.muenchen.digitalwf.templates.S3CreatePresignedUrlTemplateV02", "appliesTo": [ "bpmn:CallActivity" diff --git a/docs/src/modeling/bausteine/integrationen/index.md b/docs/src/modeling/bausteine/integrationen/index.md index 16acc286e..c585d126d 100644 --- a/docs/src/modeling/bausteine/integrationen/index.md +++ b/docs/src/modeling/bausteine/integrationen/index.md @@ -1,19 +1,21 @@ # Integrationen -Integrationen können über eine Call Activity aufgerufen werden. Für die von der Plattform bereitgestellten Integrationen werden Element-Templates angeboten, die die Modellierung vereinfachen. +Integrationen können über eine Call Activity aufgerufen werden. Für die von der Plattform bereitgestellten Integrationen +werden Element-Templates angeboten, die die Modellierung vereinfachen. Eine vollständige Liste der verfügbaren Integrationen finden Sie unter [DigiWF Integrationen](/integrations/). ## Übergreifend -Alle Integrationen nutzen Basisinformationen aus dem Prozess und werden über ihren Namen im Connector identifiziert. Dazu werden von DigiWF -autom. mit den jeweiligen Element-Templates folgende Properties gesetzt. +Alle Integrationen nutzen Basisinformationen aus dem Prozess und werden über ihren Namen im Connector identifiziert. +Dazu werden von DigiWF +autom. mit den jeweiligen Element-Templates folgende Properties gesetzt. ### Allgemeine Properties -| Properties | Typ | Beschreibung | Erforderlich | -|---------------|--------|----------------------------|--------------| -| `type` | Header | Der Typ des Events. | Ja | -| `integration` | Header | Der Name der Integration. | Ja | +| Properties | Typ | Beschreibung | Erforderlich | +|---------------|--------|---------------------------|--------------| +| `type` | Header | Der Typ des Events. | Ja | +| `integration` | Header | Der Name der Integration. | Ja | ## CoSys @@ -26,14 +28,16 @@ Es werden alle Daten der Prozessinstanz an CoSys übergeben. **Properties** -| Property | Beschreibung | Beispiel | -|----------------------------|-----------------------------------------------------------------------------------------|--------------------------------------| -| Event Topic | Das Topic der CoSys-Integration | dwf-cosys-demo | -| Client | Der Name des CoSys-Clients | 9001 | -| Role | Der Name der CoSys-Role | TESTER, SB | -| Document Storage Urls (S3) | Zuvor generierte signierte URLs des S3-Service für die Ablage des generierten Dokumtens | ${presignedUrls} | -| GUID | Eindeutiger Bezeichner der CoSys-Vorlage | 519650b7-87c2-41a6-8527-7b095675b13f | -| Daten | Daten als JSON-Objekt, die in das Dokument eingemischt werden sollten | ${data} | +| Property | Beschreibung | Beispiel | +|---------------------------------------------|-----------------------------------------------------------------------------------------|--------------------------------------| +| Event Topic | Das Topic der CoSys-Integration | dwf-cosys-demo | +| Client | Der Name des CoSys-Clients | 9001 | +| Role | Der Name der CoSys-Role | TESTER, SB | +| ~~Document Storage Urls (S3)~~ (Deprecated) | Zuvor generierte signierte URLs des S3-Service für die Ablage des generierten Dokumtens | ${presignedUrls} | +| File Context | File-Context des Prozesses. Wird als Prefix für die folgenden Pfade verwendet. | `${app_file_context}` | +| Pfad im S3 | Dateipfad, an dem das generierte Dokument abgelegt werden soll. | `test2/datei.pdf` | +| GUID | Eindeutiger Bezeichner der CoSys-Vorlage | 519650b7-87c2-41a6-8527-7b095675b13f | +| Daten | Daten als JSON-Objekt, die in das Dokument eingemischt werden sollten | ${data} | ### CoSys: Dokument erstellen @@ -41,14 +45,16 @@ Die Daten, die an CoSys übergeben werden, müssen zuvor definiert werden. **Properties** -| Property | Beschreibung | Beispiel | -|----------------------------|-----------------------------------------------------------------------------------------|--------------------------------------| -| Event Topic | Das Topic der CoSys-Integration | dwf-cosys-demo | -| Client | Der Name des CoSys-Clients | 9001 | -| Role | Der Name der CoSys-Role | TESTER | -| Document Storage Urls (S3) | Zuvor generierte signierte URLs des S3-Service für die Ablage des generierten Dokumtens | ${presignedUrls} | -| GUID | Eindeutiger Bezeichner der CoSys-Vorlage | 519650b7-87c2-41a6-8527-7b095675b13f | -| Daten | Daten als JSON-Objekt, die in das Dokument eingemischt werden sollten | ${data} | +| Property | Beschreibung | Beispiel | +|---------------------------------------------|-----------------------------------------------------------------------------------------|--------------------------------------| +| Event Topic | Das Topic der CoSys-Integration | dwf-cosys-demo | +| Client | Der Name des CoSys-Clients | 9001 | +| Role | Der Name der CoSys-Role | TESTER | +| ~~Document Storage Urls (S3)~~ (Deprecated) | Zuvor generierte signierte URLs des S3-Service für die Ablage des generierten Dokumtens | ${presignedUrls} | +| File Context | File-Context des Prozesses. Wird als Prefix für die folgenden Pfade verwendet. | `${app_file_context}` | +| Pfad im S3 | Dateipfad, an dem das generierte Dokument abgelegt werden soll. | `test2/datei.pdf` | +| GUID | Eindeutiger Bezeichner der CoSys-Vorlage | 519650b7-87c2-41a6-8527-7b095675b13f | +| Daten | Daten als JSON-Objekt, die in das Dokument eingemischt werden sollten | ${data} | ## E-Mail @@ -61,16 +67,17 @@ Um eine einfache E-Mail zu versenden, wird das Element Template `Mail: E-Mail se **Properties** -| Property | Beschreibung | Beispiel | -|-----------------------|------------------------------------------------------------------------------------|----------------------------| -| Receiver | E-Mail Adressen der Empfänger (Kommasepariert) | max.mustermann@example.com | -| Subject | Betreff | Test E-Mail | -| Body | E-Mail-Text | Das ist ein Test | -| Reply-To Address | E-Mail-Adresse, an die geantwortet werden soll | test@example.com | -| Receiver (CC) | Empfänger CC (Kommasepariert) | max.mustermann@example.com | -| Receiver (BCC) | Empfänger BCC (Kommasepariert) | max.mustermann@example.com | -| Attachment Paths (S3) | Von der S3-Integration generierte Presigned-URLs für das Herunterladen von Dateien | | - +| Property | Beschreibung | Beispiel | +|----------------------------------------|------------------------------------------------------------------------------------|----------------------------| +| Receiver | E-Mail Adressen der Empfänger (Kommasepariert) | max.mustermann@example.com | +| Subject | Betreff | Test E-Mail | +| Body | E-Mail-Text | Das ist ein Test | +| Reply-To Address | E-Mail-Adresse, an die geantwortet werden soll | test@example.com | +| Receiver (CC) | Empfänger CC (Kommasepariert) | max.mustermann@example.com | +| Receiver (BCC) | Empfänger BCC (Kommasepariert) | max.mustermann@example.com | +| ~~Attachment Paths (S3)~~ (Deprecated) | Von der S3-Integration generierte Presigned-URLs für das Herunterladen von Dateien | | +| File Context | File-Context des Prozesses. Wird als Prefix für die folgenden Pfade verwendet. | `${app_file_context}` | +| Pfad(e) im S3 | Semikolon separierte Liste an Datei- und Ordner-Pfaden. | `test/;test2/datei.pdf` | ### E-Mail mit Logo versenden @@ -82,16 +89,18 @@ zugestellten E-Mail korrekt angezeigt werden. **Properties** -| Property | Beschreibung | Beispiel | -|-----------------------|------------------------------------------------------------------------------------|----------------------------| -| Receiver | E-Mail Adressen der Empfänger (Kommasepariert) | max.mustermann@example.com | -| Subject | Betreff | Test E-Mail | -| E-Mail Text | E-Mail Text | Das ist ein Test | -| E-Mail Gruß | E-Mail Gruß | Mit freundlichen Grüßen | -| Reply-To Address | E-Mail Adresse, an die geantwortet werden soll | test@example.com | -| Receiver (CC) | Empfänger CC (Kommasepariert) | max.mustermann@example.com | -| Receiver (BCC) | Empfänger BCC (Kommasepariert) | max.mustermann@example.com | -| Attachment Paths (S3) | Von der S3 Integration generierte Presigned Urls für das herunterladen von Dateien | | +| Property | Beschreibung | Beispiel | +|----------------------------------------|------------------------------------------------------------------------------------|----------------------------| +| Receiver | E-Mail Adressen der Empfänger (Kommasepariert) | max.mustermann@example.com | +| Subject | Betreff | Test E-Mail | +| E-Mail Text | E-Mail Text | Das ist ein Test | +| E-Mail Gruß | E-Mail Gruß | Mit freundlichen Grüßen | +| Reply-To Address | E-Mail Adresse, an die geantwortet werden soll | test@example.com | +| Receiver (CC) | Empfänger CC (Kommasepariert) | max.mustermann@example.com | +| Receiver (BCC) | Empfänger BCC (Kommasepariert) | max.mustermann@example.com | +| ~~Attachment Paths (S3)~~ (Deprecated) | Von der S3-Integration generierte Presigned-URLs für das Herunterladen von Dateien | | +| File Context | File-Context des Prozesses. Wird als Prefix für die folgenden Pfade verwendet. | `${app_file_context}` | +| Pfad(e) im S3 | Semikolon separierte Liste an Datei- und Ordner-Pfaden. | `test/;test2/datei.pdf` | ### E-Mail mit Logo und Link versenden @@ -103,24 +112,26 @@ HTML zugestellten E-Mail korrekt angezeigt werden. **Properties** -| Property | Beschreibung | Beispiel | -|-----------------------|------------------------------------------------------------------------------------|----------------------------| -| Receiver | E-Mail Adressen der Empfänger (Kommasepariert) | max.mustermann@example.com | -| Subject | Betreff | Test E-Mail | -| E-Mail Text | E-Mail Text | Das ist ein Test | -| E-Mail Gruß | E-Mail Gruß | Mit freundlichen Grüßen | -| Link Bezeichnung | Bezeichung, die auf dem Button angezeigt wird | Beispielseite öffnen | -| Link URL | Link, auf den der Button verlinkt | example.com | -| Reply-To Address | E-Mail Adresse, an die geantwortet werden soll | test@example.com | -| Receiver (CC) | Empfänger CC (Kommasepariert) | max.mustermann@example.com | -| Receiver (BCC) | Empfänger BCC (Kommasepariert) | max.mustermann@example.com | -| Attachment Paths (S3) | Von der S3-Integration generierte Presigned-URLs für das Herunterladen von Dateien | | +| Property | Beschreibung | Beispiel | +|----------------------------------------|------------------------------------------------------------------------------------|----------------------------| +| Receiver | E-Mail Adressen der Empfänger (Kommasepariert) | max.mustermann@example.com | +| Subject | Betreff | Test E-Mail | +| E-Mail Text | E-Mail Text | Das ist ein Test | +| E-Mail Gruß | E-Mail Gruß | Mit freundlichen Grüßen | +| Link Bezeichnung | Bezeichung, die auf dem Button angezeigt wird | Beispielseite öffnen | +| Link URL | Link, auf den der Button verlinkt | example.com | +| Reply-To Address | E-Mail Adresse, an die geantwortet werden soll | test@example.com | +| Receiver (CC) | Empfänger CC (Kommasepariert) | max.mustermann@example.com | +| Receiver (BCC) | Empfänger BCC (Kommasepariert) | max.mustermann@example.com | +| ~~Attachment Paths (S3)~~ (Deprecated) | Von der S3-Integration generierte Presigned-URLs für das Herunterladen von Dateien | | +| File Context | File-Context des Prozesses. Wird als Prefix für die folgenden Pfade verwendet. | `${app_file_context}` | +| Pfad(e) im S3 | Semikolon separierte Liste an Datei- und Ordner-Pfaden. | `test/;test2/datei.pdf` | ## S3 Für die Interaktion mit dem S3-Dienst stehen verschiedene Templates zur Verfügung. -### S3: Presigned URL erstellen +### S3: Presigned URL erstellen (Deprecated) **Properties** @@ -284,9 +295,9 @@ Um eine einfache Chat-Anfrage durchzuführen, müssen die folgenden Daten an die #### Properties -| Properties | Typ | Beschreibung | Erforderlich | -|---------------|--------|---------------------------------------------------------------|--------------| -| `prompt` | String | Generische Anfrage an das Sprachmodell. | Ja | +| Properties | Typ | Beschreibung | Erforderlich | +|------------|--------|-----------------------------------------|--------------| +| `prompt` | String | Generische Anfrage an das Sprachmodell. | Ja | ### Übersetzung @@ -294,10 +305,10 @@ Um einen Text übersetzen zu lassen, müssen Sie die folgenden Daten an die Open #### Properties -| Properties | Typ | Beschreibung | Erforderlich | -|---------------|--------|---------------------------------------------------------------|--------------| -| `text` | String | Der zu übersetzende Text. | Ja | -| `language` | String | Sprache, in die übersetzt werden soll. | Ja | +| Properties | Typ | Beschreibung | Erforderlich | +|------------|--------|----------------------------------------|--------------| +| `text` | String | Der zu übersetzende Text. | Ja | +| `language` | String | Sprache, in die übersetzt werden soll. | Ja | ### Zusammenfassung @@ -305,41 +316,44 @@ Um einen Text zusammenfassen zu lassen, müssen Sie die folgenden Daten an die O #### Properties -| Properties | Typ | Beschreibung | Erforderlich | -|---------------|--------|---------------------------------------------------------------|--------------| -| `text` | String | Der zu verkürzende Text. | Ja | -| `length` | Int | Ungefähre Länge des neuen Textes. | Ja | +| Properties | Typ | Beschreibung | Erforderlich | +|------------|--------|-----------------------------------|--------------| +| `text` | String | Der zu verkürzende Text. | Ja | +| `length` | Int | Ungefähre Länge des neuen Textes. | Ja | ### Mail generieren -Um Mail-Texte in beliebigen Sprachen generieren zu lassen, müssen die folgenden Daten an die OpenAI-Integration übergeben werden: +Um Mail-Texte in beliebigen Sprachen generieren zu lassen, müssen die folgenden Daten an die OpenAI-Integration +übergeben werden: #### Properties -| Properties | Typ | Beschreibung | Erforderlich | -|---------------|--------|---------------------------------------------------------------|--------------| -| `json` | json | Daten für das Template. | Ja | -| `language` | String | Sprache des Mail-Textes. | Ja | -| `template` | String | Vorlage für den Mail-Text. | Ja | +| Properties | Typ | Beschreibung | Erforderlich | +|------------|--------|----------------------------|--------------| +| `json` | json | Daten für das Template. | Ja | +| `language` | String | Sprache des Mail-Textes. | Ja | +| `template` | String | Vorlage für den Mail-Text. | Ja | ### Daten extrahieren -Um Daten aus einem Text oder JSON extrahieren zu lassen, müssen die folgenden Daten an die OpenAI-Integration übergeben werden: +Um Daten aus einem Text oder JSON extrahieren zu lassen, müssen die folgenden Daten an die OpenAI-Integration übergeben +werden: #### Properties -| Properties | Typ | Beschreibung | Erforderlich | -|---------------|--------|---------------------------------------------------------------|--------------| -| `json` | String | Unstrukturierter Text oder unpassende JSON-Daten. | Ja | -| `fields` | String | Zu extrahierende Informationen als JSON-Felder getrennt. | Ja | +| Properties | Typ | Beschreibung | Erforderlich | +|------------|--------|----------------------------------------------------------|--------------| +| `json` | String | Unstrukturierter Text oder unpassende JSON-Daten. | Ja | +| `fields` | String | Zu extrahierende Informationen als JSON-Felder getrennt. | Ja | ### Klassifizierung -Um auf Basis von Daten einfache (Vor-)Entscheidungen zu treffen, müssen die folgenden Daten an die OpenAI-Integration übergeben werden: +Um auf Basis von Daten einfache (Vor-)Entscheidungen zu treffen, müssen die folgenden Daten an die OpenAI-Integration +übergeben werden: #### Properties -| Properties | Typ | Beschreibung | Erforderlich | -|---------------|--------|---------------------------------------------------------------|--------------| -| `json` | String | Unstrukturierter Text oder JSON-Daten als Basis. | Ja | -| `options` | String | Mögliche Ergebnisse für die Klassifizierung. | Ja | \ No newline at end of file +| Properties | Typ | Beschreibung | Erforderlich | +|------------|--------|--------------------------------------------------|--------------| +| `json` | String | Unstrukturierter Text oder JSON-Daten als Basis. | Ja | +| `options` | String | Mögliche Ergebnisse für die Klassifizierung. | Ja | \ No newline at end of file From 9957849dbd615cc3c5bba7aae20cd8911f94b2d4 Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Wed, 10 Jul 2024 09:37:15 +0200 Subject: [PATCH 05/12] cosys-integration update endpoint without presigned url parameter --- .../integration/adapter/out/s3/S3Adapter.java | 5 ++++- .../src/main/resources/application.yml | 17 ++++++++++++++++ .../configuration/CosysAutoConfiguration.java | 20 +++++++++++++++---- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java index 373d098b8..8b4247cf9 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/main/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3Adapter.java @@ -9,6 +9,7 @@ import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFileRepository; import de.muenchen.oss.digiwf.s3.integration.client.repository.transfer.S3FileTransferRepository; import de.muenchen.oss.digiwf.s3.integration.client.service.FileService; +import de.muenchen.oss.digiwf.s3.integration.client.service.S3StorageUrlProvider; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import lombok.val; @@ -25,6 +26,7 @@ public class S3Adapter implements SaveFileToStorageOutPort { private final S3FileTransferRepository s3FileTransferRepository; private final DocumentStorageFileRepository documentStorageFileRepository; private final FileService fileService; + private final S3StorageUrlProvider s3DomainService; @Override public void saveDocumentInStorage( @@ -55,10 +57,11 @@ public void saveDocumentInStorage( final String filePath, final byte[] data ) { + final String s3Storage = s3DomainService.getDefaultDocumentStorageUrl(); val fullFilePath = String.format("%s/%s", fileContext, filePath).replace("//", "/"); try { validateFileSize(data); - documentStorageFileRepository.saveFile(fullFilePath, data, 1, null); + documentStorageFileRepository.saveFile(fullFilePath, data, 1, s3Storage); } catch (DocumentStorageException | DocumentStorageClientErrorException | DocumentStorageServerErrorException e) { log.debug("Document could not be saved.", e); diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-service/src/main/resources/application.yml b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-service/src/main/resources/application.yml index a0886eb92..52ce65626 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-service/src/main/resources/application.yml +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-service/src/main/resources/application.yml @@ -1,6 +1,22 @@ spring: application: name: '@project.artifactId@' + security: + oauth2: + client: + provider: + keycloak: + issuer-uri: ${SSO_ISSUER_URL} + user-info-uri: ${SSO_BASE_URL}/realms/${SSO_REALM}/protocol/openid-connect/userinfo + jwk-set-uri: ${SSO_BASE_URL}/realms/${SSO_REALM}/protocol/openid-connect/certs + user-name-attribute: user_name + registration: + s3: + provider: keycloak + authorization-grant-type: client_credentials + client-id: ${SSO_S3_CLIENT_ID} + client-secret: ${SSO_S3_CLIENT_SECRET} + scope: email, profile, openid # needed for userInfo endpoint io: muenchendigital: @@ -20,6 +36,7 @@ digiwf: client: document-storage-url: '${DIGIWF_S3_HTTPAPI:http://localhost:8086}' max-file-size: ${S3_MAX_FILE_SIZE:100MB} + enable-security: true management: endpoint: diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-starter/src/main/java/de/muenchen/oss/digiwf/cosys/integration/configuration/CosysAutoConfiguration.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-starter/src/main/java/de/muenchen/oss/digiwf/cosys/integration/configuration/CosysAutoConfiguration.java index 176e8b406..d0be26f0c 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-starter/src/main/java/de/muenchen/oss/digiwf/cosys/integration/configuration/CosysAutoConfiguration.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-starter/src/main/java/de/muenchen/oss/digiwf/cosys/integration/configuration/CosysAutoConfiguration.java @@ -3,6 +3,8 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import de.muenchen.oss.digiwf.cosys.integration.ApiClient; +import de.muenchen.oss.digiwf.cosys.integration.adapter.in.streaming.GenerateDocumentDTO; +import de.muenchen.oss.digiwf.cosys.integration.adapter.in.streaming.GenerateDocumentPresignedUrlsDTO; import de.muenchen.oss.digiwf.cosys.integration.adapter.in.streaming.StreamingAdapter; import de.muenchen.oss.digiwf.cosys.integration.adapter.out.cosys.CosysAdapter; import de.muenchen.oss.digiwf.cosys.integration.adapter.out.s3.S3Adapter; @@ -11,12 +13,13 @@ import de.muenchen.oss.digiwf.cosys.integration.application.port.out.GenerateDocumentOutPort; import de.muenchen.oss.digiwf.cosys.integration.application.port.out.SaveFileToStorageOutPort; import de.muenchen.oss.digiwf.cosys.integration.application.usecase.CreateDocumentUseCase; -import de.muenchen.oss.digiwf.cosys.integration.domain.model.GenerateDocument; import de.muenchen.oss.digiwf.message.process.api.ErrorApi; import de.muenchen.oss.digiwf.message.process.api.ProcessApi; import de.muenchen.oss.digiwf.s3.integration.client.configuration.S3IntegrationClientAutoConfiguration; +import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFileRepository; import de.muenchen.oss.digiwf.s3.integration.client.repository.transfer.S3FileTransferRepository; import de.muenchen.oss.digiwf.s3.integration.client.service.FileService; +import de.muenchen.oss.digiwf.s3.integration.client.service.S3StorageUrlProvider; import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -106,8 +109,12 @@ public CreateDocumentInPort getCreateDocumentInPort(final SaveFileToStorageOutPo @Bean @ConditionalOnMissingBean - public SaveFileToStorageOutPort getSaveFileToStorageOutPort(final S3FileTransferRepository s3FileTransferRepository, final FileService fileService) { - return new S3Adapter(s3FileTransferRepository, fileService); + public SaveFileToStorageOutPort getSaveFileToStorageOutPort( + final S3FileTransferRepository s3FileTransferRepository, + final DocumentStorageFileRepository documentStorageFileRepository, + final FileService fileService, + final S3StorageUrlProvider s3DomainService) { + return new S3Adapter(s3FileTransferRepository, documentStorageFileRepository, fileService, s3DomainService); } @Bean @@ -123,7 +130,12 @@ public StreamingAdapter streamingAdapter(final CreateDocumentInPort createDocume } @Bean - public Consumer> createCosysDocument(final StreamingAdapter streamingAdapter) { + public Consumer> createCosysDocument(final StreamingAdapter streamingAdapter) { return streamingAdapter.createCosysDocument(); } + + @Bean + public Consumer> createCosysDocumentV2(final StreamingAdapter streamingAdapter) { + return streamingAdapter.createCosysDocumentV2(); + } } From c4d246ae31dbb764cc9936978a9888b0faa9df47 Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Wed, 10 Jul 2024 09:37:48 +0200 Subject: [PATCH 06/12] mail-integration update endpoint without presigned url parameter --- .../integration/adapter/out/s3/S3Adapter.java | 6 ++++-- .../adapter/out/s3/S3AdapterTest.java | 4 +++- .../src/main/resources/application.yml | 21 +++++++++++++++++++ .../configuration/MailAutoConfiguration.java | 6 ++++-- 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java index 5d8752da3..116ab278e 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java @@ -11,6 +11,7 @@ import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFolderRepository; import de.muenchen.oss.digiwf.s3.integration.client.repository.transfer.S3FileTransferRepository; import de.muenchen.oss.digiwf.s3.integration.client.service.FileService; +import de.muenchen.oss.digiwf.s3.integration.client.service.S3StorageUrlProvider; import jakarta.mail.util.ByteArrayDataSource; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -32,6 +33,7 @@ public class S3Adapter implements LoadMailAttachmentOutPort { private final DocumentStorageFileRepository documentStorageFileRepository; private final DocumentStorageFolderRepository documentStorageFolderRepository; private final FileService fileService; + private final S3StorageUrlProvider s3DomainService; @Override public FileAttachment loadAttachment(final PresignedUrl attachment) throws BpmnError { @@ -69,7 +71,7 @@ private List getFilesFromFolder(final String folderPath) { try { final List contents = new ArrayList<>(); final Set filepath; - filepath = documentStorageFolderRepository.getAllFilesInFolderRecursively(folderPath, null).block(); + filepath = documentStorageFolderRepository.getAllFilesInFolderRecursively(folderPath, s3DomainService.getDefaultDocumentStorageUrl()).block(); if (Objects.isNull(filepath)) throw new BpmnError(LOAD_FOLDER_FAILED, "An folder could not be loaded from url: " + folderPath); filepath.forEach(file -> contents.add(getFile(file))); @@ -83,7 +85,7 @@ private List getFilesFromFolder(final String folderPath) { private FileAttachment getFile(final String filePath) { try { final byte[] bytes; - bytes = this.documentStorageFileRepository.getFile(filePath, 3, null); + bytes = this.documentStorageFileRepository.getFile(filePath, 3, s3DomainService.getDefaultDocumentStorageUrl()); final String mimeType = fileService.detectFileType(bytes); final String filename = FilenameUtils.getBaseName(filePath); final ByteArrayDataSource file = new ByteArrayDataSource(bytes, mimeType); diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java index 484f608e8..f855b6857 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java @@ -10,6 +10,7 @@ import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFolderRepository; import de.muenchen.oss.digiwf.s3.integration.client.repository.transfer.S3FileTransferRepository; import de.muenchen.oss.digiwf.s3.integration.client.service.FileService; +import de.muenchen.oss.digiwf.s3.integration.client.service.S3StorageUrlProvider; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -31,13 +32,14 @@ class S3AdapterTest { private final S3FileTransferRepository s3FileTransferRepository = mock(S3FileTransferRepository.class); private final DocumentStorageFileRepository documentStorageFileRepository = mock(DocumentStorageFileRepository.class); private final DocumentStorageFolderRepository documentStorageFolderRepository = mock(DocumentStorageFolderRepository.class); + private final S3StorageUrlProvider s3DomainService = mock(S3StorageUrlProvider.class); private final FileService fileService = new FileService(null, DataSize.ofMegabytes(50), DataSize.ofMegabytes(110)); private S3Adapter s3Adapter; @BeforeEach void setup() { - s3Adapter = new S3Adapter(s3FileTransferRepository, documentStorageFileRepository, documentStorageFolderRepository, fileService); + s3Adapter = new S3Adapter(s3FileTransferRepository, documentStorageFileRepository, documentStorageFolderRepository, fileService, s3DomainService); } @Test diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-service/src/main/resources/application.yml b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-service/src/main/resources/application.yml index 3484b3d67..5eb7e4c68 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-service/src/main/resources/application.yml +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-service/src/main/resources/application.yml @@ -36,6 +36,22 @@ spring: fallback: true starttls: enable: true + security: + oauth2: + client: + provider: + keycloak: + issuer-uri: ${SSO_ISSUER_URL} + user-info-uri: ${SSO_BASE_URL}/realms/${SSO_REALM}/protocol/openid-connect/userinfo + jwk-set-uri: ${SSO_BASE_URL}/realms/${SSO_REALM}/protocol/openid-connect/certs + user-name-attribute: user_name + registration: + s3: + provider: keycloak + authorization-grant-type: client_credentials + client-id: ${SSO_DMS_CLIENT_ID} + client-secret: ${SSO_DMS_CLIENT_SECRET} + scope: email, profile, openid # needed for userInfo endpoint management: endpoints: web: @@ -54,3 +70,8 @@ io: bpmnErrorDestination: "dwf-connector-bpmnerror-${DIGIWF_ENV}" correlateMessageDestination: "dwf-connector-${DIGIWF_ENV}" deadLetterQueueDestination: "dwf-connector-incident-${DIGIWF_ENV}" +digiwf: + s3: + client: + enable-security: true + document-storage-url: "${DOCUMENT_STORAGE_HOST:http://localhost}:${DOCUMENT_STORAGE_PORT:8080}" diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java index f36ac2c78..129bcbdbb 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java @@ -17,6 +17,7 @@ import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFolderRepository; import de.muenchen.oss.digiwf.s3.integration.client.repository.transfer.S3FileTransferRepository; import de.muenchen.oss.digiwf.s3.integration.client.service.FileService; +import de.muenchen.oss.digiwf.s3.integration.client.service.S3StorageUrlProvider; import io.micrometer.core.instrument.MeterRegistry; import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -59,8 +60,9 @@ public MonitoringService getMonitoringService(final MeterRegistry meterRegistry) public LoadMailAttachmentOutPort getLoadMailAttachmentPort(final S3FileTransferRepository s3FileTransferRepository, final DocumentStorageFileRepository documentStorageFileRepository, final DocumentStorageFolderRepository documentStorageFolderRepository, - final FileService fileService) { - return new S3Adapter(s3FileTransferRepository, documentStorageFileRepository, documentStorageFolderRepository, fileService); + final FileService fileService, + final S3StorageUrlProvider s3DomainService) { + return new S3Adapter(s3FileTransferRepository, documentStorageFileRepository, documentStorageFolderRepository, fileService, s3DomainService); } @Bean From 7f5e444d0472ec69cad037cc6d7be5035cf10634 Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Wed, 10 Jul 2024 09:38:11 +0200 Subject: [PATCH 07/12] s3-integration mark streaming presigned url as deprecated --- .../s3/integration/adapter/in/streaming/StreamingAdapter.java | 1 + 1 file changed, 1 insertion(+) diff --git a/digiwf-integrations/digiwf-s3-integration/digiwf-s3-integration-core/src/main/java/de/muenchen/oss/digiwf/s3/integration/adapter/in/streaming/StreamingAdapter.java b/digiwf-integrations/digiwf-s3-integration/digiwf-s3-integration-core/src/main/java/de/muenchen/oss/digiwf/s3/integration/adapter/in/streaming/StreamingAdapter.java index 3183f026c..6f2cb1ccc 100644 --- a/digiwf-integrations/digiwf-s3-integration/digiwf-s3-integration-core/src/main/java/de/muenchen/oss/digiwf/s3/integration/adapter/in/streaming/StreamingAdapter.java +++ b/digiwf-integrations/digiwf-s3-integration/digiwf-s3-integration-core/src/main/java/de/muenchen/oss/digiwf/s3/integration/adapter/in/streaming/StreamingAdapter.java @@ -48,6 +48,7 @@ public class StreamingAdapter { * Pre-signed urls are created for all files inside a directory if the path is a directory. * The result is streamed to the digiwf-engine with a correlateMessage event. */ + @Deprecated public Consumer> createPresignedUrl() { return message -> { From 0d64c7283e6fe47d36ceea86f1263720432cc1cf Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Wed, 10 Jul 2024 09:38:35 +0200 Subject: [PATCH 08/12] update s3 example process without presigned url usage --- .../example/s3-integration/S3TestProzess.bpmn | 360 +++++++---------- .../S3TestProzessPresignedUrls.bpmn | 373 ++++++++++++++++++ .../s3-presigned.processconfig.json | 14 + 3 files changed, 537 insertions(+), 210 deletions(-) create mode 100644 digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzessPresignedUrls.bpmn create mode 100644 digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/s3-presigned.processconfig.json diff --git a/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzess.bpmn b/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzess.bpmn index 443146dba..7fe7d6320 100644 --- a/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzess.bpmn +++ b/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzess.bpmn @@ -3,33 +3,14 @@ - - - - - Flow_0vlh8va - - - - - Flow_1tpc9wl - - PT1H - - - - Flow_1tpc9wl - - - Flow_1q8bqmm - Flow_0qb6ikl + Flow_193g2tf var meinjson = { "FormField_Grusstext": execution.getVariable("FormField_Grusstext") , "EmpfaengerVorname": execution.getVariable("EmpfaengerVorname") , @@ -37,32 +18,8 @@ } execution.setVariable('cosysData', S(JSON.stringify(meinjson))); - - - - - - - - - - Flow_0qb6ikl - Flow_0815z5m - - - - - - - - - - - - Flow_0815z5m - Flow_1r63efb - - + + @@ -80,59 +37,50 @@ execution.setVariable('cosysData', S(JSON.stringify(meinjson))); test - Flow_19vunee - Flow_1owu1ho + Flow_0vlh8va + Flow_1q8bqmm - + + + + + + + + + + + + + + Flow_193g2tf + Flow_1478xit + + + + - + + Test - ${getPresignedUrls} + test/ - - - Flow_14m8yeo + Flow_1478xit Flow_19vunee - - - - - - - - - - Flow_1r63efb - Flow_14m8yeo - - - - - - - - - - Flow_1owu1ho - Flow_11928m9 - - - Flow_08fjmdo - - + @@ -150,11 +98,21 @@ execution.setVariable('cosysData', S(JSON.stringify(meinjson))); test - Flow_11928m9 - Flow_08fjmdo + Flow_19vunee + Flow_1owu1ho - - + + + + + + + + + Flow_1owu1ho + Flow_11928m9 + + @@ -172,111 +130,104 @@ execution.setVariable('cosysData', S(JSON.stringify(meinjson))); test - Flow_0vlh8va - Flow_1q8bqmm + Flow_11928m9 + Flow_08fjmdo - - S3 Integration erstellt eine presigned Url, unter der das Cosys Dokument gespeichert wird - - - - Cosys Dokument wird erstellt und im S3 gespeichert - - - - Versendet eine Email mit den Dateien, die von den Presigned Urls heruntergeladen wurden - - - - PresignedUrls für Mail-Versand erstellen + + + + + Flow_08fjmdo + + + + Flow_1tpc9wl + + PT1H + + + + Flow_1tpc9wl + + + + + Skript zum Aufbau der für Cosys benötigten Variablen - + Task zur Überprüfung, dass die hochgeladenen und die Cosys-Datei vorhanden sind - Löscht alle Dateien - Task zur Überprüfung, dass alle Dateien gelöscht wurden + + - - Skript zum Aufbau der für Cosys benötigten Variablen + + Cosys Dokument wird erstellt und im S3 gespeichert - + + + Versendet eine Email mit den hochgeladenen und von Cosys erstellten Dateien + + - + - - - - - - - - - - - - - + - + - + - - + + - - - - - - - + + + + + + - - - + + + - - - + + + - - - - - - - - - + - + - - + + - - - + + + + + + + @@ -284,90 +235,79 @@ execution.setVariable('cosysData', S(JSON.stringify(meinjson))); - - - - - - - - - - + - + - - + + - + + + + - + - + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + - - + + - + - + - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzessPresignedUrls.bpmn b/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzessPresignedUrls.bpmn new file mode 100644 index 000000000..af97d568b --- /dev/null +++ b/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzessPresignedUrls.bpmn @@ -0,0 +1,373 @@ + + + + + + + + + + + + + Flow_0vlh8va + + + + + + + Flow_1tpc9wl + + PT1H + + + + Flow_1tpc9wl + + + + + Flow_1q8bqmm + Flow_0qb6ikl + var meinjson = { +"FormField_Grusstext": execution.getVariable("FormField_Grusstext") , +"EmpfaengerVorname": execution.getVariable("EmpfaengerVorname") , +"AbsenderVorname": execution.getVariable("AbsenderVorname") +} +execution.setVariable('cosysData', S(JSON.stringify(meinjson))); + + + + + + + + + + + Flow_0qb6ikl + Flow_0815z5m + + + + + + + + + + + + Flow_0815z5m + Flow_1r63efb + + + + + + + false + + false + false + + + + false + + 4560db7e-64a3-49fc-ab6f-3d308d86dd9a + test + + + Flow_19vunee + Flow_1owu1ho + + + + + + + + + + + + + + + + Test + ${getPresignedUrls} + + + + + Flow_14m8yeo + Flow_19vunee + + + + + + + + + + + Flow_1r63efb + Flow_14m8yeo + + + + + + + + + + Flow_1owu1ho + Flow_11928m9 + + + Flow_08fjmdo + + + + + + + false + + false + false + + + + false + + 4560db7e-64a3-49fc-ab6f-3d308d86dd9a + test + + + Flow_11928m9 + Flow_08fjmdo + + + + + + + + false + + false + false + + + + false + + 4560db7e-64a3-49fc-ab6f-3d308d86dd9a + test + + + Flow_0vlh8va + Flow_1q8bqmm + + + S3 Integration erstellt eine presigned Url, unter der das Cosys Dokument gespeichert wird + + + + Cosys Dokument wird erstellt und im S3 gespeichert + + + + Versendet eine Email mit den Dateien, die von den Presigned Urls heruntergeladen wurden + + + + PresignedUrls für Mail-Versand erstellen + + + + Task zur Überprüfung, dass die hochgeladenen und die Cosys-Datei vorhanden sind + + + + Löscht alle Dateien + + + + Task zur Überprüfung, dass alle Dateien gelöscht wurden + + + + Skript zum Aufbau der für Cosys benötigten Variablen + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/s3-presigned.processconfig.json b/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/s3-presigned.processconfig.json new file mode 100644 index 000000000..951520ac6 --- /dev/null +++ b/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/s3-presigned.processconfig.json @@ -0,0 +1,14 @@ +{ + "key": "feature-s3-integration-presigned", + "statusDokument": "", + "configs": [ + { + "key": "app_file_paths_readonly", + "value": "" + }, + { + "key": "app_file_paths", + "value": "test" + } + ] +} From 2a309c93d5957fe840b97f4d321e67b92275a2b9 Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Wed, 10 Jul 2024 09:45:38 +0200 Subject: [PATCH 09/12] cosys-integration update endpoint without presigned url parameter --- .../cosys/integration/adapter/out/s3/S3AdapterTest.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java index 7599f7820..75e80c6dc 100644 --- a/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java +++ b/digiwf-integrations/digiwf-cosys-integration/digiwf-cosys-integration-core/src/test/java/de/muenchen/oss/digiwf/cosys/integration/adapter/out/s3/S3AdapterTest.java @@ -8,6 +8,7 @@ import de.muenchen.oss.digiwf.s3.integration.client.repository.DocumentStorageFileRepository; import de.muenchen.oss.digiwf.s3.integration.client.repository.transfer.S3FileTransferRepository; import de.muenchen.oss.digiwf.s3.integration.client.service.FileService; +import de.muenchen.oss.digiwf.s3.integration.client.service.S3StorageUrlProvider; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.util.unit.DataSize; @@ -28,12 +29,13 @@ class S3AdapterTest { private final S3FileTransferRepository s3FileTransferRepository = mock(S3FileTransferRepository.class); private final DocumentStorageFileRepository documentStorageFileRepository = mock(DocumentStorageFileRepository.class); + private final S3StorageUrlProvider s3DomainService = mock(S3StorageUrlProvider.class); private final FileService fileService = new FileService(null, ALLOWED_FILE_SIZE, ALLOWED_BATCH_SIZE); private S3Adapter s3Adapter; @BeforeEach void setup() { - s3Adapter = new S3Adapter(s3FileTransferRepository, documentStorageFileRepository, fileService); + s3Adapter = new S3Adapter(s3FileTransferRepository, documentStorageFileRepository, fileService, s3DomainService); } @Test From 5a8c6a3a0bd1a91210b674a2104da183b3581cc8 Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Wed, 10 Jul 2024 14:38:23 +0200 Subject: [PATCH 10/12] mail-integration update endpoint without presigned url --- .../example/s3-integration/S3TestProzess.bpmn | 2 +- .../adapter/in/streaming/BasicMailDto.java | 52 ----------- ....java => MailWithLogoAndLinkPathsDto.java} | 25 ++++-- .../MailWithLogoAndLinkPresignedDto.java | 71 +++++++++++++++ .../in/streaming/StreamingAdapter.java | 87 +++++++++++------- .../integration/adapter/out/s3/S3Adapter.java | 3 +- .../application/port/in/SendMailInPort.java | 13 --- .../port/in/SendMailPathsInPort.java | 13 +++ .../port/in/SendMailPresignedInPort.java | 13 +++ .../port/out/LoadMailAttachmentOutPort.java | 2 +- .../usecase/SendMailPathsUseCase.java | 89 +++++++++++++++++++ ...=> SendMailPresignedPresignedUseCase.java} | 24 +++-- .../integration/domain/model/BasicMail.java | 15 ---- .../domain/model/paths/BasicMailPaths.java | 33 +++++++ .../domain/model/paths/TemplateMailPaths.java | 35 ++++++++ .../domain/model/paths/TextMailPaths.java | 29 ++++++ .../model/presigned/BasicMailPresigned.java | 25 ++++++ .../model/{ => presigned}/PresignedUrl.java | 2 +- .../TemplateMailPresigned.java} | 12 +-- .../TextMailPresigned.java} | 11 ++- ...ilWithLogoAndLinkStreamingAdapterTest.java | 24 +++-- .../SendMailWithTextStreamingAdapterTest.java | 20 ++--- .../streaming/StreamingAdapterTestBase.java | 9 +- .../adapter/out/s3/S3AdapterTest.java | 2 +- ...java => SendMailPresignedUseCaseTest.java} | 40 ++++----- .../configuration/MailAutoConfiguration.java | 44 ++++++--- .../email-integration/sendMailV02.json | 2 +- .../email-integration/sendMailWithLogo.json | 2 +- .../sendMailWithLogoAndLink.json | 2 +- 29 files changed, 490 insertions(+), 211 deletions(-) delete mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/BasicMailDto.java rename digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/{MailWithLogoAndLinkDto.java => MailWithLogoAndLinkPathsDto.java} (51%) create mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkPresignedDto.java delete mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailInPort.java create mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailPathsInPort.java create mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailPresignedInPort.java create mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPathsUseCase.java rename digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/{SendMailUseCase.java => SendMailPresignedPresignedUseCase.java} (79%) create mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/BasicMailPaths.java create mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/TemplateMailPaths.java create mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/TextMailPaths.java create mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/BasicMailPresigned.java rename digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/{ => presigned}/PresignedUrl.java (92%) rename digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/{TemplateMail.java => presigned/TemplateMailPresigned.java} (60%) rename digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/{TextMail.java => presigned/TextMailPresigned.java} (55%) rename digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/{SendMailUseCaseTest.java => SendMailPresignedUseCaseTest.java} (82%) diff --git a/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzess.bpmn b/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzess.bpmn index 7fe7d6320..6967105ff 100644 --- a/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzess.bpmn +++ b/digiwf-engine/digiwf-engine-service/src/main/resources/prozesse/example/s3-integration/S3TestProzess.bpmn @@ -59,7 +59,7 @@ execution.setVariable('cosysData', S(JSON.stringify(meinjson))); - + diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/BasicMailDto.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/BasicMailDto.java deleted file mode 100644 index a58fa173c..000000000 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/BasicMailDto.java +++ /dev/null @@ -1,52 +0,0 @@ -package de.muenchen.oss.digiwf.email.integration.adapter.in.streaming; - -import de.muenchen.oss.digiwf.email.integration.domain.model.PresignedUrl; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotBlank; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.List; - -@AllArgsConstructor -@NoArgsConstructor -@Setter -@Getter -public class BasicMailDto { - - /** - * Receiver addresses of the mail, comma separated. - */ - @NotBlank(message = "No receivers given") - private String receivers; - - /** - * CC-Receiver addresses of the mail, comma separated. - */ - private String receiversCc; - - /** - * BCC-Receiver addresses of the mail, comma separated. - */ - private String receiversBcc; - - /** - * Subject of the mail. - */ - @NotBlank(message = "No subject given") - private String subject; - - /** - * Reply to address - */ - private String replyTo; - - @Valid - @Deprecated - private List attachments; - - private String fileContext; - private String filePaths; -} diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkDto.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkPathsDto.java similarity index 51% rename from digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkDto.java rename to digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkPathsDto.java index b70c3d421..7d1d9fa63 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkDto.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkPathsDto.java @@ -1,19 +1,20 @@ package de.muenchen.oss.digiwf.email.integration.adapter.in.streaming; -import de.muenchen.oss.digiwf.email.integration.domain.model.PresignedUrl; +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.BasicMailPaths; +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TemplateMailPaths; import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; -import java.util.List; +import java.util.Map; @AllArgsConstructor @NoArgsConstructor @Setter @Getter -public class MailWithLogoAndLinkDto extends BasicMailDto { +public class MailWithLogoAndLinkPathsDto extends BasicMailPaths { /** * Template of the mail. @@ -43,12 +44,26 @@ public class MailWithLogoAndLinkDto extends BasicMailDto { */ private String buttonLink; - public MailWithLogoAndLinkDto(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, List attachments, String fileContext, String filePaths, String template, String text, String bottomBody, String buttonText, String buttonLink) { - super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments, fileContext, filePaths); + public MailWithLogoAndLinkPathsDto(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, String fileContext, String filePaths, String template, String text, String bottomBody, String buttonText, String buttonLink) { + super(receivers, receiversCc, receiversBcc, subject, replyTo, fileContext, filePaths); this.template = template; this.text = text; this.bottomBody = bottomBody; this.buttonText = buttonText; this.buttonLink = buttonLink; } + + public TemplateMailPaths toTemplateMailPaths() { + return new TemplateMailPaths( + this.getReceivers(), + this.getReceiversCc(), + this.getReceiversBcc(), + this.getSubject(), + this.getReplyTo(), + this.getFileContext(), + this.getFilePaths(), + this.getTemplate(), + Map.of("mail", this) + ); + } } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkPresignedDto.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkPresignedDto.java new file mode 100644 index 000000000..789dc3288 --- /dev/null +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/MailWithLogoAndLinkPresignedDto.java @@ -0,0 +1,71 @@ +package de.muenchen.oss.digiwf.email.integration.adapter.in.streaming; + +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.BasicMailPresigned; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.PresignedUrl; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TemplateMailPresigned; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import java.util.List; +import java.util.Map; + +@Deprecated +@AllArgsConstructor +@NoArgsConstructor +@Setter +@Getter +public class MailWithLogoAndLinkPresignedDto extends BasicMailPresigned { + + /** + * Template of the mail. + */ + @NotBlank(message = "No template given") + private String template; + + /** + * Body of the mail. + */ + @NotBlank(message = "No text given") + private String text; + + /** + * Bottom body of the mail. + */ + @NotBlank(message = "No bottom body given") + private String bottomBody; + + /** + * Button text of the mail. + */ + private String buttonText; + + /** + * Button link of the mail. + */ + private String buttonLink; + + public MailWithLogoAndLinkPresignedDto(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, List attachments, String template, String text, String bottomBody, String buttonText, String buttonLink) { + super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments); + this.template = template; + this.text = text; + this.bottomBody = bottomBody; + this.buttonText = buttonText; + this.buttonLink = buttonLink; + } + + public TemplateMailPresigned toTemplateMailPresiged() { + return new TemplateMailPresigned( + this.getReceivers(), + this.getReceiversCc(), + this.getReceiversBcc(), + this.getSubject(), + this.getReplyTo(), + this.getAttachments(), + this.getTemplate(), + Map.of("mail", this) + ); + } +} diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapter.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapter.java index 378fb1bfc..153db19a8 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapter.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapter.java @@ -1,8 +1,9 @@ package de.muenchen.oss.digiwf.email.integration.adapter.in.streaming; -import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailInPort; -import de.muenchen.oss.digiwf.email.integration.domain.model.TemplateMail; -import de.muenchen.oss.digiwf.email.integration.domain.model.TextMail; +import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailPathsInPort; +import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailPresignedInPort; +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TextMailPaths; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TextMailPresigned; import de.muenchen.oss.digiwf.email.integration.infrastructure.MonitoringService; import de.muenchen.oss.digiwf.message.process.api.ErrorApi; import de.muenchen.oss.digiwf.message.process.api.ProcessApi; @@ -11,6 +12,7 @@ import jakarta.validation.ValidationException; import lombok.RequiredArgsConstructor; import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; import java.util.Map; import java.util.function.Consumer; @@ -22,36 +24,61 @@ public class StreamingAdapter { private final ProcessApi processApi; private final ErrorApi errorApi; - private final SendMailInPort mailInPort; + private final SendMailPresignedInPort sendMailPresignedInPort; + private final SendMailPathsInPort sendMailPathsInPort; private final MonitoringService monitoringService; - public Consumer> emailIntegration() { + @Deprecated + public Consumer> emailIntegration() { + return message -> { + withErrorHandling(message, () -> { + this.sendMailPresignedInPort.sendMailWithText(message.getPayload()); + this.correlateMessage( + message.getHeaders(), + Map.of("mailSentStatus", true) + ); + this.monitoringService.sendMailSucceeded(); + }); + }; + } + @Deprecated + public Consumer> sendMailWithLogoAndLink() { return message -> { withErrorHandling(message, () -> { - this.mailInPort.sendMailWithText(message.getPayload()); - this.processApi.correlateMessage( - message.getHeaders().get(DIGIWF_PROCESS_INSTANCE_ID, String.class), - message.getHeaders().get(TYPE, String.class), - message.getHeaders().get(DIGIWF_INTEGRATION_NAME, String.class), - Map.of("mailSentStatus", true)); + MailWithLogoAndLinkPresignedDto mail = message.getPayload(); + this.sendMailPresignedInPort.sendMailWithTemplate(mail.toTemplateMailPresiged()); + this.correlateMessage( + message.getHeaders(), + Map.of("mailSentStatus", true) + ); this.monitoringService.sendMailSucceeded(); }); }; } - public Consumer> sendMailWithLogoAndLink() { + public Consumer> sendTextMailV2() { + return message -> { + withErrorHandling(message, () -> { + this.sendMailPathsInPort.sendMailWithText(message.getPayload()); + this.correlateMessage( + message.getHeaders(), + Map.of("mailSentStatus", true) + ); + this.monitoringService.sendMailSucceeded(); + }); + }; + } + public Consumer> sendMailWithLogoAndLinkV2() { return message -> { withErrorHandling(message, () -> { - MailWithLogoAndLinkDto mail = message.getPayload(); - this.mailInPort.sendMailWithTemplate( - convertToTemplateMail(mail, mail.getTemplate(), Map.of("mail", mail))); - this.processApi.correlateMessage( - message.getHeaders().get(DIGIWF_PROCESS_INSTANCE_ID, String.class), - message.getHeaders().get(TYPE, String.class), - message.getHeaders().get(DIGIWF_INTEGRATION_NAME, String.class), - Map.of("mailSentStatus", true)); + MailWithLogoAndLinkPathsDto mail = message.getPayload(); + this.sendMailPathsInPort.sendMailWithTemplate(mail.toTemplateMailPaths()); + this.correlateMessage( + message.getHeaders(), + Map.of("mailSentStatus", true) + ); this.monitoringService.sendMailSucceeded(); }); }; @@ -72,18 +99,12 @@ private void withErrorHandling(final Message message, final Runnable runnable } } - private TemplateMail convertToTemplateMail(BasicMailDto basicMail, String template, Map content) { - return new TemplateMail( - basicMail.getReceivers(), - basicMail.getReceiversCc(), - basicMail.getReceiversBcc(), - basicMail.getSubject(), - basicMail.getReplyTo(), - basicMail.getAttachments(), - basicMail.getFileContext(), - basicMail.getFilePaths(), - template, - content); + public void correlateMessage(MessageHeaders headers, Map content) { + this.processApi.correlateMessage( + headers.get(DIGIWF_PROCESS_INSTANCE_ID, String.class), + headers.get(TYPE, String.class), + headers.get(DIGIWF_INTEGRATION_NAME, String.class), + content + ); } - } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java index 116ab278e..9db5ed647 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3Adapter.java @@ -1,7 +1,7 @@ package de.muenchen.oss.digiwf.email.integration.adapter.out.s3; import de.muenchen.oss.digiwf.email.integration.application.port.out.LoadMailAttachmentOutPort; -import de.muenchen.oss.digiwf.email.integration.domain.model.PresignedUrl; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.PresignedUrl; import de.muenchen.oss.digiwf.email.model.FileAttachment; import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageClientErrorException; @@ -35,6 +35,7 @@ public class S3Adapter implements LoadMailAttachmentOutPort { private final FileService fileService; private final S3StorageUrlProvider s3DomainService; + @Deprecated @Override public FileAttachment loadAttachment(final PresignedUrl attachment) throws BpmnError { try { diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailInPort.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailInPort.java deleted file mode 100644 index b5e36384a..000000000 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailInPort.java +++ /dev/null @@ -1,13 +0,0 @@ -package de.muenchen.oss.digiwf.email.integration.application.port.in; - -import de.muenchen.oss.digiwf.email.integration.domain.model.TemplateMail; -import de.muenchen.oss.digiwf.email.integration.domain.model.TextMail; -import jakarta.validation.Valid; - -public interface SendMailInPort { - - void sendMailWithText(@Valid final TextMail mail); - - void sendMailWithTemplate(@Valid final TemplateMail mail); - -} diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailPathsInPort.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailPathsInPort.java new file mode 100644 index 000000000..1dcfc9e40 --- /dev/null +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailPathsInPort.java @@ -0,0 +1,13 @@ +package de.muenchen.oss.digiwf.email.integration.application.port.in; + +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TemplateMailPaths; +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TextMailPaths; +import jakarta.validation.Valid; + +public interface SendMailPathsInPort { + + void sendMailWithText(@Valid final TextMailPaths mail); + + void sendMailWithTemplate(@Valid final TemplateMailPaths mail); + +} diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailPresignedInPort.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailPresignedInPort.java new file mode 100644 index 000000000..67555db65 --- /dev/null +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/in/SendMailPresignedInPort.java @@ -0,0 +1,13 @@ +package de.muenchen.oss.digiwf.email.integration.application.port.in; + +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TemplateMailPresigned; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TextMailPresigned; +import jakarta.validation.Valid; + +public interface SendMailPresignedInPort { + + void sendMailWithText(@Valid final TextMailPresigned mail); + + void sendMailWithTemplate(@Valid final TemplateMailPresigned mail); + +} diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/out/LoadMailAttachmentOutPort.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/out/LoadMailAttachmentOutPort.java index 7b2aca7be..16d3df094 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/out/LoadMailAttachmentOutPort.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/port/out/LoadMailAttachmentOutPort.java @@ -1,6 +1,6 @@ package de.muenchen.oss.digiwf.email.integration.application.port.out; -import de.muenchen.oss.digiwf.email.integration.domain.model.PresignedUrl; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.PresignedUrl; import de.muenchen.oss.digiwf.email.model.FileAttachment; import java.util.List; diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPathsUseCase.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPathsUseCase.java new file mode 100644 index 000000000..5057f4d7a --- /dev/null +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPathsUseCase.java @@ -0,0 +1,89 @@ +package de.muenchen.oss.digiwf.email.integration.application.usecase; + +import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailPathsInPort; +import de.muenchen.oss.digiwf.email.integration.application.port.out.LoadMailAttachmentOutPort; +import de.muenchen.oss.digiwf.email.integration.application.port.out.MailOutPort; +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.BasicMailPaths; +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TemplateMailPaths; +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TextMailPaths; +import de.muenchen.oss.digiwf.email.model.FileAttachment; +import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; +import freemarker.template.TemplateException; +import jakarta.mail.MessagingException; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; + +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Slf4j +@RequiredArgsConstructor +@Validated +public class SendMailPathsUseCase implements SendMailPathsInPort { + + private final LoadMailAttachmentOutPort loadAttachmentOutPort; + private final MailOutPort mailOutPort; + + /** + * Send a mail. + * + * @param mail mail that is sent + */ + @Override + public void sendMailWithText(@Valid final TextMailPaths mail) throws BpmnError { + de.muenchen.oss.digiwf.email.model.Mail mailModel = createMail(mail); + mailModel.setBody(mail.getBody()); + + this.sendMail(mailModel, null); + } + + @Override + public void sendMailWithTemplate(@Valid final TemplateMailPaths mail) throws BpmnError { + // get body from template + try { + Map content = new HashMap<>(mail.getContent()); + content.put("footer", "DigiWF 2.0
IT-Referat der Stadt München"); + String body = this.mailOutPort.getBodyFromTemplate(mail.getTemplate(), content); + + de.muenchen.oss.digiwf.email.model.Mail mailModel = createMail(mail); + mailModel.setBody(body); + mailModel.setHtmlBody(true); + + this.sendMail(mailModel, "templates/email-logo.png"); + + } catch (IOException ioException) { + throw new BpmnError("LOAD_TEMPLATE_FAILED", "The template " + mail.getTemplate() + " could not be loaded"); + } catch (TemplateException templateException) { + throw new BpmnError("TEMPLATE_MERGING_FAILED", templateException.getMessage()); + } + } + + private de.muenchen.oss.digiwf.email.model.Mail createMail(BasicMailPaths mail) { + // load Attachments + List attachments = loadAttachmentOutPort.loadAttachments(mail.getFileContext(), mail.parseFilePaths()); + + // send mail + return de.muenchen.oss.digiwf.email.model.Mail.builder() + .receivers(mail.getReceivers()) + .subject(mail.getSubject()) + .replyTo(mail.getReplyTo()) + .receiversCc(mail.getReceiversCc()) + .receiversBcc(mail.getReceiversBcc()) + .attachments(attachments) + .build(); + } + + private void sendMail(de.muenchen.oss.digiwf.email.model.Mail mailModel, String logoPath) throws BpmnError { + try { + this.mailOutPort.sendMail(mailModel, logoPath); + } catch (final MessagingException ex) { + log.error("Sending mail failed with exception: {}", ex.getMessage()); + throw new BpmnError("MAIL_SENDING_FAILED", ex.getMessage()); + } + } + +} diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCase.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedPresignedUseCase.java similarity index 79% rename from digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCase.java rename to digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedPresignedUseCase.java index 85097b08d..a15e33451 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCase.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedPresignedUseCase.java @@ -1,11 +1,11 @@ package de.muenchen.oss.digiwf.email.integration.application.usecase; -import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailInPort; +import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailPresignedInPort; import de.muenchen.oss.digiwf.email.integration.application.port.out.LoadMailAttachmentOutPort; import de.muenchen.oss.digiwf.email.integration.application.port.out.MailOutPort; -import de.muenchen.oss.digiwf.email.integration.domain.model.BasicMail; -import de.muenchen.oss.digiwf.email.integration.domain.model.TemplateMail; -import de.muenchen.oss.digiwf.email.integration.domain.model.TextMail; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.BasicMailPresigned; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TemplateMailPresigned; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TextMailPresigned; import de.muenchen.oss.digiwf.email.model.FileAttachment; import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; import freemarker.template.TemplateException; @@ -15,7 +15,6 @@ import lombok.extern.slf4j.Slf4j; import lombok.val; import org.apache.commons.collections4.CollectionUtils; -import org.apache.commons.lang3.StringUtils; import org.springframework.validation.annotation.Validated; import java.io.IOException; @@ -24,10 +23,11 @@ import java.util.List; import java.util.Map; +@Deprecated @Slf4j @RequiredArgsConstructor @Validated -public class SendMailUseCase implements SendMailInPort { +public class SendMailPresignedPresignedUseCase implements SendMailPresignedInPort { private final LoadMailAttachmentOutPort loadAttachmentOutPort; private final MailOutPort mailOutPort; @@ -38,7 +38,7 @@ public class SendMailUseCase implements SendMailInPort { * @param mail mail that is sent */ @Override - public void sendMailWithText(@Valid final TextMail mail) throws BpmnError { + public void sendMailWithText(@Valid final TextMailPresigned mail) throws BpmnError { de.muenchen.oss.digiwf.email.model.Mail mailModel = createMail(mail); mailModel.setBody(mail.getBody()); @@ -46,7 +46,7 @@ public void sendMailWithText(@Valid final TextMail mail) throws BpmnError { } @Override - public void sendMailWithTemplate(@Valid final TemplateMail mail) throws BpmnError { + public void sendMailWithTemplate(@Valid final TemplateMailPresigned mail) throws BpmnError { // get body from template try { Map content = new HashMap<>(mail.getContent()); @@ -66,15 +66,11 @@ public void sendMailWithTemplate(@Valid final TemplateMail mail) throws BpmnErro } } - private de.muenchen.oss.digiwf.email.model.Mail createMail(BasicMail mail) { + private de.muenchen.oss.digiwf.email.model.Mail createMail(BasicMailPresigned mail) { // load Attachments List attachments = new ArrayList<>(); - // new via paths - if (StringUtils.isNotBlank(mail.getFileContext()) && StringUtils.isNotBlank(mail.getFilePaths())) { - attachments = this.loadAttachmentOutPort.loadAttachments(mail.getFileContext(), mail.parseFilePaths()); - } // deprecated via input presigned urls - else if (CollectionUtils.isNotEmpty(mail.getAttachments())) { + if (CollectionUtils.isNotEmpty(mail.getAttachments())) { for (val attachment : mail.getAttachments()) { attachments.add(this.loadAttachmentOutPort.loadAttachment(attachment)); } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/BasicMail.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/BasicMail.java index 9fe875e11..ce87ad81b 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/BasicMail.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/BasicMail.java @@ -1,18 +1,14 @@ package de.muenchen.oss.digiwf.email.integration.domain.model; -import jakarta.validation.Valid; import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Data; import lombok.RequiredArgsConstructor; -import java.util.List; - @Data @RequiredArgsConstructor @AllArgsConstructor public class BasicMail { - /** * Receiver addresses of the mail, comma separated. */ @@ -39,15 +35,4 @@ public class BasicMail { * Reply to address */ private String replyTo; - - @Valid - private List attachments; - - private String fileContext; - private String filePaths; - - public List parseFilePaths() { - return List.of(this.filePaths.split("[,;]")); - } - } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/BasicMailPaths.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/BasicMailPaths.java new file mode 100644 index 000000000..5f8a49426 --- /dev/null +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/BasicMailPaths.java @@ -0,0 +1,33 @@ +package de.muenchen.oss.digiwf.email.integration.domain.model.paths; + +import de.muenchen.oss.digiwf.email.integration.domain.model.BasicMail; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; +import org.apache.commons.lang3.StringUtils; + +import java.util.List; + +@EqualsAndHashCode(callSuper = true) +@Data +@RequiredArgsConstructor +@AllArgsConstructor +public class BasicMailPaths extends BasicMail { + @NotBlank + private String fileContext; + private String filePaths; + + public BasicMailPaths(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, String fileContext, String filePaths) { + super(receivers, receiversCc, receiversBcc, subject, replyTo); + this.fileContext = fileContext; + this.filePaths = filePaths; + } + + public List parseFilePaths() { + if (StringUtils.isBlank(filePaths)) + return List.of(); + return List.of(filePaths.split("[,;]")); + } +} diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/TemplateMailPaths.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/TemplateMailPaths.java new file mode 100644 index 000000000..fc00ef1c7 --- /dev/null +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/TemplateMailPaths.java @@ -0,0 +1,35 @@ +package de.muenchen.oss.digiwf.email.integration.domain.model.paths; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; + +import java.util.Map; + +@EqualsAndHashCode(callSuper = true) +@Data +@RequiredArgsConstructor +@AllArgsConstructor +public class TemplateMailPaths extends BasicMailPaths { + + /** + * Template of the mail. + */ + @NotBlank(message = "No template given") + private String template; + + /** + * Bottom body of the mail. + */ + @NotEmpty(message = "No content given") + private Map content; + + public TemplateMailPaths(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, String fileContext, String filePaths, String template, Map content) { + super(receivers, receiversCc, receiversBcc, subject, replyTo, fileContext, filePaths); + this.template = template; + this.content = content; + } +} diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/TextMailPaths.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/TextMailPaths.java new file mode 100644 index 000000000..24520e117 --- /dev/null +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/paths/TextMailPaths.java @@ -0,0 +1,29 @@ +package de.muenchen.oss.digiwf.email.integration.domain.model.paths; + +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; + +/** + * Object contains all the information needed to send a mail. + */ +@EqualsAndHashCode(callSuper = true) +@Data +@RequiredArgsConstructor +@AllArgsConstructor +public class TextMailPaths extends BasicMailPaths { + + /** + * Body of the mail. + */ + @NotBlank(message = "No body given") + private String body; + + public TextMailPaths(String receivers, String receiversCc, String receiversBcc, String subject, String body, String replyTo, String fileContext, String filePath) { + super(receivers, receiversCc, receiversBcc, subject, replyTo, fileContext, filePath); + this.body = body; + } + +} diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/BasicMailPresigned.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/BasicMailPresigned.java new file mode 100644 index 000000000..a6b9d33cc --- /dev/null +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/BasicMailPresigned.java @@ -0,0 +1,25 @@ +package de.muenchen.oss.digiwf.email.integration.domain.model.presigned; + +import de.muenchen.oss.digiwf.email.integration.domain.model.BasicMail; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +@Deprecated +@EqualsAndHashCode(callSuper = true) +@Data +@RequiredArgsConstructor +@AllArgsConstructor +public class BasicMailPresigned extends BasicMail { + @Valid + private List attachments; + + public BasicMailPresigned(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, List attachments) { + super(receivers, receiversCc, receiversBcc, subject, replyTo); + this.attachments = attachments; + } +} diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/PresignedUrl.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/PresignedUrl.java similarity index 92% rename from digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/PresignedUrl.java rename to digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/PresignedUrl.java index 330bbf5e2..fb4c052bd 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/PresignedUrl.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/PresignedUrl.java @@ -1,4 +1,4 @@ -package de.muenchen.oss.digiwf.email.integration.domain.model; +package de.muenchen.oss.digiwf.email.integration.domain.model.presigned; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.Pattern; diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TemplateMail.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/TemplateMailPresigned.java similarity index 60% rename from digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TemplateMail.java rename to digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/TemplateMailPresigned.java index 283fc81f2..85b2c40ff 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TemplateMail.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/TemplateMailPresigned.java @@ -1,19 +1,21 @@ -package de.muenchen.oss.digiwf.email.integration.domain.model; +package de.muenchen.oss.digiwf.email.integration.domain.model.presigned; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotEmpty; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; import java.util.List; import java.util.Map; - +@Deprecated +@EqualsAndHashCode(callSuper = true) @Data @RequiredArgsConstructor @AllArgsConstructor -public class TemplateMail extends BasicMail { +public class TemplateMailPresigned extends BasicMailPresigned { /** * Template of the mail. @@ -27,8 +29,8 @@ public class TemplateMail extends BasicMail { @NotEmpty(message = "No content given") private Map content; - public TemplateMail(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, List attachments, String fileContext, String filePaths, String template, Map content) { - super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments, fileContext, filePaths); + public TemplateMailPresigned(String receivers, String receiversCc, String receiversBcc, String subject, String replyTo, List attachments, String template, Map content) { + super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments); this.template = template; this.content = content; } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TextMail.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/TextMailPresigned.java similarity index 55% rename from digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TextMail.java rename to digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/TextMailPresigned.java index 2a90ff5b5..75fb701f7 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/TextMail.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/domain/model/presigned/TextMailPresigned.java @@ -1,8 +1,9 @@ -package de.muenchen.oss.digiwf.email.integration.domain.model; +package de.muenchen.oss.digiwf.email.integration.domain.model.presigned; import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.RequiredArgsConstructor; import java.util.List; @@ -10,10 +11,12 @@ /** * Object contains all the information needed to send a mail. */ +@Deprecated +@EqualsAndHashCode(callSuper = true) @Data @RequiredArgsConstructor @AllArgsConstructor -public class TextMail extends BasicMail { +public class TextMailPresigned extends BasicMailPresigned { /** * Body of the mail. @@ -21,8 +24,8 @@ public class TextMail extends BasicMail { @NotBlank(message = "No body given") private String body; - public TextMail(String receivers, String receiversCc, String receiversBcc, String subject, String body, String replyTo, List attachments, String fileContext, String filePaths) { - super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments, fileContext, filePaths); + public TextMailPresigned(String receivers, String receiversCc, String receiversBcc, String subject, String body, String replyTo, List attachments) { + super(receivers, receiversCc, receiversBcc, subject, replyTo, attachments); this.body = body; } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkStreamingAdapterTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkStreamingAdapterTest.java index 76f02f4af..d568cb66a 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkStreamingAdapterTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkStreamingAdapterTest.java @@ -1,6 +1,6 @@ package de.muenchen.oss.digiwf.email.integration.adapter.in.streaming; -import de.muenchen.oss.digiwf.email.integration.domain.model.TemplateMail; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TemplateMailPresigned; import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; import de.muenchen.oss.digiwf.message.process.api.error.IncidentError; import jakarta.validation.ValidationException; @@ -21,15 +21,13 @@ class SendMailWithLogoAndLinkStreamingAdapterTest extends StreamingAdapterTestBase { - private final MailWithLogoAndLinkDto mailWithLogoAndLinkDto = new MailWithLogoAndLinkDto( + private final MailWithLogoAndLinkPresignedDto mailWithLogoAndLinkDto = new MailWithLogoAndLinkPresignedDto( "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", "receiverCC@muenchen.de", "receiverBCC@muenchen.de", "Test Mail", "digiwf@muenchen.de", null, - null, - null, "template", "text", "bottomBody", @@ -37,14 +35,14 @@ class SendMailWithLogoAndLinkStreamingAdapterTest extends StreamingAdapterTestBa "buttonLink" ); - private Message message; + private Message message; @BeforeEach void setup() { setupBase(); - this.message = new Message() { + this.message = new Message() { @Override - public MailWithLogoAndLinkDto getPayload() { + public MailWithLogoAndLinkPresignedDto getPayload() { return mailWithLogoAndLinkDto; } @@ -57,26 +55,24 @@ public MessageHeaders getHeaders() { @Test void testEmailIntegrationSendsMailSuccessfully() { - TemplateMail templateMail = new TemplateMail( + TemplateMailPresigned templateMail = new TemplateMailPresigned( "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", "receiverCC@muenchen.de", "receiverBCC@muenchen.de", "Test Mail", "digiwf@muenchen.de", null, - null, - null, "template", Map.of("mail", mailWithLogoAndLinkDto) ); streamingAdapter.sendMailWithLogoAndLink().accept(this.message); verify(monitoringServiceMock, times(1)).sendMailSucceeded(); - verify(sendMailInPortMock, times(1)).sendMailWithTemplate(templateMail); + verify(sendMailPresignedInPortMock, times(1)).sendMailWithTemplate(templateMail); } @Test void testEmailIntegrationHandlesValidationException() { - Mockito.doThrow(new ValidationException("Test ValidationException")).when(sendMailInPortMock).sendMailWithTemplate(any()); + Mockito.doThrow(new ValidationException("Test ValidationException")).when(sendMailPresignedInPortMock).sendMailWithTemplate(any()); streamingAdapter.sendMailWithLogoAndLink().accept(this.message); verify(monitoringServiceMock, times(1)).sendMailFailed(); final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); @@ -89,7 +85,7 @@ void testEmailIntegrationHandlesValidationException() { @Test void testEmailIntegrationHandlesBpmnError() { - Mockito.doThrow(new BpmnError("errorCode", "errorMessage")).when(sendMailInPortMock).sendMailWithTemplate(any()); + Mockito.doThrow(new BpmnError("errorCode", "errorMessage")).when(sendMailPresignedInPortMock).sendMailWithTemplate(any()); streamingAdapter.sendMailWithLogoAndLink().accept(this.message); verify(monitoringServiceMock, times(1)).sendMailFailed(); final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); @@ -102,7 +98,7 @@ void testEmailIntegrationHandlesBpmnError() { @Test void testEmailIntegrationHandlesIncidentError() { - Mockito.doThrow(new IncidentError("Error Message")).when(sendMailInPortMock).sendMailWithTemplate(any()); + Mockito.doThrow(new IncidentError("Error Message")).when(sendMailPresignedInPortMock).sendMailWithTemplate(any()); streamingAdapter.sendMailWithLogoAndLink().accept(this.message); verify(monitoringServiceMock, times(1)).sendMailFailed(); final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextStreamingAdapterTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextStreamingAdapterTest.java index 5b2b4b79e..0c48539ba 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextStreamingAdapterTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextStreamingAdapterTest.java @@ -1,6 +1,6 @@ package de.muenchen.oss.digiwf.email.integration.adapter.in.streaming; -import de.muenchen.oss.digiwf.email.integration.domain.model.TextMail; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TextMailPresigned; import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; import de.muenchen.oss.digiwf.message.process.api.error.IncidentError; import jakarta.validation.ValidationException; @@ -20,26 +20,24 @@ import static org.mockito.Mockito.verify; class SendMailWithTextStreamingAdapterTest extends StreamingAdapterTestBase { - private final TextMail mail = new TextMail( + private final TextMailPresigned mail = new TextMailPresigned( "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", "receiverCC@muenchen.de", "receiverBCC@muenchen.de", "Test Mail", "This is a test mail", "digiwf@muenchen.de", - null, - null, null ); - private Message message; + private Message message; @BeforeEach void setup() { setupBase(); - this.message = new Message() { + this.message = new Message() { @Override - public TextMail getPayload() { + public TextMailPresigned getPayload() { return mail; } @@ -54,12 +52,12 @@ public MessageHeaders getHeaders() { void testEmailIntegrationSendsMailSuccessfully() { streamingAdapter.emailIntegration().accept(this.message); verify(monitoringServiceMock, times(1)).sendMailSucceeded(); - verify(sendMailInPortMock, times(1)).sendMailWithText(mail); + verify(sendMailPresignedInPortMock, times(1)).sendMailWithText(mail); } @Test void testEmailIntegrationHandlesValidationException() { - Mockito.doThrow(new ValidationException("Test ValidationException")).when(sendMailInPortMock).sendMailWithText(any()); + Mockito.doThrow(new ValidationException("Test ValidationException")).when(sendMailPresignedInPortMock).sendMailWithText(any()); streamingAdapter.emailIntegration().accept(this.message); verify(monitoringServiceMock, times(1)).sendMailFailed(); final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); @@ -72,7 +70,7 @@ void testEmailIntegrationHandlesValidationException() { @Test void testEmailIntegrationHandlesBpmnError() { - Mockito.doThrow(new BpmnError("errorCode", "errorMessage")).when(sendMailInPortMock).sendMailWithText(any()); + Mockito.doThrow(new BpmnError("errorCode", "errorMessage")).when(sendMailPresignedInPortMock).sendMailWithText(any()); streamingAdapter.emailIntegration().accept(this.message); verify(monitoringServiceMock, times(1)).sendMailFailed(); final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); @@ -85,7 +83,7 @@ void testEmailIntegrationHandlesBpmnError() { @Test void testEmailIntegrationHandlesIncidentError() { - Mockito.doThrow(new IncidentError("Error Message")).when(sendMailInPortMock).sendMailWithText(any()); + Mockito.doThrow(new IncidentError("Error Message")).when(sendMailPresignedInPortMock).sendMailWithText(any()); streamingAdapter.emailIntegration().accept(this.message); verify(monitoringServiceMock, times(1)).sendMailFailed(); final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapterTestBase.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapterTestBase.java index 7f70bd47c..de000f5b8 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapterTestBase.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/StreamingAdapterTestBase.java @@ -1,6 +1,7 @@ package de.muenchen.oss.digiwf.email.integration.adapter.in.streaming; -import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailInPort; +import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailPathsInPort; +import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailPresignedInPort; import de.muenchen.oss.digiwf.email.integration.infrastructure.MonitoringService; import de.muenchen.oss.digiwf.message.process.api.ErrorApi; import de.muenchen.oss.digiwf.message.process.api.ProcessApi; @@ -15,7 +16,8 @@ public class StreamingAdapterTestBase { protected final ProcessApi processApi = Mockito.mock(ProcessApi.class); protected final ErrorApi errorApiMock = Mockito.mock(ErrorApi.class); - protected final SendMailInPort sendMailInPortMock = Mockito.mock(SendMailInPort.class); + protected final SendMailPresignedInPort sendMailPresignedInPortMock = Mockito.mock(SendMailPresignedInPort.class); + protected final SendMailPathsInPort sendMailPathsInPortMock = Mockito.mock(SendMailPathsInPort.class); protected final MonitoringService monitoringServiceMock = Mockito.mock(MonitoringService.class); // dummy data @@ -28,7 +30,8 @@ protected void setupBase() { this.streamingAdapter = new StreamingAdapter( processApi, errorApiMock, - sendMailInPortMock, + sendMailPresignedInPortMock, + sendMailPathsInPortMock, monitoringServiceMock); } diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java index f855b6857..9a6548741 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/out/s3/S3AdapterTest.java @@ -1,6 +1,6 @@ package de.muenchen.oss.digiwf.email.integration.adapter.out.s3; -import de.muenchen.oss.digiwf.email.integration.domain.model.PresignedUrl; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.PresignedUrl; import de.muenchen.oss.digiwf.email.model.FileAttachment; import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; import de.muenchen.oss.digiwf.s3.integration.client.exception.DocumentStorageClientErrorException; diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCaseTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedUseCaseTest.java similarity index 82% rename from digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCaseTest.java rename to digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedUseCaseTest.java index 9682637ce..d98268888 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailUseCaseTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedUseCaseTest.java @@ -1,12 +1,12 @@ package de.muenchen.oss.digiwf.email.integration.application.usecase; -import de.muenchen.oss.digiwf.email.integration.adapter.in.streaming.MailWithLogoAndLinkDto; -import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailInPort; +import de.muenchen.oss.digiwf.email.integration.adapter.in.streaming.MailWithLogoAndLinkPresignedDto; +import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailPresignedInPort; import de.muenchen.oss.digiwf.email.integration.application.port.out.LoadMailAttachmentOutPort; import de.muenchen.oss.digiwf.email.integration.application.port.out.MailOutPort; -import de.muenchen.oss.digiwf.email.integration.domain.model.PresignedUrl; -import de.muenchen.oss.digiwf.email.integration.domain.model.TemplateMail; -import de.muenchen.oss.digiwf.email.integration.domain.model.TextMail; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.PresignedUrl; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TemplateMailPresigned; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TextMailPresigned; import de.muenchen.oss.digiwf.email.model.FileAttachment; import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; import freemarker.template.TemplateException; @@ -22,61 +22,55 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; -class SendMailUseCaseTest { +class SendMailPresignedUseCaseTest { private final LoadMailAttachmentOutPort loadMailAttachmentOutPort = mock(LoadMailAttachmentOutPort.class); private final MailOutPort mailOutPort = mock(MailOutPort.class); - private final TextMail mail = new TextMail( + private final TextMailPresigned mail = new TextMailPresigned( "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", "receiverCC@muenchen.de", "receiverBCC@muenchen.de", "Test Mail", "This is a test mail", "digiwf@muenchen.de", - null, - null, null ); - private final MailWithLogoAndLinkDto mailWithLogoAndLinkDto = new MailWithLogoAndLinkDto( + private final MailWithLogoAndLinkPresignedDto mailWithLogoAndLinkDto = new MailWithLogoAndLinkPresignedDto( "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", "receiverCC@muenchen.de", "receiverBCC@muenchen.de", "Test Mail", "digiwf@muenchen.de", null, - null, - null, "template", "text", "bottomBody", "buttonText", "buttonLink" ); - private final TemplateMail templateMail = new TemplateMail( + private final TemplateMailPresigned templateMail = new TemplateMailPresigned( "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", "receiverCC@muenchen.de", "receiverBCC@muenchen.de", "Test Mail", "digiwf@muenchen.de", null, - null, - null, "template", Map.of("mail", mailWithLogoAndLinkDto) ); private final String processInstanceId = "processInstanceId"; private final String integrationName = "emailIntegration"; private final String type = "type"; - private SendMailInPort sendMailInPort; + private SendMailPresignedInPort sendMailPresignedInPort; @BeforeEach void setUp() { - this.sendMailInPort = new SendMailUseCase(loadMailAttachmentOutPort, mailOutPort); + this.sendMailPresignedInPort = new SendMailPresignedPresignedUseCase(loadMailAttachmentOutPort, mailOutPort); } @Test void sendMail() throws MessagingException { - sendMailInPort.sendMailWithText(mail); + sendMailPresignedInPort.sendMailWithText(mail); final de.muenchen.oss.digiwf.email.model.Mail mailOutModel = de.muenchen.oss.digiwf.email.model.Mail.builder() .receivers(mail.getReceivers()) .subject(mail.getSubject()) @@ -97,7 +91,7 @@ void sendMailWithAttachments() throws MessagingException { final FileAttachment fileAttachment = new FileAttachment("test.txt", new ByteArrayDataSource("Anhang Inhalt".getBytes(), "text/plain")); when(loadMailAttachmentOutPort.loadAttachment(presignedUrl)).thenReturn(fileAttachment); - sendMailInPort.sendMailWithText(mail); + sendMailPresignedInPort.sendMailWithText(mail); final de.muenchen.oss.digiwf.email.model.Mail mailOutModel = de.muenchen.oss.digiwf.email.model.Mail.builder() .receivers(mail.getReceivers()) .subject(mail.getSubject()) @@ -113,13 +107,13 @@ void sendMailWithAttachments() throws MessagingException { @Test void sendMailThrowsBpmnError() throws MessagingException { doThrow(new MessagingException("Test Exception")).when(mailOutPort).sendMail(any(), any()); - assertThatThrownBy(() -> sendMailInPort.sendMailWithText(mail)).isInstanceOf(BpmnError.class); + assertThatThrownBy(() -> sendMailPresignedInPort.sendMailWithText(mail)).isInstanceOf(BpmnError.class); } @Test void sendMailWithTemplate() throws MessagingException, TemplateException, IOException { when(mailOutPort.getBodyFromTemplate(anyString(), anyMap())).thenReturn("generated body"); - sendMailInPort.sendMailWithTemplate(templateMail); + sendMailPresignedInPort.sendMailWithTemplate(templateMail); final de.muenchen.oss.digiwf.email.model.Mail mailOutModel = de.muenchen.oss.digiwf.email.model.Mail.builder() .receivers(mail.getReceivers()) .subject(mail.getSubject()) @@ -136,7 +130,7 @@ void sendMailWithTemplate() throws MessagingException, TemplateException, IOExce @Test void sendMailWithTemplateThrowsIOException() throws TemplateException, IOException { doThrow(new IOException("IO Exception")).when(mailOutPort).getBodyFromTemplate(anyString(), anyMap()); - BpmnError bpmnError = catchThrowableOfType(() -> sendMailInPort.sendMailWithTemplate(templateMail), BpmnError.class); + BpmnError bpmnError = catchThrowableOfType(() -> sendMailPresignedInPort.sendMailWithTemplate(templateMail), BpmnError.class); String expectedMessage = "The template " + templateMail.getTemplate() + " could not be loaded"; String actualMessage = bpmnError.getErrorMessage(); @@ -151,7 +145,7 @@ void sendMailWithTemplateThrowsTemplateException() throws TemplateException, IOE TemplateException templateException = mock(TemplateException.class); when(templateException.getMessage()).thenReturn("Template Exception Message"); doThrow(templateException).when(mailOutPort).getBodyFromTemplate(anyString(), anyMap()); - BpmnError bpmnError = catchThrowableOfType(() -> sendMailInPort.sendMailWithTemplate(templateMail), BpmnError.class); + BpmnError bpmnError = catchThrowableOfType(() -> sendMailPresignedInPort.sendMailWithTemplate(templateMail), BpmnError.class); String expectedMessage = "Template Exception Message"; String actualMessage = bpmnError.getErrorMessage(); diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java index 129bcbdbb..387c73f66 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java @@ -1,15 +1,19 @@ package de.muenchen.oss.digiwf.email.integration.configuration; import de.muenchen.oss.digiwf.email.api.DigiwfEmailApi; -import de.muenchen.oss.digiwf.email.integration.adapter.in.streaming.MailWithLogoAndLinkDto; +import de.muenchen.oss.digiwf.email.integration.adapter.in.streaming.MailWithLogoAndLinkPathsDto; +import de.muenchen.oss.digiwf.email.integration.adapter.in.streaming.MailWithLogoAndLinkPresignedDto; import de.muenchen.oss.digiwf.email.integration.adapter.in.streaming.StreamingAdapter; import de.muenchen.oss.digiwf.email.integration.adapter.out.mail.MailAdapter; import de.muenchen.oss.digiwf.email.integration.adapter.out.s3.S3Adapter; -import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailInPort; +import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailPathsInPort; +import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailPresignedInPort; import de.muenchen.oss.digiwf.email.integration.application.port.out.LoadMailAttachmentOutPort; import de.muenchen.oss.digiwf.email.integration.application.port.out.MailOutPort; -import de.muenchen.oss.digiwf.email.integration.application.usecase.SendMailUseCase; -import de.muenchen.oss.digiwf.email.integration.domain.model.TextMail; +import de.muenchen.oss.digiwf.email.integration.application.usecase.SendMailPathsUseCase; +import de.muenchen.oss.digiwf.email.integration.application.usecase.SendMailPresignedPresignedUseCase; +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TextMailPaths; +import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TextMailPresigned; import de.muenchen.oss.digiwf.email.integration.infrastructure.MonitoringService; import de.muenchen.oss.digiwf.message.process.api.ErrorApi; import de.muenchen.oss.digiwf.message.process.api.ProcessApi; @@ -37,7 +41,7 @@ public class MailAutoConfiguration { private final MetricsProperties metricsProperties; /** - * Configures the {@link SendMailInPort} use case. + * Configures the {@link SendMailPresignedInPort} use case. * * @param loadAttachmentPort LoadMailAttachmentPort * @param mailOutPort MailPort @@ -45,8 +49,14 @@ public class MailAutoConfiguration { */ @Bean @ConditionalOnMissingBean - public SendMailInPort getSendMailUseCase(final LoadMailAttachmentOutPort loadAttachmentPort, final MailOutPort mailOutPort) { - return new SendMailUseCase(loadAttachmentPort, mailOutPort); + public SendMailPresignedInPort getSendMailPresignedInPort(final LoadMailAttachmentOutPort loadAttachmentPort, final MailOutPort mailOutPort) { + return new SendMailPresignedPresignedUseCase(loadAttachmentPort, mailOutPort); + } + + @Bean + @ConditionalOnMissingBean + public SendMailPathsInPort getSendMailPathsInPort(final LoadMailAttachmentOutPort loadAttachmentPort, final MailOutPort mailOutPort) { + return new SendMailPathsUseCase(loadAttachmentPort, mailOutPort); } @Bean @@ -72,27 +82,39 @@ public MailOutPort getMailPort(final DigiwfEmailApi digiwfEmailApi) { } @Bean - public Consumer> sendMailFromEventBus(final StreamingAdapter streamingAdapter) { + public Consumer> sendMailFromEventBus(final StreamingAdapter streamingAdapter) { return streamingAdapter.emailIntegration(); } @Bean - public Consumer> sendMailWithLogoAndLink(final StreamingAdapter streamingAdapter) { + public Consumer> sendMailWithLogoAndLink(final StreamingAdapter streamingAdapter) { return streamingAdapter.sendMailWithLogoAndLink(); } + @Bean + public Consumer> sendTextMailV2(final StreamingAdapter streamingAdapter) { + return streamingAdapter.sendTextMailV2(); + } + + @Bean + public Consumer> sendMailWithLogoAndLinkV2(final StreamingAdapter streamingAdapter) { + return streamingAdapter.sendMailWithLogoAndLinkV2(); + } + @ConditionalOnMissingBean @Bean public StreamingAdapter streamingAdapter( final ProcessApi processApi, final ErrorApi errorApi, final MonitoringService monitoringService, - final SendMailInPort mailUseCase + final SendMailPresignedInPort sendMailPresignedInPort, + final SendMailPathsInPort sendMailPathsInPort ) { return new StreamingAdapter( processApi, errorApi, - mailUseCase, + sendMailPresignedInPort, + sendMailPathsInPort, monitoringService); } diff --git a/docs/src/.vuepress/public/element-template/email-integration/sendMailV02.json b/docs/src/.vuepress/public/element-template/email-integration/sendMailV02.json index d68cad660..2f76f6a57 100644 --- a/docs/src/.vuepress/public/element-template/email-integration/sendMailV02.json +++ b/docs/src/.vuepress/public/element-template/email-integration/sendMailV02.json @@ -35,7 +35,7 @@ "label": "Type Header", "type": "String", "editable": false, - "value": "sendMailFromEventBus", + "value": "sendMailFromEventBusV2", "binding": { "type": "camunda:in", "expression": true, diff --git a/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogo.json b/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogo.json index 1083ce44c..948c6530e 100644 --- a/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogo.json +++ b/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogo.json @@ -35,7 +35,7 @@ "label": "Type Header", "type": "String", "editable": false, - "value": "sendMailWithLogoAndLink", + "value": "sendMailWithLogoAndLinkV2", "binding": { "type": "camunda:in", "expression": true, diff --git a/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogoAndLink.json b/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogoAndLink.json index 7c716a8b5..d8a798af6 100644 --- a/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogoAndLink.json +++ b/docs/src/.vuepress/public/element-template/email-integration/sendMailWithLogoAndLink.json @@ -35,7 +35,7 @@ "label": "Type Header", "type": "String", "editable": false, - "value": "sendMailWithLogoAndLink", + "value": "sendMailWithLogoAndLinkV2", "binding": { "type": "camunda:in", "expression": true, From ce5e800e899ae8b72f61c533d43b24a0e76448f8 Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Wed, 10 Jul 2024 14:54:45 +0200 Subject: [PATCH 11/12] mail-integration update endpoint without presigned url --- ...ase.java => SendMailPresignedUseCase.java} | 2 +- ...hLogoAndLinkPathsStreamingAdapterTest.java | 114 +++++++++++++ ...AndLinkPresignedStreamingAdapterTest.java} | 3 +- ...MailWithTextPathsStreamingAdapterTest.java | 98 +++++++++++ ...ithTextPresignedStreamingAdapterTest.java} | 3 +- .../usecase/SendMailPathsUseCaseTest.java | 154 ++++++++++++++++++ .../usecase/SendMailPresignedUseCaseTest.java | 3 +- .../configuration/MailAutoConfiguration.java | 4 +- 8 files changed, 375 insertions(+), 6 deletions(-) rename digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/{SendMailPresignedPresignedUseCase.java => SendMailPresignedUseCase.java} (97%) create mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkPathsStreamingAdapterTest.java rename digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/{SendMailWithLogoAndLinkStreamingAdapterTest.java => SendMailWithLogoAndLinkPresignedStreamingAdapterTest.java} (97%) create mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextPathsStreamingAdapterTest.java rename digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/{SendMailWithTextStreamingAdapterTest.java => SendMailWithTextPresignedStreamingAdapterTest.java} (97%) create mode 100644 digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPathsUseCaseTest.java diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedPresignedUseCase.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedUseCase.java similarity index 97% rename from digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedPresignedUseCase.java rename to digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedUseCase.java index a15e33451..c54eb61eb 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedPresignedUseCase.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/main/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedUseCase.java @@ -27,7 +27,7 @@ @Slf4j @RequiredArgsConstructor @Validated -public class SendMailPresignedPresignedUseCase implements SendMailPresignedInPort { +public class SendMailPresignedUseCase implements SendMailPresignedInPort { private final LoadMailAttachmentOutPort loadAttachmentOutPort; private final MailOutPort mailOutPort; diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkPathsStreamingAdapterTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkPathsStreamingAdapterTest.java new file mode 100644 index 000000000..80dc4294c --- /dev/null +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkPathsStreamingAdapterTest.java @@ -0,0 +1,114 @@ +package de.muenchen.oss.digiwf.email.integration.adapter.in.streaming; + +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TemplateMailPaths; +import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; +import de.muenchen.oss.digiwf.message.process.api.error.IncidentError; +import jakarta.validation.ValidationException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; + +import java.util.Map; + +import static de.muenchen.oss.digiwf.message.common.MessageConstants.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +class SendMailWithLogoAndLinkPathsStreamingAdapterTest extends StreamingAdapterTestBase { + + private final MailWithLogoAndLinkPathsDto mailWithLogoAndLinkDto = new MailWithLogoAndLinkPathsDto( + "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", + "receiverCC@muenchen.de", + "receiverBCC@muenchen.de", + "Test Mail", + "digiwf@muenchen.de", + "fileContext", + "folder/file.txt", + "template", + "text", + "bottomBody", + "buttonText", + "buttonLink" + ); + + private Message message; + + @BeforeEach + void setup() { + setupBase(); + this.message = new Message() { + @Override + public MailWithLogoAndLinkPathsDto getPayload() { + return mailWithLogoAndLinkDto; + } + + @Override + public MessageHeaders getHeaders() { + return messageHeaders; + } + }; + } + + @Test + void testEmailIntegrationSendsMailSuccessfully() { + TemplateMailPaths templateMail = new TemplateMailPaths( + "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", + "receiverCC@muenchen.de", + "receiverBCC@muenchen.de", + "Test Mail", + "digiwf@muenchen.de", + "fileContext", + "folder/file.txt", + "template", + Map.of("mail", mailWithLogoAndLinkDto) + ); + streamingAdapter.sendMailWithLogoAndLinkV2().accept(this.message); + verify(monitoringServiceMock, times(1)).sendMailSucceeded(); + verify(sendMailPathsInPortMock, times(1)).sendMailWithTemplate(templateMail); + } + + @Test + void testEmailIntegrationHandlesValidationException() { + Mockito.doThrow(new ValidationException("Test ValidationException")).when(sendMailPathsInPortMock).sendMailWithTemplate(any()); + streamingAdapter.sendMailWithLogoAndLinkV2().accept(this.message); + verify(monitoringServiceMock, times(1)).sendMailFailed(); + final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + verify(errorApiMock, times(1)).handleBpmnError(messageHeaderArgumentCaptor.capture(), any(BpmnError.class)); + assertThat(messageHeaderArgumentCaptor.getValue()) + .containsKey(DIGIWF_PROCESS_INSTANCE_ID) + .containsKey(DIGIWF_INTEGRATION_NAME) + .containsKey(TYPE); + } + + @Test + void testEmailIntegrationHandlesBpmnError() { + Mockito.doThrow(new BpmnError("errorCode", "errorMessage")).when(sendMailPathsInPortMock).sendMailWithTemplate(any()); + streamingAdapter.sendMailWithLogoAndLinkV2().accept(this.message); + verify(monitoringServiceMock, times(1)).sendMailFailed(); + final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + verify(errorApiMock, times(1)).handleBpmnError(messageHeaderArgumentCaptor.capture(), any(BpmnError.class)); + assertThat(messageHeaderArgumentCaptor.getValue()) + .containsKey(DIGIWF_PROCESS_INSTANCE_ID) + .containsKey(DIGIWF_INTEGRATION_NAME) + .containsKey(TYPE); + } + + @Test + void testEmailIntegrationHandlesIncidentError() { + Mockito.doThrow(new IncidentError("Error Message")).when(sendMailPathsInPortMock).sendMailWithTemplate(any()); + streamingAdapter.sendMailWithLogoAndLinkV2().accept(this.message); + verify(monitoringServiceMock, times(1)).sendMailFailed(); + final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + verify(errorApiMock, times(1)).handleIncident(messageHeaderArgumentCaptor.capture(), any(IncidentError.class)); + assertThat(messageHeaderArgumentCaptor.getValue()) + .containsKey(DIGIWF_PROCESS_INSTANCE_ID) + .containsKey(DIGIWF_INTEGRATION_NAME) + .containsKey(TYPE); + } +} + diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkStreamingAdapterTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkPresignedStreamingAdapterTest.java similarity index 97% rename from digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkStreamingAdapterTest.java rename to digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkPresignedStreamingAdapterTest.java index d568cb66a..07f26b15c 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkStreamingAdapterTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithLogoAndLinkPresignedStreamingAdapterTest.java @@ -19,7 +19,8 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -class SendMailWithLogoAndLinkStreamingAdapterTest extends StreamingAdapterTestBase { +@Deprecated +class SendMailWithLogoAndLinkPresignedStreamingAdapterTest extends StreamingAdapterTestBase { private final MailWithLogoAndLinkPresignedDto mailWithLogoAndLinkDto = new MailWithLogoAndLinkPresignedDto( "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextPathsStreamingAdapterTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextPathsStreamingAdapterTest.java new file mode 100644 index 000000000..17f2b35d5 --- /dev/null +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextPathsStreamingAdapterTest.java @@ -0,0 +1,98 @@ +package de.muenchen.oss.digiwf.email.integration.adapter.in.streaming; + +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TextMailPaths; +import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; +import de.muenchen.oss.digiwf.message.process.api.error.IncidentError; +import jakarta.validation.ValidationException; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; +import org.mockito.Mockito; +import org.springframework.messaging.Message; +import org.springframework.messaging.MessageHeaders; + +import java.util.Map; + +import static de.muenchen.oss.digiwf.message.common.MessageConstants.*; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; + +class SendMailWithTextPathsStreamingAdapterTest extends StreamingAdapterTestBase { + private final TextMailPaths mail = new TextMailPaths( + "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", + "receiverCC@muenchen.de", + "receiverBCC@muenchen.de", + "Test Mail", + "This is a test mail", + "digiwf@muenchen.de", + "fileContext", + "folder/file.txt" + ); + + private Message message; + + @BeforeEach + void setup() { + setupBase(); + this.message = new Message() { + @Override + public TextMailPaths getPayload() { + return mail; + } + + @Override + public MessageHeaders getHeaders() { + return messageHeaders; + } + }; + } + + @Test + void testEmailIntegrationSendsMailSuccessfully() { + streamingAdapter.sendTextMailV2().accept(this.message); + verify(monitoringServiceMock, times(1)).sendMailSucceeded(); + verify(sendMailPathsInPortMock, times(1)).sendMailWithText(mail); + } + + @Test + void testEmailIntegrationHandlesValidationException() { + Mockito.doThrow(new ValidationException("Test ValidationException")).when(sendMailPathsInPortMock).sendMailWithText(any()); + streamingAdapter.sendTextMailV2().accept(this.message); + verify(monitoringServiceMock, times(1)).sendMailFailed(); + final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + verify(errorApiMock, times(1)).handleBpmnError(messageHeaderArgumentCaptor.capture(), any(BpmnError.class)); + assertThat(messageHeaderArgumentCaptor.getValue()) + .containsKey(DIGIWF_PROCESS_INSTANCE_ID) + .containsKey(DIGIWF_INTEGRATION_NAME) + .containsKey(TYPE); + } + + @Test + void testEmailIntegrationHandlesBpmnError() { + Mockito.doThrow(new BpmnError("errorCode", "errorMessage")).when(sendMailPathsInPortMock).sendMailWithText(any()); + streamingAdapter.sendTextMailV2().accept(this.message); + verify(monitoringServiceMock, times(1)).sendMailFailed(); + final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + verify(errorApiMock, times(1)).handleBpmnError(messageHeaderArgumentCaptor.capture(), any(BpmnError.class)); + assertThat(messageHeaderArgumentCaptor.getValue()) + .containsKey(DIGIWF_PROCESS_INSTANCE_ID) + .containsKey(DIGIWF_INTEGRATION_NAME) + .containsKey(TYPE); + } + + @Test + void testEmailIntegrationHandlesIncidentError() { + Mockito.doThrow(new IncidentError("Error Message")).when(sendMailPathsInPortMock).sendMailWithText(any()); + streamingAdapter.sendTextMailV2().accept(this.message); + verify(monitoringServiceMock, times(1)).sendMailFailed(); + final ArgumentCaptor messageHeaderArgumentCaptor = ArgumentCaptor.forClass(Map.class); + verify(errorApiMock, times(1)).handleIncident(messageHeaderArgumentCaptor.capture(), any(IncidentError.class)); + assertThat(messageHeaderArgumentCaptor.getValue()) + .containsKey(DIGIWF_PROCESS_INSTANCE_ID) + .containsKey(DIGIWF_INTEGRATION_NAME) + .containsKey(TYPE); + } +} + diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextStreamingAdapterTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextPresignedStreamingAdapterTest.java similarity index 97% rename from digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextStreamingAdapterTest.java rename to digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextPresignedStreamingAdapterTest.java index 0c48539ba..5c1648b1d 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextStreamingAdapterTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/adapter/in/streaming/SendMailWithTextPresignedStreamingAdapterTest.java @@ -19,7 +19,8 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -class SendMailWithTextStreamingAdapterTest extends StreamingAdapterTestBase { +@Deprecated +class SendMailWithTextPresignedStreamingAdapterTest extends StreamingAdapterTestBase { private final TextMailPresigned mail = new TextMailPresigned( "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", "receiverCC@muenchen.de", diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPathsUseCaseTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPathsUseCaseTest.java new file mode 100644 index 000000000..c532fa284 --- /dev/null +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPathsUseCaseTest.java @@ -0,0 +1,154 @@ +package de.muenchen.oss.digiwf.email.integration.application.usecase; + +import de.muenchen.oss.digiwf.email.integration.adapter.in.streaming.MailWithLogoAndLinkPathsDto; +import de.muenchen.oss.digiwf.email.integration.application.port.in.SendMailPathsInPort; +import de.muenchen.oss.digiwf.email.integration.application.port.out.LoadMailAttachmentOutPort; +import de.muenchen.oss.digiwf.email.integration.application.port.out.MailOutPort; +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TemplateMailPaths; +import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TextMailPaths; +import de.muenchen.oss.digiwf.email.model.FileAttachment; +import de.muenchen.oss.digiwf.message.process.api.error.BpmnError; +import freemarker.template.TemplateException; +import jakarta.mail.MessagingException; +import jakarta.mail.util.ByteArrayDataSource; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import static org.assertj.core.api.Assertions.*; +import static org.mockito.Mockito.*; + +class SendMailPathsUseCaseTest { + + private final LoadMailAttachmentOutPort loadMailAttachmentOutPort = mock(LoadMailAttachmentOutPort.class); + private final MailOutPort mailOutPort = mock(MailOutPort.class); + private final TextMailPaths mail = new TextMailPaths( + "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", + "receiverCC@muenchen.de", + "receiverBCC@muenchen.de", + "Test Mail", + "This is a test mail", + "digiwf@muenchen.de", + "fileContext", + "folder/file.txt" + ); + private final MailWithLogoAndLinkPathsDto mailWithLogoAndLinkDto = new MailWithLogoAndLinkPathsDto( + "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", + "receiverCC@muenchen.de", + "receiverBCC@muenchen.de", + "Test Mail", + "digiwf@muenchen.de", + "fileContext", + "folder/file.txt", + "template", + "text", + "bottomBody", + "buttonText", + "buttonLink" + ); + private final TemplateMailPaths templateMail = new TemplateMailPaths( + "mailReceiver1@muenchen.de,mailReceiver2@muenchen.de", + "receiverCC@muenchen.de", + "receiverBCC@muenchen.de", + "Test Mail", + "digiwf@muenchen.de", + "fileContext", + "folder/file.txt", + "template", + Map.of("mail", mailWithLogoAndLinkDto) + ); + private SendMailPathsInPort sendMailPathsInPort; + + @BeforeEach + void setUp() { + this.sendMailPathsInPort = new SendMailPathsUseCase(loadMailAttachmentOutPort, mailOutPort); + } + + @Test + void sendMail() throws MessagingException { + sendMailPathsInPort.sendMailWithText(mail); + final de.muenchen.oss.digiwf.email.model.Mail mailOutModel = de.muenchen.oss.digiwf.email.model.Mail.builder() + .receivers(mail.getReceivers()) + .subject(mail.getSubject()) + .body(mail.getBody()) + .replyTo(mail.getReplyTo()) + .receiversCc(mail.getReceiversCc()) + .receiversBcc(mail.getReceiversBcc()) + .attachments(List.of()) + .build(); + verify(mailOutPort).sendMail(mailOutModel, null); + } + + @Test + void sendMailWithAttachments() throws MessagingException { + final FileAttachment fileAttachment = new FileAttachment("test.txt", new ByteArrayDataSource("Anhang Inhalt".getBytes(), "text/plain")); + when(loadMailAttachmentOutPort.loadAttachments("fileContext", List.of("folder/file.txt"))).thenReturn(List.of(fileAttachment)); + + sendMailPathsInPort.sendMailWithText(mail); + final de.muenchen.oss.digiwf.email.model.Mail mailOutModel = de.muenchen.oss.digiwf.email.model.Mail.builder() + .receivers(mail.getReceivers()) + .subject(mail.getSubject()) + .body(mail.getBody()) + .replyTo(mail.getReplyTo()) + .receiversCc(mail.getReceiversCc()) + .receiversBcc(mail.getReceiversBcc()) + .attachments(List.of(fileAttachment)) + .build(); + verify(mailOutPort).sendMail(mailOutModel, null); + } + + @Test + void sendMailThrowsBpmnError() throws MessagingException { + doThrow(new MessagingException("Test Exception")).when(mailOutPort).sendMail(any(), any()); + assertThatThrownBy(() -> sendMailPathsInPort.sendMailWithText(mail)).isInstanceOf(BpmnError.class); + } + + @Test + void sendMailWithTemplate() throws MessagingException, TemplateException, IOException { + when(mailOutPort.getBodyFromTemplate(anyString(), anyMap())).thenReturn("generated body"); + sendMailPathsInPort.sendMailWithTemplate(templateMail); + final de.muenchen.oss.digiwf.email.model.Mail mailOutModel = de.muenchen.oss.digiwf.email.model.Mail.builder() + .receivers(mail.getReceivers()) + .subject(mail.getSubject()) + .htmlBody(true) + .body("generated body") + .replyTo(mail.getReplyTo()) + .receiversCc(mail.getReceiversCc()) + .receiversBcc(mail.getReceiversBcc()) + .attachments(List.of()) + .build(); + verify(mailOutPort).sendMail(mailOutModel, "templates/email-logo.png"); + } + + @Test + void sendMailWithTemplateThrowsIOException() throws TemplateException, IOException { + doThrow(new IOException("IO Exception")).when(mailOutPort).getBodyFromTemplate(anyString(), anyMap()); + BpmnError bpmnError = catchThrowableOfType(() -> sendMailPathsInPort.sendMailWithTemplate(templateMail), BpmnError.class); + + String expectedMessage = "The template " + templateMail.getTemplate() + " could not be loaded"; + String actualMessage = bpmnError.getErrorMessage(); + + assertThat(actualMessage).isEqualTo(expectedMessage); + + assertThat(bpmnError.getErrorCode()).isEqualTo("LOAD_TEMPLATE_FAILED"); + } + + @Test + void sendMailWithTemplateThrowsTemplateException() throws TemplateException, IOException { + TemplateException templateException = mock(TemplateException.class); + when(templateException.getMessage()).thenReturn("Template Exception Message"); + doThrow(templateException).when(mailOutPort).getBodyFromTemplate(anyString(), anyMap()); + BpmnError bpmnError = catchThrowableOfType(() -> sendMailPathsInPort.sendMailWithTemplate(templateMail), BpmnError.class); + + String expectedMessage = "Template Exception Message"; + String actualMessage = bpmnError.getErrorMessage(); + + assertThat(actualMessage).isEqualTo(expectedMessage); + + assertThat(bpmnError.getErrorCode()).isEqualTo("TEMPLATE_MERGING_FAILED"); + } + +} diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedUseCaseTest.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedUseCaseTest.java index d98268888..d474475b9 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedUseCaseTest.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-core/src/test/java/de/muenchen/oss/digiwf/email/integration/application/usecase/SendMailPresignedUseCaseTest.java @@ -22,6 +22,7 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.Mockito.*; +@Deprecated class SendMailPresignedUseCaseTest { private final LoadMailAttachmentOutPort loadMailAttachmentOutPort = mock(LoadMailAttachmentOutPort.class); @@ -65,7 +66,7 @@ class SendMailPresignedUseCaseTest { @BeforeEach void setUp() { - this.sendMailPresignedInPort = new SendMailPresignedPresignedUseCase(loadMailAttachmentOutPort, mailOutPort); + this.sendMailPresignedInPort = new SendMailPresignedUseCase(loadMailAttachmentOutPort, mailOutPort); } @Test diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java index 387c73f66..91dd3e8ab 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-starter/src/main/java/de/muenchen/oss/digiwf/email/integration/configuration/MailAutoConfiguration.java @@ -11,7 +11,7 @@ import de.muenchen.oss.digiwf.email.integration.application.port.out.LoadMailAttachmentOutPort; import de.muenchen.oss.digiwf.email.integration.application.port.out.MailOutPort; import de.muenchen.oss.digiwf.email.integration.application.usecase.SendMailPathsUseCase; -import de.muenchen.oss.digiwf.email.integration.application.usecase.SendMailPresignedPresignedUseCase; +import de.muenchen.oss.digiwf.email.integration.application.usecase.SendMailPresignedUseCase; import de.muenchen.oss.digiwf.email.integration.domain.model.paths.TextMailPaths; import de.muenchen.oss.digiwf.email.integration.domain.model.presigned.TextMailPresigned; import de.muenchen.oss.digiwf.email.integration.infrastructure.MonitoringService; @@ -50,7 +50,7 @@ public class MailAutoConfiguration { @Bean @ConditionalOnMissingBean public SendMailPresignedInPort getSendMailPresignedInPort(final LoadMailAttachmentOutPort loadAttachmentPort, final MailOutPort mailOutPort) { - return new SendMailPresignedPresignedUseCase(loadAttachmentPort, mailOutPort); + return new SendMailPresignedUseCase(loadAttachmentPort, mailOutPort); } @Bean From 894704b3a70b2d8ef6d71faa5cdcb5e2453c22b4 Mon Sep 17 00:00:00 2001 From: Simon Hirtreiter Date: Thu, 11 Jul 2024 06:39:09 +0200 Subject: [PATCH 12/12] mail-integration fix application.yml --- .../src/main/resources/application.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-service/src/main/resources/application.yml b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-service/src/main/resources/application.yml index 5eb7e4c68..747239fdb 100644 --- a/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-service/src/main/resources/application.yml +++ b/digiwf-integrations/digiwf-email-integration/digiwf-email-integration-service/src/main/resources/application.yml @@ -49,8 +49,8 @@ spring: s3: provider: keycloak authorization-grant-type: client_credentials - client-id: ${SSO_DMS_CLIENT_ID} - client-secret: ${SSO_DMS_CLIENT_SECRET} + client-id: ${SSO_S3_CLIENT_ID} + client-secret: ${SSO_S3_CLIENT_SECRET} scope: email, profile, openid # needed for userInfo endpoint management: endpoints: