diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 39787e45a3cd04807bfa975ee8403db250e6f8fa..46835d3a8ecce393fd740f514813f44dad616e2a 100644 --- a/bescheid-manager/pom.xml +++ b/bescheid-manager/pom.xml @@ -15,7 +15,7 @@ <version>1.0.0-SNAPSHOT</version> <properties> - <pluto.version>1.12.0-SNAPSHOT</pluto.version> + <pluto.version>1.13.0-SNAPSHOT</pluto.version> </properties> <dependencies> @@ -28,6 +28,10 @@ <artifactId>pluto-command</artifactId> <version>${pluto.version}</version> </dependency> + <dependency> + <groupId>de.itvsh.ozg.pluto</groupId> + <artifactId>pluto-utils</artifactId> + </dependency> <dependency> <groupId>de.itvsh.ozg.pluto</groupId> <artifactId>pluto-interface</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 05b9a03b015e15d92fcbdb2cbeb02ee200810f40..419b07d7d45a555cf4eb5fdf8091b11e0f5120e2 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java @@ -3,6 +3,7 @@ package de.ozgcloud.bescheid; import java.io.File; import de.itvsh.kop.common.binaryfile.FileId; +import de.ozgcloud.bescheid.vorgang.Vorgang; import de.ozgcloud.bescheid.vorgang.VorgangId; import lombok.Builder; import lombok.Getter; @@ -24,4 +25,5 @@ public class Bescheid { private String contentType; private long size; + private Vorgang.ServiceKonto serviceKonto; } 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 645425fae4c78bfefde7b512e5783cd68dc6722f..83662492fcdbe569ac23a48691d6f471f68f28d8 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java @@ -69,9 +69,7 @@ class BescheidEventListener { LOG.error("Error on executing Create Bescheid Command. Command failed.", e); eventPublisher.publishEvent(new CommandFailedEvent(command.getId(), buildErrorMessage(e))); } finally { - if (prevContext != null) { - userService.resetSecurityContext(prevContext); - } + userService.resetSecurityContext(prevContext); } } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java index 42b91aaa291dcc761c84cb2c732eded537c306b5..613a0fb9d0ee0c78b61a82b27b46d027046c46f5 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java @@ -23,11 +23,14 @@ class BescheidService { public Bescheid createBescheid(BescheidRequest request) { checkRemoteService(); - var vorgang = vorgangService.getById(request.getVorgangId()); - - var bescheid = remoteService.create(request, vorgang); + return doCreateBescheid(request); + } - return bescheid.toBuilder().vorgangId(request.getVorgangId()).build(); + private Bescheid doCreateBescheid(BescheidRequest request) { + var vorgang = vorgangService.getById(request.getVorgangId()); + return remoteService.create(request, vorgang) + .toBuilder().vorgangId(vorgang.getId()).serviceKonto(vorgang.getServiceKonto()) + .build(); } private void checkRemoteService() { diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java index 2beb563862f0b9beeec5325ba141290c88d2c2f7..a932e0d6c917b26828c16bd56e42ad89911ce587 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java @@ -23,6 +23,7 @@ */ package de.ozgcloud.bescheid.common.callcontext; +import java.util.Objects; import java.util.Optional; import java.util.stream.Collectors; @@ -98,6 +99,8 @@ public class CurrentUserService { public void resetSecurityContext(SecurityContext context) { SecurityContextHolder.clearContext(); - SecurityContextHolder.setContext(context); + if (Objects.nonNull(context)) { + SecurityContextHolder.setContext(context); + } } } \ No newline at end of file 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 5fae54bfd5325a05e75e92811a3389e3d2e78ebe..3cd87c11a8d54eb0964312d4fe0a5c4e89ac2d57 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 @@ -2,6 +2,7 @@ package de.ozgcloud.bescheid.nachricht; import de.itvsh.kop.common.binaryfile.FileId; import de.ozgcloud.bescheid.UserId; +import de.ozgcloud.bescheid.vorgang.Vorgang; import de.ozgcloud.bescheid.vorgang.VorgangId; import lombok.Builder; import lombok.Getter; @@ -23,4 +24,6 @@ public class Nachricht { @NonNull private UserId createdBy; + + private Vorgang.PostfachAddress postfachAddress; } 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 63e8d63c009c11147027ab1cf8b2620531165678..a794c656d13ecfd60e24835fd47446a54b35d5de 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 @@ -4,14 +4,19 @@ import org.mapstruct.CollectionMappingStrategy; import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.NullValueCheckStrategy; +import org.mapstruct.ReportingPolicy; import de.itvsh.kop.common.binaryfile.FileId; +import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper; import de.itvsh.ozg.mail.postfach.GrpcPostfachNachricht; +import de.itvsh.ozg.pluto.vorgang.GrpcPostfachAddress; +import de.ozgcloud.bescheid.vorgang.Vorgang; @Mapper(collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, // - nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, unmappedTargetPolicy = ReportingPolicy.ERROR, uses = GrpcObjectMapper.class) public interface NachrichtMapper { + @Mapping(target = "mergePostfachAddress", ignore = true) @Mapping(target = "mergeFrom", ignore = true) @Mapping(target = "clearField", ignore = true) @Mapping(target = "clearOneof", ignore = true) @@ -28,6 +33,16 @@ public interface NachrichtMapper { @Mapping(target = "replyOption", constant = "FORBIDDEN") GrpcPostfachNachricht mapToGrpc(Nachricht nachricht); + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "mergeIdentifier", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "versionBytes", ignore = true) + @Mapping(target = "allFields", ignore = true) + GrpcPostfachAddress mapAddress(Vorgang.PostfachAddress address); + 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 d741bbeede9f8390b30ee7cdbe4d770b8f3fc146..42d57dcf61ae06efd0de8b6e218b7f8a3e95ad75 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 @@ -2,17 +2,22 @@ package de.ozgcloud.bescheid.nachricht; import java.io.IOException; import java.io.StringWriter; +import java.util.Objects; +import java.util.Optional; 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.vorgang.Vorgang.PostfachAddress; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; +import lombok.extern.log4j.Log4j2; @Service +@Log4j2 public class NachrichtService { @Autowired @@ -26,17 +31,26 @@ public class NachrichtService { private static final String TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh"; public void createNachrichtDraft(Bescheid bescheid) { - remoteService.saveDraft(buildNachricht(bescheid)); + buildNachricht(bescheid).ifPresentOrElse(remoteService::saveDraft, () -> LOG.warn("No ServiceKonto given on Vorgang.")); } - Nachricht buildNachricht(Bescheid bescheid) { - return Nachricht.builder() + Optional<Nachricht> buildNachricht(Bescheid bescheid) { + return getAddress(bescheid).map(address -> Nachricht.builder() .vorgangId(bescheid.getVorgangId()) + .postfachAddress(address) .subject(SUBJECT) .mailBody(buildMessage(bescheid)) .createdBy(bescheid.getCreatedBy()) .bescheidFileId(bescheid.getBescheidFileId()) - .build(); + .build()); + } + + Optional<PostfachAddress> getAddress(Bescheid bescheid) { + var serviceKonto = bescheid.getServiceKonto(); + if (Objects.nonNull(serviceKonto)) { + return Optional.of(serviceKonto.getPostfachAddresses().get(0)); + } + return Optional.empty(); } String buildMessage(Bescheid bescheid) { diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapper.java index 44475a2bb5d83dc47a7726d0b799641b23930773..eaaf2fbfc9e67b9b3ddf4a22eb608062c4b1cf5b 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapper.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapper.java @@ -9,18 +9,28 @@ import org.mapstruct.Mapping; import org.mapstruct.ReportingPolicy; import org.mapstruct.factory.Mappers; +import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper; import de.itvsh.ozg.pluto.vorgang.GrpcEingang; import de.itvsh.ozg.pluto.vorgang.GrpcFormData; +import de.itvsh.ozg.pluto.vorgang.GrpcPostfachAddress; +import de.itvsh.ozg.pluto.vorgang.GrpcServiceKonto; import de.itvsh.ozg.pluto.vorgang.GrpcVorgangWithEingang; @Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, // - uses = FormDataEntryMapper.class) + uses = { FormDataEntryMapper.class, GrpcObjectMapper.class }) interface BescheidVorgangMapper { + @Mapping(target = "serviceKonto", source = "header.serviceKonto") @Mapping(target = "vorgangNummer", source = "nummer") @Mapping(target = "vorgangName", source = "name") Vorgang mapVorgang(GrpcVorgangWithEingang vorgang); + @Mapping(target = "postfachAddress", ignore = true) + @Mapping(target = "postfachAddresses", source = "postfachAddressesList") + Vorgang.ServiceKonto mapServiceKonto(GrpcServiceKonto serviceKonto); + + Vorgang.PostfachAddress mapAddress(GrpcPostfachAddress address); + VorgangId mapVorgangId(String vorgangId); Vorgang.Eingang mapEingang(GrpcEingang eingang); @@ -34,4 +44,5 @@ interface BescheidVorgangMapper { return Collections.unmodifiableList(result); } + } diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java index 4531d3dd7968143b727b6336904f53230365df0a..520330f2db350a42741d7a2eceb8afd92b214c67 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java @@ -1,6 +1,7 @@ package de.ozgcloud.bescheid.vorgang; import java.util.List; +import java.util.Map; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; @@ -23,8 +24,26 @@ public class Vorgang { private String vorgangNummer; private String aktenzeichen; + private ServiceKonto serviceKonto; + private Eingang eingang; + @Builder + @Getter + public static class ServiceKonto { + private String type; + @Singular + private List<PostfachAddress> postfachAddresses; + } + + @Builder + @Getter + public static class PostfachAddress { + private String version; + private int type; + private Map<String, Object> identifier; + } + @Builder @Getter static class Eingang { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java index 58052a419836af3c76d3b2d98dac735901f23efa..11289f6ec8575e6ed17a9f27ba1fb2372411132d 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java @@ -6,6 +6,8 @@ import org.springframework.http.MediaType; import de.itvsh.kop.common.binaryfile.TempFileUtils; import de.itvsh.ozg.pluto.command.CommandTestFactory; +import de.ozgcloud.bescheid.vorgang.Vorgang.PostfachAddress; +import de.ozgcloud.bescheid.vorgang.Vorgang.ServiceKonto; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; public class BescheidTestFactory { @@ -30,6 +32,9 @@ public class BescheidTestFactory { .bescheidFileName(FILE_NAME) .bescheidFile(BESCHEID_FILE) .genehmigt(true) - .size(TEST_BESCHEID.length); + .size(TEST_BESCHEID.length) + .serviceKonto(ServiceKonto.builder() + .postfachAddress(PostfachAddress.builder().build()) + .build()); } } 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 5ccf093788a7707c6749700f1941b9e6ab7f2e76..c223dc83d03c54c053c193c1bf1d7a23306c5a81 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 @@ -4,6 +4,8 @@ import static org.assertj.core.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; +import java.util.Optional; + import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; @@ -30,7 +32,7 @@ class NachrichtServiceTest { @Test void shouldCallRemoteService() { - doReturn(nachricht).when(service).buildNachricht(any()); + doReturn(Optional.of(nachricht)).when(service).buildNachricht(any()); service.createNachrichtDraft(BescheidTestFactory.create()); @@ -47,28 +49,28 @@ class NachrichtServiceTest { @Test void shouldFillMailBody() { - var nachricht = service.buildNachricht(BescheidTestFactory.create()); + var nachricht = service.buildNachricht(BescheidTestFactory.create()).get(); assertThat(nachricht.getMailBody()).isEqualTo(NachrichtTestFactory.MAIL_BODY); } @Test void shouldSetSubject() { - var nachricht = service.buildNachricht(BescheidTestFactory.create()); + var nachricht = service.buildNachricht(BescheidTestFactory.create()).get(); assertThat(nachricht.getSubject()).isEqualTo(NachrichtService.SUBJECT); } @Test void shouldSetUser() { - var nachricht = service.buildNachricht(BescheidTestFactory.create()); + var nachricht = service.buildNachricht(BescheidTestFactory.create()).get(); assertThat(nachricht.getCreatedBy()).isEqualTo(BescheidTestFactory.CREATED_BY); } @Test void shouldSetVorgangId() { - var nachricht = service.buildNachricht(BescheidTestFactory.create()); + var nachricht = service.buildNachricht(BescheidTestFactory.create()).get(); assertThat(nachricht.getVorgangId()).isEqualTo(VorgangTestFactory.ID); } diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/GrpcPostfachNachrichtMapper.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/GrpcPostfachNachrichtMapper.java index 3ae37628818e643e98dfa6fd734b5fb3b9d49e35..9476996cc7c8b19a797bbebafae118f944c9225f 100644 --- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/GrpcPostfachNachrichtMapper.java +++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/GrpcPostfachNachrichtMapper.java @@ -3,7 +3,10 @@ package de.itvsh.ozg.mail.postfach; import org.mapstruct.Mapper; import org.mapstruct.Mapping; -@Mapper +import de.itvsh.kop.pluto.common.grpc.GrpcObjectMapper; +import de.itvsh.ozg.pluto.common.GrpcObject; + +@Mapper(uses = GrpcObjectMapper.class) public interface GrpcPostfachNachrichtMapper { @Mapping(target = "attachments", source = "attachmentList") @@ -12,11 +15,13 @@ public interface GrpcPostfachNachrichtMapper { @Mapping(target = "direction", constant = "OUT") @Mapping(target = "messageCode", ignore = true) @Mapping(target = "messageId", ignore = true) - @Mapping(target = "postfachAddress", ignore = true) // uh @Mapping(target = "postfachId", ignore = true) @Mapping(target = "sentAt", ignore = true) @Mapping(target = "sentSuccessful", ignore = true) @Mapping(target = "vorgangId", ignore = true) PostfachNachricht mapFromGrpc(GrpcPostfachNachricht nachricht); + default PostfachAddressIdentifier map(GrpcObject value) { + return StringBasedIdentifier.builder().postfachId(value.getProperty(0).getValue(0)).build(); + } } diff --git a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachNachrichtMapper.java b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachNachrichtMapper.java index 30300e11eca4da1bdca923ace3a23dc739720bcf..c0f4e6db7e189ed46c96c97cdae535312bab7a1c 100644 --- a/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachNachrichtMapper.java +++ b/mail-service/src/main/java/de/itvsh/ozg/mail/postfach/PostfachNachrichtMapper.java @@ -106,7 +106,7 @@ public abstract class PostfachNachrichtMapper { .messageId(MapUtils.getString(mailMap, PostfachNachricht.FIELD_MESSAGE_ID)) .createdAt(ZonedDateTime.parse(MapUtils.getString(mailMap, PostfachNachricht.FIELD_CREATED_AT))) .createdBy(MapUtils.getString(mailMap, PostfachNachricht.FIELD_CREATED_BY)) - .sentAt(ZonedDateTime.parse(MapUtils.getString(mailMap, PostfachNachricht.FIELD_SENT_AT))) + .sentAt(getString(mailMap, PostfachNachricht.FIELD_SENT_AT).map(ZonedDateTime::parse).orElse(null)) .sentSuccessful(MapUtils.getBoolean(mailMap, PostfachNachricht.FIELD_SENT_SUCCESSFUL)) .messageCode(MapUtils.getString(mailMap, PostfachNachricht.FIELD_MESSAGE_CODE)) .direction(Direction.valueOf(MapUtils.getString(mailMap, PostfachNachricht.FIELD_DIRECTION))) @@ -123,6 +123,10 @@ public abstract class PostfachNachrichtMapper { return postfachMailBuilder.build(); } + private Optional<String> getString(Map<String, Object> mailMap, String key) { + return Optional.ofNullable(MapUtils.getString(mailMap, key)); + } + @SuppressWarnings("unchecked") private List<String> getAsList(Map<String, Object> mailMap, String fieldName) { return (List<String>) mailMap.getOrDefault(fieldName, Collections.emptyList()); diff --git a/pluto-interface/src/main/protobuf/postfach.model.proto b/pluto-interface/src/main/protobuf/postfach.model.proto index 7bfe06a995306484427581b61caae0a0b6035c58..99adea9dd72e2595b4c3699d2f4ca400539e27a0 100644 --- a/pluto-interface/src/main/protobuf/postfach.model.proto +++ b/pluto-interface/src/main/protobuf/postfach.model.proto @@ -74,10 +74,12 @@ enum GrpcDirection { message GrpcPostfachNachricht { string id = 1; - string subject = 2; - string mailBody = 3; - string replyOption = 4; - repeated string attachment = 5; + de.itvsh.ozg.pluto.vorgang.GrpcPostfachAddress postfachAddress = 2; + string subject = 3; + string mailBody = 4; + string replyOption = 5; + + repeated string attachment = 6; } message GrpcPostfachMail {