From 95cf97ea1796fc02a5f49cc11177c7d83973fb7c Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Fri, 23 Jun 2023 13:02:03 +0200 Subject: [PATCH] prj-42 create nachricht draft and save it --- bescheid-manager/pom.xml | 4 ++ .../java/de/ozgcloud/bescheid/Bescheid.java | 5 ++- .../bescheid/BescheidEventListener.java | 38 ++++++++-------- .../de/ozgcloud/bescheid/BescheidRequest.java | 2 + .../java/de/ozgcloud/bescheid/UserId.java | 7 ++- .../binaryfile/BinaryFileRemoteService.java | 5 ++- .../binaryfile/BinaryFileService.java | 2 + .../dummy/DummyBescheidRemoteService.java | 1 + .../bescheid/nachricht/Nachricht.java | 6 +-- .../bescheid/nachricht/NachrichtMapper.java | 4 ++ .../bescheid/nachricht/NachrichtService.java | 43 ++++++++++++++++--- .../bescheid.nachrichtTemplate.txt.ftlh | 8 ++++ .../bescheid/BescheidEventListenerITCase.java | 2 +- .../bescheid/BescheidRequestTestFactory.java | 4 +- .../nachricht/NachrichtServiceITCase.java | 42 ++++++++++++++++++ .../nachricht/NachrichtServiceTest.java | 23 +++++++--- .../src/test/resources/application-itcase.yml | 6 +++ .../ozg/pluto/command/CommandTestFactory.java | 5 ++- 18 files changed, 166 insertions(+), 41 deletions(-) create mode 100644 bescheid-manager/src/main/resources/templates/bescheid.nachrichtTemplate.txt.ftlh create mode 100644 bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceITCase.java create mode 100644 bescheid-manager/src/test/resources/application-itcase.yml diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 92f4733ef..8336c8654 100644 --- a/bescheid-manager/pom.xml +++ b/bescheid-manager/pom.xml @@ -39,6 +39,10 @@ <artifactId>kop-common-lib</artifactId> </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-freemarker</artifactId> + </dependency> <dependency> <groupId>net.devh</groupId> <artifactId>grpc-client-spring-boot-starter</artifactId> diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java index 23117b0b8..6e1207d0e 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java @@ -14,12 +14,15 @@ public class Bescheid { private VorgangId vorgangId; - private String bescheidFileName; + private boolean genehmigt; + private UserId createdBy; + private String bescheidFileName; private File bescheidFile; @With private FileId bescheidFileId; private String contentType; private long size; + } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java index 3a32abf02..d8a5b2a91 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java @@ -1,7 +1,6 @@ package de.ozgcloud.bescheid; import java.time.LocalDate; -import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.function.Predicate; @@ -58,6 +57,25 @@ class BescheidEventListener { } } + public void doCreateBescheidBiz(@NonNull Command command) { + var bescheid = service.createBescheid(createRequest(command)); + bescheid = fileService.uploadBescheidFile(bescheid); + + nachrichtService.createNachrichtDraft(bescheid); + } + + private BescheidRequest createRequest(Command command) { + var eventBody = command.getBodyObject(); + var builder = BescheidRequest.builder(); + + Optional.ofNullable(eventBody.get(VORGANG_ID_BODYKEY)).map(String.class::cast).map(VorgangId::from).ifPresent(builder::vorgangId); + Optional.ofNullable(eventBody.get(BESCHEID_VOM_BODYKEY)).map(LocalDate.class::cast).ifPresent(builder::bescheidVom); + Optional.ofNullable(eventBody.get(GENEHMIGT_BODYKEY)).map(Boolean.class::cast).ifPresent(builder::genehmigt); + builder.createFor(UserId.from(command.getCreatedBy())); + + return builder.build(); + } + private String buildErrorMessage(Exception e) { try { StringBuilder sb = new StringBuilder(ERROR_MESSAGE); @@ -76,22 +94,4 @@ class BescheidEventListener { return ERROR_MESSAGE; } } - - public void doCreateBescheidBiz(@NonNull Command command) { - // TODO handle exception -> set command to error - var bescheid = service.createBescheid(createRequest(command.getBodyObject())); - bescheid = fileService.uploadBescheidFile(bescheid); - - nachrichtService.createNachrichtDraft(bescheid); - } - - private BescheidRequest createRequest(Map<String, Object> eventBody) { - var builder = BescheidRequest.builder(); - - Optional.ofNullable(eventBody.get(VORGANG_ID_BODYKEY)).map(String.class::cast).map(VorgangId::from).ifPresent(builder::vorgangId); - Optional.ofNullable(eventBody.get(BESCHEID_VOM_BODYKEY)).map(LocalDate.class::cast).ifPresent(builder::bescheidVom); - Optional.ofNullable(eventBody.get(GENEHMIGT_BODYKEY)).map(Boolean.class::cast).ifPresent(builder::genehmigt); - - return builder.build(); - } } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java index 584ab431f..81b8750a7 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java @@ -14,4 +14,6 @@ public class BescheidRequest { private LocalDate bescheidVom; private boolean genehmigt; + + private UserId createFor; } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java index 5b8f808f6..825a14ba2 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java @@ -1,5 +1,7 @@ package de.ozgcloud.bescheid; +import java.util.Objects; + import de.itvsh.kop.common.datatype.StringBasedValue; import lombok.EqualsAndHashCode; @@ -11,6 +13,9 @@ public class UserId extends StringBasedValue { } public static UserId from(String userId) { - return new UserId(userId); + if (Objects.nonNull(userId)) { + return new UserId(userId); + } + return null; } } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java index 50587cb1c..f743ddebf 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java @@ -10,6 +10,8 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.springframework.stereotype.Service; + import com.google.protobuf.ByteString; import de.itvsh.kop.common.binaryfile.FileId; @@ -25,6 +27,7 @@ import io.grpc.stub.CallStreamObserver; import io.grpc.stub.StreamObserver; import net.devh.boot.grpc.client.inject.GrpcClient; +@Service class BinaryFileRemoteService { private static final String CALL_CONTEXT_CLIENT = "bescheid-manager"; @@ -57,7 +60,7 @@ class BinaryFileRemoteService { private GrpcUploadBinaryFileRequest buildMetaDataRequest(Bescheid bescheid) { return GrpcUploadBinaryFileRequest.newBuilder() .setMetadata(GrpcUploadBinaryFileMetaData.newBuilder() - // TODO remove context - check wy needed! + // TODO remove context - check why needed! .setContext(GrpcCallContext.newBuilder().setClient(CALL_CONTEXT_CLIENT).build()) .setVorgangId(bescheid.getVorgangId().toString()) .setField(VORGANG_ATTACHMENT_FIELD) diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java index fe8ad8ac7..f21fed324 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java @@ -1,9 +1,11 @@ package de.ozgcloud.bescheid.binaryfile; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; import de.ozgcloud.bescheid.Bescheid; +@Service public class BinaryFileService { @Autowired diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java index f4c7b0015..bf689b4f6 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java @@ -24,6 +24,7 @@ class DummyBescheidRemoteService implements BescheidRemoteService { .bescheidFile(file) .contentType(DUMMY_BESCHEID_CONTENT_TYPE) .size(file.length()) + .createdBy(request.getCreateFor()) .build(); } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/Nachricht.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/Nachricht.java index 204319d6c..d06711774 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/Nachricht.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/Nachricht.java @@ -1,7 +1,6 @@ package de.ozgcloud.bescheid.nachricht; -import java.io.File; - +import de.itvsh.kop.common.binaryfile.FileId; import de.ozgcloud.bescheid.UserId; import lombok.Builder; import lombok.Getter; @@ -18,8 +17,7 @@ public class Nachricht { @NonNull private String mailBody; - private File bescheid; - private String bescheidFileId; + private FileId bescheidFileId; @NonNull private UserId createdBy; diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtMapper.java index 1007d16d8..63e8d63c0 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtMapper.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtMapper.java @@ -5,6 +5,7 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.NullValueCheckStrategy; +import de.itvsh.kop.common.binaryfile.FileId; import de.itvsh.ozg.mail.postfach.GrpcPostfachNachricht; @Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, // @@ -27,4 +28,7 @@ public interface NachrichtMapper { @Mapping(target = "replyOption", constant = "FORBIDDEN") GrpcPostfachNachricht mapToGrpc(Nachricht nachricht); + default String mapToSTring(FileId fileId) { + return fileId.toString(); + } } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java index 46a4c7d62..8f79e54f5 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/nachricht/NachrichtService.java @@ -1,10 +1,16 @@ package de.ozgcloud.bescheid.nachricht; +import java.io.IOException; +import java.io.StringWriter; + import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import de.itvsh.kop.common.errorhandling.TechnicalException; import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.UserId; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; @Service public class NachrichtService { @@ -12,8 +18,13 @@ public class NachrichtService { @Autowired private NachrichtRemoteService remoteService; + @Autowired + private Configuration freemarkerCfg; + static final String SUBJECT = "Ihr Antrag"; + private static final String TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh"; + public void createNachrichtDraft(Bescheid bescheid) { remoteService.saveDraft(buildNachricht(bescheid)); } @@ -21,13 +32,33 @@ public class NachrichtService { Nachricht buildNachricht(Bescheid bescheid) { return Nachricht.builder() .subject(SUBJECT) - .mailBody(buildMessage()) - .createdBy(UserId.from("TODO")) + .mailBody(buildMessage(bescheid)) + .createdBy(bescheid.getCreatedBy()) + .bescheidFileId(bescheid.getBescheidFileId()) .build(); } - String buildMessage() { - // TODO - return "eine Nachricht"; + String buildMessage(Bescheid bescheid) { + return fillTemplate(TEMPLATE_FILE, bescheid); + } + + private String fillTemplate(String templateName, Object dataModel) { + try { + Template template = getTemplate(templateName); + StringWriter stringWriter = new StringWriter(); + template.process(dataModel, stringWriter); + return stringWriter.toString(); + + } catch (IOException | TemplateException e) { + throw new TechnicalException("Error filling template", e); + } + } + + Template getTemplate(String templateName) { + try { + return freemarkerCfg.getTemplate(templateName); + } catch (IOException e) { + throw new TechnicalException("Error loading mail template", e); + } } } diff --git a/bescheid-manager/src/main/resources/templates/bescheid.nachrichtTemplate.txt.ftlh b/bescheid-manager/src/main/resources/templates/bescheid.nachrichtTemplate.txt.ftlh new file mode 100644 index 000000000..861bcc67d --- /dev/null +++ b/bescheid-manager/src/main/resources/templates/bescheid.nachrichtTemplate.txt.ftlh @@ -0,0 +1,8 @@ +Sehr geehrte/r Antragstellende/r, + +ihr Antrag wurde <#if genehmigt>genehmigt<#else>abgelehnt</#if>. + +Sie können innerhalb von vier Wochen Einspruch einlegen. + +Mit freundlichen Grüßen, +Ihre Verwaltung \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java index b1ce78f23..d581de4ab 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java @@ -24,7 +24,7 @@ class BescheidEventListenerITCase { private BescheidService service; @Nested - class TestCreateBesched { + class TestCreateBescheid { private Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.ORDER).build(); diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java index 192ce4bc4..3f5907b1c 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java @@ -2,6 +2,7 @@ package de.ozgcloud.bescheid; import java.time.LocalDate; +import de.itvsh.ozg.pluto.command.CommandTestFactory; import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; @@ -20,7 +21,8 @@ public class BescheidRequestTestFactory { return BescheidRequest.builder() .vorgangId(VORGANG_ID) .bescheidVom(BESCHEID_VOM) - .genehmigt(GENEHMIGT); + .genehmigt(GENEHMIGT) + .createFor(UserId.from(CommandTestFactory.CREATED_BY)); } } diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceITCase.java new file mode 100644 index 000000000..79fa8c204 --- /dev/null +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceITCase.java @@ -0,0 +1,42 @@ +package de.ozgcloud.bescheid.nachricht; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import de.itvsh.kop.common.test.ITCase; +import de.ozgcloud.bescheid.BescheidTestFactory; + +@ITCase +class NachrichtServiceITCase { + + @Autowired + private NachrichtService service; + + @Nested + class TestBuildMessage { + @Test + void shouldBuildMessage() { + var message = service.buildMessage(BescheidTestFactory.create()); + + assertThat(message).isNotBlank(); + } + + @Test + void shouldBeGenehmigt() { + var message = service.buildMessage(BescheidTestFactory.createBuilder().genehmigt(true).build()); + + assertThat(message).contains("genehmigt").doesNotContain("abgelehnt"); + } + + @Test + void shouldBeAbgelehnt() { + var message = service.buildMessage(BescheidTestFactory.createBuilder().genehmigt(false).build()); + + assertThat(message).contains("abgelehnt").doesNotContain("genehmigt"); + } + } + +} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java index 019198832..e2e490eee 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/nachricht/NachrichtServiceTest.java @@ -35,16 +35,11 @@ class NachrichtServiceTest { verify(remoteService).saveDraft(nachricht); } - @Test - void shouldSaveBescheid() { - - } - @Nested class BuildNachricht { @Test void shouldFillMailBody() { - doReturn(NachrichtTestFactory.MAIL_BODY).when(service).buildMessage(); + doReturn(NachrichtTestFactory.MAIL_BODY).when(service).buildMessage(any()); var nachricht = service.buildNachricht(BescheidTestFactory.create()); @@ -58,6 +53,22 @@ class NachrichtServiceTest { assertThat(nachricht.getSubject()).isEqualTo(NachrichtService.SUBJECT); } + @Test + void shouldSetUser() { + var nachricht = service.buildNachricht(BescheidTestFactory.create()); + + assertThat(nachricht.getCreatedBy()).isEqualTo(CallContextUserTestFactory.create()); + } + } + + @Nested + class BuildMessage { + @Test + void shouldBuildText() { + var message = service.buildMessage(BescheidTestFactory.create()); + + assertThat(message).isNotBlank(); + } } } diff --git a/bescheid-manager/src/test/resources/application-itcase.yml b/bescheid-manager/src/test/resources/application-itcase.yml new file mode 100644 index 000000000..bfbaab098 --- /dev/null +++ b/bescheid-manager/src/test/resources/application-itcase.yml @@ -0,0 +1,6 @@ +logging: + level: + ROOT: WARN, + '[org.springframework]': ERROR + '[de.itvsh]': WARN + config: classpath:log4j2-local.xml \ No newline at end of file diff --git a/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java b/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java index 27cc8180b..08c9594a9 100644 --- a/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java +++ b/pluto-command/src/test/java/de/itvsh/ozg/pluto/command/CommandTestFactory.java @@ -8,6 +8,8 @@ public class CommandTestFactory { public static final String ID = UUID.randomUUID().toString(); public static final String ORDER = "DO_TEST"; + public static final String CREATED_BY = UUID.randomUUID().toString(); + public static Command create() { return createBuilder().build(); } @@ -16,6 +18,7 @@ public class CommandTestFactory { return TestCommand.builder() .id(ID) .body(Map.of()) - .bodyObject(Map.of()); + .bodyObject(Map.of()) + .createdBy(CREATED_BY); } } -- GitLab