diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 92f4733ef37f28f8407b433b8497fc6d745c81ff..8336c8654864b18f5008430308e67e9a4d5298de 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 23117b0b8d641d68b832f89a7ad7372ce3e9baea..6e1207d0ec3d17322995e31e88038004bb207891 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 3a32abf022a00b9b38e7204a7b25ac16056cc91f..d8a5b2a91d186116dfcf6c1ec45f964970fe72a4 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 584ab431f885a54133b11c9379104b942bd95071..81b8750a77d9947c80ea10ed7938e844572fb670 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 5b8f808f602e2c96592db0b220e84174b1b79d2b..825a14ba26d42ae22648ca11592c53e04a6b02b9 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 50587cb1c2d0a10d270a1266a248f554979513a8..f743ddebf8f7f02f40eb31d1562aa10342448b27 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 fe8ad8ac79c793cba32dffff2157cd19dfa8c1e1..f21fed3245d56ba40fb75f526f872122cea00e82 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 f4c7b0015a362dd68b004251d0a6c5890e1fc6ac..bf689b4f672e86d057079629fee1145c543e5411 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 204319d6c67e679992ea6e2b1d58a00ecc4d6c45..d067117749aee4d1b82d5faae5cdf9b6605d80da 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 1007d16d85277b555b8f7dc60ff016c1fc8123d5..63e8d63c009c11147027ab1cf8b2620531165678 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 46a4c7d6228e6c76ed8a27b9f3c00bfe63fa38ca..8f79e54f5f1ffa2eadb57a9eadfeb0713644ef75 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 0000000000000000000000000000000000000000..861bcc67d7f7cffdd9fc2608a6378b8baf23454b --- /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 b1ce78f231cea6aa2bba69034f6ce9da00af99da..d581de4ab39c9433606ef73cf9c9b538bde11ad9 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 192ce4bc4a8569976ad5b094ec82581154302e6c..3f5907b1cb0c0ac7c7eb386c3aa979e280fef1f2 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 0000000000000000000000000000000000000000..79fa8c20435c05640b889adc3fc647e4a6c344dd --- /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 0191988327e7f7ff1a32680eaee758fca138c9bf..e2e490eeeab671179a16085e151b7ec40b8b9b06 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 0000000000000000000000000000000000000000..bfbaab098a95ddf70342dd2fdc2835404d2d902c --- /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 27cc8180b81893cfca3469feb09c833ee4527c87..08c9594a95b697ba14027c5e9c7e45722a9b0a77 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); } }