From 9dc5cf39dffab4b0ff93962341527fefb99c008a Mon Sep 17 00:00:00 2001 From: OZGCloud <ozgcloud@mgm-tp.com> Date: Wed, 16 Aug 2023 16:28:53 +0200 Subject: [PATCH] prj42 fix creating postfach message - add postfach address --- bescheid-manager/pom.xml | 6 ++++- .../java/de/ozgcloud/bescheid/Bescheid.java | 2 ++ .../bescheid/BescheidEventListener.java | 4 +--- .../de/ozgcloud/bescheid/BescheidService.java | 11 ++++++---- .../callcontext/CurrentUserService.java | 5 ++++- .../bescheid/nachricht/Nachricht.java | 3 +++ .../bescheid/nachricht/NachrichtMapper.java | 17 +++++++++++++- .../bescheid/nachricht/NachrichtService.java | 22 +++++++++++++++---- .../vorgang/BescheidVorgangMapper.java | 13 ++++++++++- .../de/ozgcloud/bescheid/vorgang/Vorgang.java | 19 ++++++++++++++++ .../bescheid/BescheidTestFactory.java | 7 +++++- .../nachricht/NachrichtServiceTest.java | 12 +++++----- .../postfach/GrpcPostfachNachrichtMapper.java | 9 ++++++-- .../postfach/PostfachNachrichtMapper.java | 6 ++++- .../src/main/protobuf/postfach.model.proto | 10 +++++---- 15 files changed, 118 insertions(+), 28 deletions(-) diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index 39787e45a..46835d3a8 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 05b9a03b0..419b07d7d 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 645425fae..83662492f 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 42b91aaa2..613a0fb9d 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 2beb56386..a932e0d6c 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 5fae54bfd..3cd87c11a 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 63e8d63c0..a794c656d 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 d741bbeed..42d57dcf6 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 44475a2bb..eaaf2fbfc 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 4531d3dd7..520330f2d 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 58052a419..11289f6ec 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 5ccf09378..c223dc83d 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 3ae376288..9476996cc 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 30300e11e..c0f4e6db7 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 7bfe06a99..99adea9dd 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 { -- GitLab