diff --git a/collaboration-manager-server/pom.xml b/collaboration-manager-server/pom.xml index 779646baf2d2700247f8f6849bafa0b771d9aa3d..4b3ac155c5a7203b7c0985b652fa363e25e33f89 100644 --- a/collaboration-manager-server/pom.xml +++ b/collaboration-manager-server/pom.xml @@ -83,6 +83,12 @@ <artifactId>grpc-server-spring-boot-starter</artifactId> </dependency> + <!-- TOOLs --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-freemarker</artifactId> + </dependency> + <!--TEST--> <dependency> <groupId>de.ozgcloud.command</groupId> diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationEventListener.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationEventListener.java index f7e3362bb1c9cf7ad5df00a9929628be7c936740..1d6ad38b89f1a34fa73f0ed749083a3971ca6ae1 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationEventListener.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationEventListener.java @@ -65,7 +65,15 @@ class CollaborationEventListener { } void createCollaborationRequest(Command command) { - collaborationService.createCollaborationRequest(collaborationRequestMapper.toCollaborationRequest(command)); + var collaborationRequest = collaborationRequestMapper.toCollaborationRequest(command); + switch (collaborationRequest.getCollaborationLevel()) { + case 1 -> collaborationService.createCollaborationRequest(collaborationRequest); + case 4 -> collaborationService.createFachstellenBeteiligungRequest(collaborationRequest); + default -> { + LOG.error("Unknown Collaboration Level: {}", collaborationRequest.getCollaborationLevel()); + eventPublisher.publishEvent(new CommandFailedEvent(command.getId(), "Unknown Collaboration Level.")); + } + } } void runWithSecurityContext(Command command, Consumer<Command> commandExecutor) { diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerCollaborationRequestMapper.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerCollaborationRequestMapper.java index 846562f0ae9cec516728923474d30265bc950698..6fa338d5d6c6c74b4e812941a18560cbb63ddd56 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerCollaborationRequestMapper.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerCollaborationRequestMapper.java @@ -26,8 +26,12 @@ package de.ozgcloud.collaboration; import java.util.Map; import org.apache.commons.collections.MapUtils; +import org.mapstruct.CollectionMappingStrategy; import org.mapstruct.Mapper; import org.mapstruct.Mapping; +import org.mapstruct.NullValueCheckStrategy; +import org.mapstruct.NullValuePropertyMappingStrategy; +import org.mapstruct.ReportingPolicy; import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.grpc.CommandMapper; @@ -37,7 +41,12 @@ import de.ozgcloud.vorgang.vorgang.GrpcCollaborationRequest; // TODO: Das Interface ist umbenannt, um mögliche Konflikte in Vorgang-Manager zu vermeiden. In mapstruct:1.6.0 soll eine neue Annotation // @AnnotateWith eingeführt werden,die es ermöglicht, den Servicenamen zu konfigurieren, dann soll sie verwendet werden und das Interface kann // wieder einen normalen Namen bekommen. -@Mapper(uses = { CommandMapper.class }) +@Mapper(uses = { CommandMapper.class }, + unmappedTargetPolicy = ReportingPolicy.WARN, + unmappedSourcePolicy = ReportingPolicy.WARN, + nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, + collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED) public interface CollaborationManagerCollaborationRequestMapper { String ITEM_NAME = "CollaborationRequest"; @@ -47,19 +56,23 @@ public interface CollaborationManagerCollaborationRequestMapper { String FIELD_ITEM_NAME = "itemName"; String FIELD_ITEM_BODY = "item"; - @Mapping(target = "collaborationLevel", ignore = true) @Mapping(target = "collaborationVorgangId", ignore = true) @Mapping(target = "createdBy", ignore = true) @Mapping(target = "commandId", source = "id") @Mapping(target = "titel", expression = "java(getStringProperty(CollaborationRequest.PROPERTY_TITEL, command.getBodyObject()))") @Mapping(target = "zustaendigeStelle", expression = "java(getStringProperty(CollaborationRequest.PROPERTY_ZUSTAENDIGE_STELLE, command.getBodyObject()))") @Mapping(target = "anfrage", expression = "java(getStringProperty(CollaborationRequest.PROPERTY_ANFRAGE, command.getBodyObject()))") + @Mapping(target = "collaborationLevel", expression = "java(getIntProperty(CollaborationRequest.PROPERTY_COLLABORATION_LEVEL, command.getBodyObject()))") CollaborationRequest toCollaborationRequest(Command command); default String getStringProperty(String key, Map<String, Object> propertyMap) { return MapUtils.getString(propertyMap, key); } + default int getIntProperty(String key, Map<String, Object> propertyMap) { + return MapUtils.getIntValue(propertyMap, key); + } + @Mapping(target = "id", ignore = true) @Mapping(target = "status", ignore = true) @Mapping(target = "relationVersion", ignore = true) diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java index 185050d2ae638a872e76f3ee3eef90ab57cad293..2c782ef72bc88218bcb5606cd3f09d45af8010b6 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationManagerConfiguration.java @@ -42,6 +42,7 @@ public class CollaborationManagerConfiguration { public static final String VORGANG_SERVICE_NAME = "collaboration_VorgangService"; public static final String VORGANG_REMOTE_SERVICE_NAME = "collaboration_VorgangRemoteService"; public static final String COLLABORATION_SERVICE_NAME = "collaboration_CollaborationService"; + public static final String TEMPLATE_HANDLER_NAME = "collaboration_TemplateHandler"; public static final String CALL_CONTEXT_INTERCEPTOR_NAME = "collaboration_CallContextInterceptor"; public static final String CALL_CONTEXT_PROVIDER_NAME = "collaboration_CallContextProvider"; diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationRequest.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationRequest.java index 5b2ba3997e10964fc75c68f81da59f71cb62cd37..5b8c0692c482157e83d59b24b03b8f439c98037a 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationRequest.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationRequest.java @@ -41,6 +41,7 @@ public class CollaborationRequest { private String commandId; private String vorgangId; private String collaborationVorgangId; + @Builder.Default private int collaborationLevel = 1; diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java index 40e51fc27c73e3163fe5ddfe082ee5da34b7fd66..5e4b35ca172d084791f1ccdc7f149cbe0e5aec1e 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/CollaborationService.java @@ -24,6 +24,9 @@ package de.ozgcloud.collaboration; import java.io.OutputStream; +import java.util.Collections; +import java.util.List; +import java.util.Map; import jakarta.validation.Valid; @@ -31,11 +34,15 @@ import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; +import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest; +import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.apilib.file.OzgCloudFileId; import de.ozgcloud.apilib.file.OzgCloudFileService; +import de.ozgcloud.collaboration.common.freemarker.TemplateHandler; import de.ozgcloud.collaboration.common.user.UserProfileService; +import de.ozgcloud.collaboration.vorgang.ServiceKonto; import de.ozgcloud.collaboration.vorgang.VorgangService; import lombok.RequiredArgsConstructor; @@ -46,6 +53,15 @@ public class CollaborationService { static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM"; static final String SUBCOMMANDS_EXECUTION_MODE = "PARALLEL"; + public static final String KEY_TEMPLATE_URL = "url"; + + public static final String COLLABORATION_NACHRICHT_TEMPLATE = "collaboration.nachrichtTemplate.txt.ftlh"; + static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT"; + static final String FIELD_REPLY_OPTION = "replyOption"; + static final String REPLY_OPTION = "FORBIDDEN"; + static final String FIELD_SUBJECT = "subject"; + static final String FIELD_MAIL_BODY = "mailBody"; + static final String SUBJECT = "Kooperationsanfrage"; @Qualifier(CollaborationManagerConfiguration.VORGANG_SERVICE_NAME) // NOSONAR private final VorgangService vorgangService; @@ -59,16 +75,15 @@ public class CollaborationService { private final OzgCloudFileService fileService; private final CollaborationManagerCollaborationRequestMapper collaborationRequestMapper; + private final CommandMapper commandMapper; + @Qualifier(CollaborationManagerConfiguration.TEMPLATE_HANDLER_NAME) // NOSONAR + private final TemplateHandler templateHandler; public void createCollaborationRequest(@Valid CollaborationRequest collaborationRequest) { var enrichedRequest = enrichCollaborationRequest(collaborationRequest, vorgangService.createCollaborationVorgang(collaborationRequest)); commandService.addSubCommands(buildCreateCollaborationRequestRequest(enrichedRequest)); } - CollaborationRequest enrichCollaborationRequest(CollaborationRequest request, String collaborationVorgangId) { - return request.toBuilder().collaborationVorgangId(collaborationVorgangId).createdBy(getUserId()).build(); - } - String getUserId() { return userProfileService.getUserProfile().getId().toString(); } @@ -85,4 +100,66 @@ public class CollaborationService { public void writeFileContent(OzgCloudFileId fileId, OutputStream out) { fileService.writeFileDataToStream(fileId, out); } + + public void createFachstellenBeteiligungRequest(@Valid CollaborationRequest collaborationRequest) { + var vorgang = vorgangService.getVorgang(collaborationRequest.getVorgangId()); + var enrichedRequest = enrichCollaborationRequest(collaborationRequest, vorgang.getId().toString()); + var addSubCommandsRequest = buildCreateSubCommandsRequest(enrichedRequest, + buildSubCommands(enrichedRequest, vorgang.getHeader().getServiceKonto())); + commandService.addSubCommands(addSubCommandsRequest); + } + + CollaborationRequest enrichCollaborationRequest(CollaborationRequest request, String collaborationVorgangId) { + return request.toBuilder().collaborationVorgangId(collaborationVorgangId).createdBy(getUserId()).build(); + } + + OzgCloudCreateSubCommandsRequest buildCreateSubCommandsRequest(CollaborationRequest collaborationRequest, List<OzgCloudCommand> subCommands) { + return OzgCloudCreateSubCommandsRequest.builder() + .parentId(collaborationRequest.getCommandId()) + .executionMode(SUBCOMMANDS_EXECUTION_MODE) + .completedIfSubsCompleted(true) + .subCommands(subCommands) + .build(); + } + + List<OzgCloudCommand> buildSubCommands(CollaborationRequest collaborationRequest, ServiceKonto serviceKonto) { + return List.of( + collaborationRequestMapper.toOzgCloudCommand(collaborationRequest, CREATE_ATTACHED_ITEM_ORDER), + buildSendPostfachNachrichtCommand(collaborationRequest, serviceKonto)); + } + + OzgCloudCommand buildSendPostfachNachrichtCommand(CollaborationRequest collaborationRequest, ServiceKonto serviceKonto) { + var bodyObject = buildPostfachSendNachrichtCommandBody(buildPostfachAddress(serviceKonto.getAddresses().getFirst(), serviceKonto.getType())); + return OzgCloudCommand.builder() + .vorgangId(commandMapper.toOzgCloudVorgangId(collaborationRequest.getVorgangId())) + .relationId(commandMapper.mapRelationId(collaborationRequest.getVorgangId())) + .order(SEND_POSTFACH_NACHRICHT_ORDER) + .createdBy(commandMapper.toOzgCloudUserId(collaborationRequest.getCreatedBy())) + .bodyObject(bodyObject) + .build(); + } + + Map<String, Object> buildPostfachAddress(ServiceKonto.PostfachAddress postfachAddress, String serviceKontoType) { + return Map.of( + ServiceKonto.PostfachAddress.FIELD_TYPE, postfachAddress.getType(), + ServiceKonto.PostfachAddress.FIELD_VERSION, postfachAddress.getVersion(), + ServiceKonto.PostfachAddress.FIELD_IDENTIFIER, postfachAddress.getIdentifier(), + ServiceKonto.FIELD_SERVICEKONTO_TYPE, serviceKontoType); + } + + Map<String, Object> buildPostfachSendNachrichtCommandBody(Map<String, Object> postfachAddress) { + return Map.of( + FIELD_REPLY_OPTION, REPLY_OPTION, + FIELD_SUBJECT, SUBJECT, + FIELD_MAIL_BODY, getAnfrageText(), + ServiceKonto.FIELD_POSTFACH_ADDRESS, postfachAddress); + } + + String getAnfrageText() { + return templateHandler.fillTemplate(COLLABORATION_NACHRICHT_TEMPLATE, getTemplateParameters()); + } + + Map<String, Object> getTemplateParameters() { + return Collections.emptyMap(); + } } \ No newline at end of file diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandler.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..cf2b56405377ea25bdadceb6124a62e71decfef7 --- /dev/null +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandler.java @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.collaboration.common.freemarker; + +import java.io.IOException; +import java.io.StringWriter; + +import org.springframework.stereotype.Component; + +import de.ozgcloud.collaboration.CollaborationManagerConfiguration; +import de.ozgcloud.common.errorhandling.TechnicalException; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.TemplateException; +import lombok.RequiredArgsConstructor; + +@Component(CollaborationManagerConfiguration.TEMPLATE_HANDLER_NAME) +@RequiredArgsConstructor +public class TemplateHandler { + + private final Configuration freemarkerConfig; + + public String getRawTemplate(String templateName) { + return getTemplate(templateName).toString(); + } + + public String fillTemplate(String templateName, Object dataModel) { + try { + var template = getTemplate(templateName); + var stringWriter = new StringWriter(); + template.process(dataModel, stringWriter); + return stringWriter.toString(); + + } catch (IOException | TemplateException e) { + throw new TechnicalException("Error filling template", e); + } + } + + private Template getTemplate(String templateName) { + try { + return freemarkerConfig.getTemplate(templateName); + } catch (IOException e) { + throw new TechnicalException("Error loading mail template", e); + } + } +} diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/user/UserProfileService.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/user/UserProfileService.java index 2c20ed8b7dc8f4c7a33fc1f9f8e6f29ecce5fc2f..bc2d3eb7d30f86954cf98ef31c206083e61a978a 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/user/UserProfileService.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/common/user/UserProfileService.java @@ -25,6 +25,7 @@ package de.ozgcloud.collaboration.common.user; import java.util.Optional; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Service; import de.ozgcloud.apilib.user.OzgCloudUserId; @@ -38,6 +39,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor public class UserProfileService { + @Qualifier(CollaborationManagerConfiguration.CURRENT_USER_SERVICE_NAME) // NOSONAR private final CurrentUserService currentUserService; private final Optional<OzgCloudUserProfileService> ozgCloudUserProfileService; private final CollaborationUserProfileMapper mapper; diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/CollaborationServiceKontoMapper.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/CollaborationServiceKontoMapper.java new file mode 100644 index 0000000000000000000000000000000000000000..33a3509b62084ec4fc79f0ddd96fec0c1c3ebcea --- /dev/null +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/CollaborationServiceKontoMapper.java @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.collaboration.vorgang; + +import java.util.Collection; +import java.util.Collections; +import java.util.Map; +import java.util.Objects; +import java.util.stream.Collectors; + +import org.mapstruct.CollectionMappingStrategy; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.NullValueCheckStrategy; +import org.mapstruct.NullValuePropertyMappingStrategy; +import org.mapstruct.ReportingPolicy; + +import de.ozgcloud.apilib.vorgang.OzgCloudPostfachAddressIdentifier; +import de.ozgcloud.apilib.vorgang.OzgCloudServiceKonto; +import de.ozgcloud.apilib.vorgang.OzgCloudTrustLevel; +import de.ozgcloud.common.datatype.StringBasedValue; +import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; +import de.ozgcloud.vorgang.vorgang.GrpcServiceKonto; + +@Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, + unmappedSourcePolicy = ReportingPolicy.WARN, + nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, + nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS, + collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, + uses = GrpcObjectMapper.class) +public interface CollaborationServiceKontoMapper { + + @Mapping(target = "addresses", ignore = true) + @Mapping(target = "address.identifier", source = "address.identifiers") + ServiceKonto fromServiceKonto(OzgCloudServiceKonto serviceKonto); + + default TrustLevel fromTrustLevel(OzgCloudTrustLevel value) { + return TrustLevel.from(value); + } + + default Map<String, Object> fromPostfachAddressIdentifier(Collection<OzgCloudPostfachAddressIdentifier> postfachAddressIdentifier) { + if (Objects.isNull(postfachAddressIdentifier)) { + return Collections.emptyMap(); + } + return postfachAddressIdentifier.stream() + .collect(Collectors.toMap(OzgCloudPostfachAddressIdentifier::getName, OzgCloudPostfachAddressIdentifier::getValue)); + } + + default String fromStringBasedValue(StringBasedValue value) { + return value.toString(); + } + + @Mapping(target = "unknownFields", ignore = true) + @Mapping(target = "typeBytes", ignore = true) + @Mapping(target = "trustLevelBytes", ignore = true) + @Mapping(target = "removePostfachAddresses", ignore = true) + @Mapping(target = "postfachAddressesOrBuilderList", ignore = true) + @Mapping(target = "postfachAddressesBuilderList", ignore = true) + @Mapping(target = "mergeUnknownFields", ignore = true) + @Mapping(target = "mergeFrom", ignore = true) + @Mapping(target = "defaultInstanceForType", ignore = true) + @Mapping(target = "clearOneof", ignore = true) + @Mapping(target = "clearField", ignore = true) + @Mapping(target = "allFields", ignore = true) + + @Mapping(target = "postfachAddressesList", source = "addresses") + GrpcServiceKonto toServiceKonto(ServiceKonto serviceKonto); + + default String toString(TrustLevel trustLevel) { + return trustLevel.getValue(); + } +} \ No newline at end of file diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/CollaborationVorgangMapper.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/CollaborationVorgangMapper.java index 831d1b8d30c4be1d00e17a872cefcd6df2631299..55a2f3431f0cee14a4383cc4bc0bfcebb6280032 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/CollaborationVorgangMapper.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/CollaborationVorgangMapper.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ package de.ozgcloud.collaboration.vorgang; import java.util.List; @@ -15,7 +38,8 @@ import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangIdMapper; import de.ozgcloud.collaboration.GrpcVorgang; -@Mapper(uses = { OzgCloudVorgangIdMapper.class, CollaborationEingangMapper.class, CollaborationRequestMapper.class }, // +@Mapper(uses = { OzgCloudVorgangIdMapper.class, CollaborationEingangMapper.class, CollaborationRequestMapper.class, + CollaborationServiceKontoMapper.class }, // unmappedTargetPolicy = ReportingPolicy.WARN, // collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, // nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, // @@ -24,9 +48,13 @@ public interface CollaborationVorgangMapper { @Mapping(target = "collaborationRequest", ignore = true) @Mapping(target = "eingang", ignore = true) + @Mapping(target = "header.serviceKonto", source = "header.serviceKonto") Vorgang fromOzgCloudVorgang(OzgCloudVorgang vorgang); - @Mapping(target = "eingang", source = "eingangs") + @Mapping(target = "headerOrBuilder", ignore = true) + @Mapping(target = "eingangOrBuilder", ignore = true) + @Mapping(target = "defaultInstanceForType", ignore = true) + @Mapping(target = "collaborationRequestOrBuilder", ignore = true) @Mapping(target = "mergeFrom", ignore = true) @Mapping(target = "clearField", ignore = true) @Mapping(target = "clearOneof", ignore = true) @@ -39,6 +67,8 @@ public interface CollaborationVorgangMapper { @Mapping(target = "vorgangNameBytes", ignore = true) @Mapping(target = "vorgangNummerBytes", ignore = true) @Mapping(target = "allFields", ignore = true) + + @Mapping(target = "eingang", source = "eingangs") GrpcVorgang toGrpc(Vorgang vorgang); default String toString(OzgCloudVorgangId id) { diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/ServiceKonto.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/ServiceKonto.java new file mode 100644 index 0000000000000000000000000000000000000000..08c511c3731fd1a1feb09e9514c6c6adc411d2a4 --- /dev/null +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/ServiceKonto.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.collaboration.vorgang; + +import java.util.List; +import java.util.Map; + +import lombok.Builder; +import lombok.Getter; +import lombok.Singular; + +@Builder +@Getter +public class ServiceKonto { + + public static final String FIELD_SERVICEKONTO_TYPE = "serviceKontoType"; + public static final String FIELD_POSTFACH_ADDRESS = "postfachAddress"; + + private String type; + private TrustLevel trustLevel; + @Singular + private List<PostfachAddress> addresses; + + @Builder + @Getter + public static class PostfachAddress { + + public static final String FIELD_VERSION = "version"; + public static final String FIELD_TYPE = "type"; + public static final String FIELD_IDENTIFIER = "identifier"; + + private String version; + private int type; + private Map<String, Object> identifier; + } +} diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/TrustLevel.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/TrustLevel.java new file mode 100644 index 0000000000000000000000000000000000000000..ab60dd0de13352bb91ea5515e026338b52c4e985 --- /dev/null +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/TrustLevel.java @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.collaboration.vorgang; + +import java.util.Arrays; + +import org.mapstruct.ObjectFactory; + +import de.ozgcloud.apilib.vorgang.OzgCloudTrustLevel; +import lombok.Getter; + +@Getter +public enum TrustLevel { + + LEVEL_1("STORK-QAA-Level-1"), + LEVEL_2("STORK-QAA-Level-2"), + LEVEL_3("STORK-QAA-Level-3"), + LEVEL_4("STORK-QAA-Level-4"); + + private final String value; + private final int intValue; + + TrustLevel(String value) { + this.value = value; + this.intValue = extractIntValue(); + } + + @ObjectFactory + public static TrustLevel from(OzgCloudTrustLevel value) { + return Arrays.stream(TrustLevel.values()).filter(trustLevel -> trustLevel.getValue().equals(value.toString())).findFirst() + .orElseThrow(() -> new IllegalArgumentException("Unknown TrustLevel: '" + value + "'")); + } + + private int extractIntValue() { + return Integer.parseInt(value.substring(value.length() - 1)); + } +} \ No newline at end of file diff --git a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/VorgangHeader.java b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/VorgangHeader.java index 095e30a09012434d478ab2ab51ed6932b7fbf7ec..a23846b9a48385d307a84e14244f6b571ddc5a54 100644 --- a/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/VorgangHeader.java +++ b/collaboration-manager-server/src/main/java/de/ozgcloud/collaboration/vorgang/VorgangHeader.java @@ -9,8 +9,11 @@ import lombok.ToString; @ToString @Getter @Builder -class VorgangHeader { +public class VorgangHeader { private ZonedDateTime createdAt; private String aktenzeichen; + @ToString.Exclude + private ServiceKonto serviceKonto; + } \ No newline at end of file diff --git a/collaboration-manager-server/src/main/resources/templates/collaboration.nachrichtTemplate.txt.ftlh b/collaboration-manager-server/src/main/resources/templates/collaboration.nachrichtTemplate.txt.ftlh new file mode 100644 index 0000000000000000000000000000000000000000..5874936fb45fd176e05cef6a7e888b4b6fb0379c --- /dev/null +++ b/collaboration-manager-server/src/main/resources/templates/collaboration.nachrichtTemplate.txt.ftlh @@ -0,0 +1,7 @@ +Hallo Fachstelle, + +bitte bearbeiten: +${url!"http://www.host.local"} + +Danke, +Verwaltung \ No newline at end of file diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationEventListenerITCase.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationEventListenerITCase.java index fbb35a1212b534eeed6a723475225b7742e2e902..641aec972ec11ef3a6bcc27022c91556b2206f5f 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationEventListenerITCase.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationEventListenerITCase.java @@ -28,11 +28,9 @@ import static org.mockito.Mockito.*; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.boot.test.mock.mockito.SpyBean; import org.springframework.context.ApplicationEventPublisher; -import de.ozgcloud.apilib.file.OzgCloudFileService; import de.ozgcloud.command.Command; import de.ozgcloud.command.CommandCreatedEventTestFactory; import de.ozgcloud.command.CommandTestFactory; @@ -47,9 +45,6 @@ class CollaborationEventListenerITCase { @Autowired private ApplicationEventPublisher publisher; - @MockBean - private OzgCloudFileService fileService; - @Nested class TestOnCreateCollaborationRequest { diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationEventListenerTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationEventListenerTest.java index 156357796a36456b42b4a643c109290a7c154c31..36cb45c71ebf7b08ac03085931b2b3661a236e3a 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationEventListenerTest.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationEventListenerTest.java @@ -30,8 +30,11 @@ import static org.mockito.Mockito.*; import java.util.function.Consumer; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.mockito.ArgumentCaptor; import org.mockito.Captor; import org.mockito.InjectMocks; @@ -85,23 +88,49 @@ class CollaborationEventListenerTest { private final Command command = CommandTestFactory.createBuilder().build(); - @Mock - private CollaborationRequest collaborationRequest; + @Captor + private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor; @Test void shouldCallCommandMapper() { + when(commandMapper.toCollaborationRequest(any())).thenReturn(CollaborationRequestTestFactory.create()); + eventListener.createCollaborationRequest(command); verify(commandMapper).toCollaborationRequest(command); } @Test - void shouldCallCollaborationService() { + void shouldCallCreateCollaborationRequest() { + var collaborationRequest = CollaborationRequestTestFactory.create(); when(commandMapper.toCollaborationRequest(any())).thenReturn(collaborationRequest); eventListener.createCollaborationRequest(command); - verify(collaborationService).createCollaborationRequest(any()); + verify(collaborationService).createCollaborationRequest(collaborationRequest); + } + + @Test + void shouldCallCreateFachstellenBeteiligungRequest() { + var collaborationRequest = CollaborationRequestTestFactory.createBuilder().collaborationLevel(4).build(); + when(commandMapper.toCollaborationRequest(any())).thenReturn(collaborationRequest); + + eventListener.createCollaborationRequest(command); + + verify(collaborationService).createFachstellenBeteiligungRequest(collaborationRequest); + } + + @DisplayName("should decline request") + @ParameterizedTest(name = "when collaboration level is {0}") + @ValueSource(ints = { 0, 2, 3, 5 }) + void shouldDeclineRequest(int collaborationLevel) { + var collaborationRequest = CollaborationRequestTestFactory.createBuilder().collaborationLevel(collaborationLevel).build(); + when(commandMapper.toCollaborationRequest(any())).thenReturn(collaborationRequest); + + eventListener.createCollaborationRequest(command); + + verify(eventPublisher).publishEvent(commandFailedEventCaptor.capture()); + assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId()); } } diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationManagerCollaborationRequestMapperTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationManagerCollaborationRequestMapperTest.java index 4a8e67c2aacd0ba26ff32d76f55e2826d48ee553..a2d3e144c4aee4c3e33292c94beeabd531058086 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationManagerCollaborationRequestMapperTest.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationManagerCollaborationRequestMapperTest.java @@ -247,7 +247,7 @@ class CollaborationManagerCollaborationRequestMapperTest { void shouldSetCollaborationLevel() { var result = toItemMap(); - assertThat(result).containsEntry(CollaborationRequest.PROPERTY_COLLABORATION_LEVEL, CollaborationRequestTestFactory.COLLABORATION_lEVEL); + assertThat(result).containsEntry(CollaborationRequest.PROPERTY_COLLABORATION_LEVEL, CollaborationRequestTestFactory.COLLABORATION_LEVEL); } private Map<String, Object> toItemMap() { diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationRequestTestFactory.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationRequestTestFactory.java index def4d10956d30890b57d3cf9de9adc14ac4620c6..cd688e0978b77b7dde491dd71892eac7911d99b4 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationRequestTestFactory.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationRequestTestFactory.java @@ -32,7 +32,7 @@ public class CollaborationRequestTestFactory { public static final String ANFRAGE = "Anfrage"; public static final String ZUSTAENDIGE_STELLE = "zustaendige-stelle"; public static final String COLLABORATION_VORGAENG_ID = "collaboration-vorgaeng-id"; - public static final int COLLABORATION_lEVEL = 1; + public static final int COLLABORATION_LEVEL = 1; public static CollaborationRequest create() { return createBuilder().build(); @@ -47,6 +47,6 @@ public class CollaborationRequestTestFactory { .titel(TITEL) .anfrage(ANFRAGE) .zustaendigeStelle(ZUSTAENDIGE_STELLE) - .collaborationLevel(COLLABORATION_lEVEL); + .collaborationLevel(COLLABORATION_LEVEL); } } diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java index f76bc81cecb3e09161f1713ea87bb52e9bea2171..52847525b2a2aa2cd7f1758642374280ab5fe616 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceITCase.java @@ -33,9 +33,7 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; import org.junit.jupiter.params.provider.ValueSource; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; -import de.ozgcloud.apilib.file.OzgCloudFileService; import de.ozgcloud.common.test.ITCase; @ITCase @@ -44,9 +42,6 @@ class CollaborationServiceITCase { @Autowired private CollaborationService service; - @MockBean - private OzgCloudFileService fileService; - @Nested class TestCreateCollaborationRequest { @@ -80,4 +75,38 @@ class CollaborationServiceITCase { Assertions.assertThrows(ConstraintViolationException.class, () -> service.createCollaborationRequest(request)); } } + + @Nested + class TestCreateFachstellenBeteiligungRequest { + + @DisplayName("validate titel") + @ParameterizedTest(name = "should throw exception on titel: \"{0}\"") + @NullAndEmptySource + @ValueSource(strings = { StringUtils.SPACE }) + void shouldValidateTitel(String titel) { + var request = CollaborationRequestTestFactory.createBuilder().titel(titel).build(); + + Assertions.assertThrows(ConstraintViolationException.class, () -> service.createFachstellenBeteiligungRequest(request)); + } + + @DisplayName("validate anfrage") + @ParameterizedTest(name = "should throw exception on anfrage: \"{0}\"") + @NullAndEmptySource + @ValueSource(strings = { StringUtils.SPACE }) + void shouldValidateAnfrage(String anfrage) { + var request = CollaborationRequestTestFactory.createBuilder().anfrage(anfrage).build(); + + Assertions.assertThrows(ConstraintViolationException.class, () -> service.createFachstellenBeteiligungRequest(request)); + } + + @DisplayName("validate zustaendigeStelle") + @ParameterizedTest(name = "should throw exception oon zustaendigeStelle: \"{0}\"") + @NullAndEmptySource + @ValueSource(strings = { StringUtils.SPACE }) + void shouldValidateCollaborationRequestTitel(String zustaendigeStelle) { + var request = CollaborationRequestTestFactory.createBuilder().zustaendigeStelle(zustaendigeStelle).build(); + + Assertions.assertThrows(ConstraintViolationException.class, () -> service.createFachstellenBeteiligungRequest(request)); + } + } } \ No newline at end of file diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java index 68b30f7562caebea5f60a864dc746a1c88d2ee11..b3bd95fbac0348b66f5a4a1a8b28ac78406c2127 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationServiceTest.java @@ -28,6 +28,8 @@ import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.*; import java.io.OutputStream; +import java.util.List; +import java.util.Map; import java.util.UUID; import org.junit.jupiter.api.BeforeEach; @@ -41,13 +43,26 @@ import org.mockito.Spy; import de.ozgcloud.apilib.common.command.OzgCloudCommand; import de.ozgcloud.apilib.common.command.OzgCloudCommandService; import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequest; +import de.ozgcloud.apilib.common.command.OzgCloudCreateSubCommandsRequestTestFactory; +import de.ozgcloud.apilib.common.command.grpc.CommandMapper; +import de.ozgcloud.apilib.common.datatypes.GenericId; import de.ozgcloud.apilib.file.OzgCloudFileId; import de.ozgcloud.apilib.file.OzgCloudFileService; +import de.ozgcloud.apilib.user.OzgCloudUserId; +import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; +import de.ozgcloud.collaboration.common.freemarker.TemplateHandler; import de.ozgcloud.collaboration.common.user.UserId; import de.ozgcloud.collaboration.common.user.UserProfile; import de.ozgcloud.collaboration.common.user.UserProfileService; +import de.ozgcloud.collaboration.vorgang.PostfachAddressTestFactory; +import de.ozgcloud.collaboration.vorgang.ServiceKonto; +import de.ozgcloud.collaboration.vorgang.ServiceKontoTestFactory; +import de.ozgcloud.collaboration.vorgang.Vorgang; +import de.ozgcloud.collaboration.vorgang.VorgangHeaderTestFactory; import de.ozgcloud.collaboration.vorgang.VorgangService; +import de.ozgcloud.collaboration.vorgang.VorgangTestFactory; import de.ozgcloud.command.CommandTestFactory; +import de.ozgcloud.common.datatype.StringBasedValue; class CollaborationServiceTest { @@ -65,6 +80,10 @@ class CollaborationServiceTest { private CollaborationManagerCollaborationRequestMapper collaborationRequestMapper; @Mock private OzgCloudFileService fileService; + @Mock + private CommandMapper commandMapper; + @Mock + private TemplateHandler templateHandler; @Nested class TestCreateCollaborationRequest { @@ -250,4 +269,357 @@ class CollaborationServiceTest { verify(fileService).writeFileDataToStream(fileId, stream); } } + + @Nested + class TestCreateFachstellenBeteiligungRequest { + + private static final Vorgang VORGANG = VorgangTestFactory.create(); + private static final CollaborationRequest ENRICHED_REQUEST = CollaborationRequestTestFactory.create(); + + @Mock + private OzgCloudCommand subCommand; + + @BeforeEach + void init() { + doReturn(List.of(subCommand)).when(service).buildSubCommands(any(), any()); + when(vorgangService.getVorgang(any())).thenReturn(VORGANG); + doReturn(ENRICHED_REQUEST).when(service).enrichCollaborationRequest(any(), any()); + } + + @Test + void shouldCallGetVorgang() { + service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create()); + + verify(vorgangService).getVorgang(CommandTestFactory.VORGANG_ID); + } + + @Test + void shouldCallEnrichCollaborationRequest() { + var collaborationRequest = CollaborationRequestTestFactory.create(); + + service.createFachstellenBeteiligungRequest(collaborationRequest); + + verify(service).enrichCollaborationRequest(collaborationRequest, VorgangTestFactory.ID.toString()); + } + + @Test + void shouldCallBuildSubCommands() { + service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create()); + + verify(service).buildSubCommands(ENRICHED_REQUEST, VorgangHeaderTestFactory.SERVICE_KONTO); + } + + @Test + void shouldCallBuildCreateSubCommandsRequest() { + service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create()); + + verify(service).buildCreateSubCommandsRequest(ENRICHED_REQUEST, List.of(subCommand)); + } + + @Test + void shouldCallAddSubCommands() { + var addSubCommandsRequest = OzgCloudCreateSubCommandsRequestTestFactory.create(); + doReturn(addSubCommandsRequest).when(service).buildCreateSubCommandsRequest(any(), any()); + + service.createFachstellenBeteiligungRequest(CollaborationRequestTestFactory.create()); + + verify(commandService).addSubCommands(addSubCommandsRequest); + } + } + + @Nested + class TestBuildCreateSubCommandsRequest { + + @Mock + private OzgCloudCommand subCommand; + + @Test + void shouldSetParentId() { + var result = buildCreateSubCommandsRequest(); + + assertThat(result.getParentId()).isEqualTo(CommandTestFactory.ID); + } + + @Test + void shouldSetExecutionMode() { + var result = buildCreateSubCommandsRequest(); + + assertThat(result.getExecutionMode()).isEqualTo(CollaborationService.SUBCOMMANDS_EXECUTION_MODE); + } + + @Test + void shouldSetCompletedIfSubsCompleted() { + var result = buildCreateSubCommandsRequest(); + + assertThat(result.isCompletedIfSubsCompleted()).isTrue(); + } + + @Test + void shouldSetSubCommands() { + var result = buildCreateSubCommandsRequest(); + + assertThat(result.getSubCommands()).containsExactly(subCommand); + } + + private OzgCloudCreateSubCommandsRequest buildCreateSubCommandsRequest() { + return service.buildCreateSubCommandsRequest(CollaborationRequestTestFactory.create(), List.of(subCommand)); + } + } + + @Nested + class TestBuildSubCommands { + + private static final CollaborationRequest COLLABORATION_REQUEST = CollaborationRequestTestFactory.create(); + + @Mock + private OzgCloudCommand persistCollaborationRequestCommand; + @Mock + private OzgCloudCommand sendPostfachNachrichtCommand; + + @BeforeEach + void init() { + when(collaborationRequestMapper.toOzgCloudCommand(any(), any())).thenReturn(persistCollaborationRequestCommand); + doReturn(sendPostfachNachrichtCommand).when(service).buildSendPostfachNachrichtCommand(any(), any()); + } + + @Test + void shouldCallCollaborationRequestMapper() { + buildSubCommands(); + + verify(collaborationRequestMapper).toOzgCloudCommand(any(), eq(CollaborationService.CREATE_ATTACHED_ITEM_ORDER)); + } + + @Test + void shouldCallBuildSendPostfachNachrichtCommand() { + buildSubCommands(); + + verify(service).buildSendPostfachNachrichtCommand(COLLABORATION_REQUEST, VorgangHeaderTestFactory.SERVICE_KONTO); + } + + @Test + void shouldAddSubCommands() { + var result = buildSubCommands(); + + assertThat(result).containsExactly(persistCollaborationRequestCommand, sendPostfachNachrichtCommand); + } + + private List<OzgCloudCommand> buildSubCommands() { + return service.buildSubCommands(COLLABORATION_REQUEST, VorgangHeaderTestFactory.SERVICE_KONTO); + } + } + + @Nested + class TestBuildSendPostfachNachrichtCommand { + + private static final CollaborationRequest COLLABORATION_REQUEST = CollaborationRequestTestFactory.create(); + private static final ServiceKonto.PostfachAddress POSTFACH_ADDRESS = PostfachAddressTestFactory.create(); + private static final ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.createBuilder().clearAddresses().address(POSTFACH_ADDRESS).build(); + private static final OzgCloudUserId OZG_CLOUD_ID = OzgCloudUserId.from(CommandTestFactory.CREATED_BY); + private static final Map<String, Object> OBJECT_MAP = Map.of("key", "value"); + private static final OzgCloudVorgangId VORGANG_ID = OzgCloudVorgangId.from(VorgangTestFactory.ID.toString()); + private static final StringBasedValue RELATION_ID = GenericId.from(VorgangTestFactory.ID.toString()); + + @BeforeEach + void init() { + when(commandMapper.toOzgCloudVorgangId(anyString())).thenReturn(VORGANG_ID); + when(commandMapper.mapRelationId(anyString())).thenReturn(RELATION_ID); + when(commandMapper.toOzgCloudUserId(anyString())).thenReturn(OZG_CLOUD_ID); + doReturn(OBJECT_MAP).when(service).buildPostfachSendNachrichtCommandBody(any()); + } + + @Test + void shouldCallBuildPostfachAddress() { + buildSendPostfachNachrichtCommand(); + + verify(service).buildPostfachAddress(POSTFACH_ADDRESS, ServiceKontoTestFactory.TYPE); + } + + @Test + void shouldCallBuildSenNachrichtCommandBody() { + var postfachAddressMap = Map.<String, Object>of("key", "value"); + doReturn(postfachAddressMap).when(service).buildPostfachAddress(any(), any()); + + buildSendPostfachNachrichtCommand(); + + verify(service).buildPostfachSendNachrichtCommandBody(postfachAddressMap); + } + + @Test + void shouldSetBodyObject() { + var result = buildSendPostfachNachrichtCommand(); + + assertThat(result.getBodyObject()).isSameAs(OBJECT_MAP); + } + + @Test + void shouldCallMapVorgangId() { + buildSendPostfachNachrichtCommand(); + + verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID); + } + + @Test + void shouldSetVorgangId() { + var result = buildSendPostfachNachrichtCommand(); + + assertThat(result.getVorgangId()).isEqualTo(VORGANG_ID); + } + + @Test + void shouldCallMapRelationId() { + buildSendPostfachNachrichtCommand(); + + verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID); + } + + @Test + void shouldSetRelationId() { + var result = buildSendPostfachNachrichtCommand(); + + assertThat(result.getRelationId()).isEqualTo(RELATION_ID); + } + + @Test + void shouldSetOrder() { + var result = buildSendPostfachNachrichtCommand(); + + assertThat(result.getOrder()).isEqualTo(CollaborationService.SEND_POSTFACH_NACHRICHT_ORDER); + } + + @Test + void shouldCallMapToOzgCloudUserId() { + buildSendPostfachNachrichtCommand(); + + verify(commandMapper).toOzgCloudUserId(CommandTestFactory.CREATED_BY); + } + + @Test + void shouldSetCreatedBy() { + var result = buildSendPostfachNachrichtCommand(); + + assertThat(result.getCreatedBy()).isEqualTo(OZG_CLOUD_ID); + } + + private OzgCloudCommand buildSendPostfachNachrichtCommand() { + return service.buildSendPostfachNachrichtCommand(COLLABORATION_REQUEST, SERVICE_KONTO); + } + } + + @Nested + class TestBuildPostfachAddress { + + @Test + void shouldSetType() { + var result = buildPostfachAddress(); + + assertThat(result).containsEntry(ServiceKonto.PostfachAddress.FIELD_TYPE, PostfachAddressTestFactory.TYPE); + } + + @Test + void shouldSetVersion() { + var result = buildPostfachAddress(); + + assertThat(result).containsEntry(ServiceKonto.PostfachAddress.FIELD_VERSION, PostfachAddressTestFactory.VERSION); + } + + @Test + void shouldSetIdentifier() { + var result = buildPostfachAddress(); + + assertThat(result).extracting(ServiceKonto.PostfachAddress.FIELD_IDENTIFIER, MAP).containsValue(PostfachAddressTestFactory.POSTFACH_ID); + } + + @Test + void shouldSetServicekontoType() { + var result = buildPostfachAddress(); + + assertThat(result).containsEntry(ServiceKonto.FIELD_SERVICEKONTO_TYPE, ServiceKontoTestFactory.TYPE); + } + + private Map<String, Object> buildPostfachAddress() { + return service.buildPostfachAddress(PostfachAddressTestFactory.create(), ServiceKontoTestFactory.TYPE); + } + } + + @Nested + class TestBuildSendNachrichtCommandBody { + + private static final Map<String, Object> POSTFACH_ADDRESS = Map.of("key", "value"); + + @BeforeEach + void init() { + doReturn(CollaborationRequestTestFactory.ANFRAGE).when(service).getAnfrageText(); + } + + @Test + void shouldSetReplyOption() { + var result = buildSendNachrichtCommandBody(); + + assertThat(result).containsEntry(CollaborationService.FIELD_REPLY_OPTION, CollaborationService.REPLY_OPTION); + } + + @Test + void shouldSetSubject() { + var result = buildSendNachrichtCommandBody(); + + assertThat(result).containsEntry(CollaborationService.FIELD_SUBJECT, CollaborationService.SUBJECT); + } + + @Test + void shouldSetMailBody() { + var result = buildSendNachrichtCommandBody(); + + assertThat(result).containsEntry(CollaborationService.FIELD_MAIL_BODY, CollaborationRequestTestFactory.ANFRAGE); + } + + private Map<String, Object> buildSendNachrichtCommandBody() { + return service.buildPostfachSendNachrichtCommandBody(POSTFACH_ADDRESS); + } + } + + @Nested + class TestGetDefaultAnfrageText { + + private static final String DEFAULT_MAIL_TEXT = "default mail text"; + + @BeforeEach + void init() { + when(templateHandler.fillTemplate(anyString(), any())).thenReturn(DEFAULT_MAIL_TEXT); + } + + @Test + void shouldCallGetTemplateParameters() { + service.getAnfrageText(); + + verify(service).getTemplateParameters(); + } + + @Test + void shouldCallTemplateHandler() { + var templateParameters = Map.<String, Object>of("key", "value "); + doReturn(templateParameters).when(service).getTemplateParameters(); + + service.getAnfrageText(); + + verify(templateHandler).fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, templateParameters); + } + + @Test + void shouldReturnDefaultMailText() { + var result = service.getAnfrageText(); + + assertThat(result).isEqualTo(DEFAULT_MAIL_TEXT); + } + } + + @Nested + class TestGetTemplateParameters { + + @Test + void shouldReturnTemplateParameters() { + var result = service.getTemplateParameters(); + + assertThat(result).isEmpty(); + } + } } \ No newline at end of file diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationTestApplication.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationTestApplication.java index 9bf930073cd946f9f074a695515798666b7153f9..bf468f441f461a5b7f3ec2d1c38c2b2fdd4254a6 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationTestApplication.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/CollaborationTestApplication.java @@ -34,6 +34,7 @@ import org.springframework.security.authentication.AuthenticationTrustResolverIm import de.ozgcloud.apilib.common.command.grpc.CommandMapper; import de.ozgcloud.apilib.common.command.grpc.CommandMapperImpl; +import de.ozgcloud.apilib.file.OzgCloudFileService; import de.ozgcloud.apilib.vorgang.OzgCloudVorgangService; import de.ozgcloud.apilib.vorgang.grpc.GrpcOzgCloudVorgangService; import de.ozgcloud.apilib.vorgang.grpc.OzgCloudVorgangMapper; @@ -52,6 +53,8 @@ public class CollaborationTestApplication { private OzgCloudVorgangMapper vorgangMapper; @MockBean private CollaborationManagerCallContextProvider contextProvider; + @MockBean + private OzgCloudFileService ozgCloudFileService; public static void main(String[] args) { TimeZone.setDefault(TimeZone.getTimeZone("UTC")); @@ -72,4 +75,5 @@ public class CollaborationTestApplication { OzgCloudVorgangService ozgCloudVorgangService() { return new GrpcOzgCloudVorgangService(vorgangServiceStub, vorgangMapper, vorgangStubMapper, contextProvider); } + } diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandlerITCase.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandlerITCase.java new file mode 100644 index 0000000000000000000000000000000000000000..faac634359143e548636ed8bf0503c5719555ea3 --- /dev/null +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/common/freemarker/TemplateHandlerITCase.java @@ -0,0 +1,92 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.collaboration.common.freemarker; + +import static org.assertj.core.api.Assertions.*; + +import java.util.Collections; +import java.util.Map; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import de.ozgcloud.collaboration.CollaborationService; +import de.ozgcloud.common.test.ITCase; + +@ITCase +class TemplateHandlerITCase { + + @Autowired + private TemplateHandler handler; + + @DisplayName("Get raw template") + @Nested + class TestGetRawTemplate { + + @Test + void shouldReturnTemplateAsString() { + var content = handler.getRawTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE); + + assertThat(content) + .contains("Hallo Fachstelle,") + .contains("bitte bearbeiten:") + .contains("${url!\"http://www.host.local\"}") + .contains("Danke") + .contains("Verwaltung"); + } + } + + @DisplayName("Fill template") + @Nested + class TestFillTemplate { + + @Test + void shouldReturnFilledTemplate() { + var value = "http://test.url"; + var content = handler.fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, + Map.of(CollaborationService.KEY_TEMPLATE_URL, value)); + + assertThat(content) + .contains("Hallo Fachstelle,") + .contains("bitte bearbeiten:") + .contains(value) + .contains("Danke") + .contains("Verwaltung"); + } + + @Test + void shouldReturnWithDefaultValue() { + var content = handler.fillTemplate(CollaborationService.COLLABORATION_NACHRICHT_TEMPLATE, Collections.emptyMap()); + + assertThat(content) + .contains("Hallo Fachstelle,") + .contains("bitte bearbeiten:") + .contains("http://www.host.local") + .contains("Danke") + .contains("Verwaltung"); + } + } +} diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/CollaborationServiceKontoMapperTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/CollaborationServiceKontoMapperTest.java new file mode 100644 index 0000000000000000000000000000000000000000..88d55e54875c2163ff2a17077b2d93998bdfcefa --- /dev/null +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/CollaborationServiceKontoMapperTest.java @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.collaboration.vorgang; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; +import org.mapstruct.factory.Mappers; +import org.springframework.test.util.ReflectionTestUtils; + +import de.ozgcloud.apilib.vorgang.OzgCloudServiceKonto; +import de.ozgcloud.apilib.vorgang.OzgCloudServiceKontoTestFactory; +import de.ozgcloud.apilib.vorgang.OzgCloudTrustLevel; +import de.ozgcloud.apilib.vorgang.grpc.GrpcServiceKontoTestFactory; +import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; + +class CollaborationServiceKontoMapperTest { + + private final CollaborationServiceKontoMapper mapper = Mappers.getMapper(CollaborationServiceKontoMapper.class); + + private final GrpcObjectMapper grpcObjectMapper = Mappers.getMapper(GrpcObjectMapper.class); + + @BeforeEach + void init() { + ReflectionTestUtils.setField(mapper, "grpcObjectMapper", grpcObjectMapper); + } + + @Nested + class TestFromServiceKonto { + + private static final OzgCloudServiceKonto SERVICE_KONTO = OzgCloudServiceKontoTestFactory.createBuilder() + .trustLevel(OzgCloudTrustLevel.from(ServiceKontoTestFactory.TRUST_LEVEL.getValue())).build(); + + @Test + void shouldMapServiceKonto() { + var result = mapper.fromServiceKonto(SERVICE_KONTO); + + assertThat(result).usingRecursiveComparison().isEqualTo(ServiceKontoTestFactory.create()); + } + } + + @Nested + class TestToServiceKonto { + + private static final ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.create(); + + @Test + void shouldMapServiceKonto() { + var grpcServiceKonto = GrpcServiceKontoTestFactory.createBuilder().setTrustLevel(ServiceKontoTestFactory.TRUST_LEVEL.getValue()) + .build(); + + var result = mapper.toServiceKonto(SERVICE_KONTO); + + assertThat(result).usingRecursiveComparison().isEqualTo(grpcServiceKonto); + } + } +} \ No newline at end of file diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/CollaborationVorgangMapperTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/CollaborationVorgangMapperTest.java index 9d9e42a9a16070bb70aa471743d3f63369e66bad..0eceb189917f3533eb22914963df9db7103e8cb8 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/CollaborationVorgangMapperTest.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/CollaborationVorgangMapperTest.java @@ -1,3 +1,26 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ package de.ozgcloud.collaboration.vorgang; import static org.assertj.core.api.Assertions.*; @@ -22,9 +45,11 @@ class CollaborationVorgangMapperTest { @InjectMocks private final CollaborationVorgangMapper mapper = Mappers.getMapper(CollaborationVorgangMapper.class); @Mock - private final CollaborationEingangMapper eingangMapper = Mappers.getMapper(CollaborationEingangMapper.class); + private CollaborationEingangMapper eingangMapper; @Mock - private final CollaborationRequestMapper collaborationRequestMapper = Mappers.getMapper(CollaborationRequestMapper.class); + private CollaborationRequestMapper collaborationRequestMapper; + @Mock + private CollaborationServiceKontoMapper serviceKontoMapper; @DisplayName("From ozgCloudVorgang") @Nested @@ -39,6 +64,7 @@ class CollaborationVorgangMapperTest { @BeforeEach void mock() { when(eingangMapper.fromOzgCloudEingang(any())).thenReturn(EingangTestFactory.create()); + when(serviceKontoMapper.fromServiceKonto(any())).thenReturn(ServiceKontoTestFactory.create()); } @Test @@ -48,6 +74,13 @@ class CollaborationVorgangMapperTest { verify(eingangMapper).fromOzgCloudEingang(ozgCloudEingang); } + @Test + void shouldCallServiceKontoMapper() { + mapper.fromOzgCloudVorgang(ozgCloudVorgang); + + verify(serviceKontoMapper).fromServiceKonto(ozgCloudVorgang.getHeader().getServiceKonto()); + } + @Test void shouldMap() { var mappedVorgang = mapper.fromOzgCloudVorgang(ozgCloudVorgang); @@ -85,7 +118,7 @@ class CollaborationVorgangMapperTest { void shouldMap() { var vorgang = mapper.toGrpc(VorgangTestFactory.create()); - assertThat(vorgang).usingRecursiveComparison().ignoringFields("memoizedHashCode").isEqualTo(GrpcVorgangTestFactory.create()); + assertThat(vorgang).usingRecursiveComparison().isEqualTo(GrpcVorgangTestFactory.create()); } } } \ No newline at end of file diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/PostfachAddressTestFactory.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/PostfachAddressTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..8c20d290e025239ef8a531ea9c8de43c0733abca --- /dev/null +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/PostfachAddressTestFactory.java @@ -0,0 +1,48 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.collaboration.vorgang; + +import java.util.Map; + +import de.ozgcloud.apilib.vorgang.OzgCloudPostfachAddressIdentifierTestFactory; +import de.ozgcloud.collaboration.vorgang.ServiceKonto.PostfachAddress; +import de.ozgcloud.collaboration.vorgang.ServiceKonto.PostfachAddress.PostfachAddressBuilder; + +public class PostfachAddressTestFactory { + + public static final String VERSION = "1.0"; + public static final int TYPE = 1; + public static final String POSTFACH_ID = "0815"; + + public static PostfachAddress create() { + return createBuilder().build(); + } + + public static PostfachAddressBuilder createBuilder() { + return PostfachAddress.builder() + .version(VERSION) + .type(TYPE) + .identifier(Map.of(OzgCloudPostfachAddressIdentifierTestFactory.NAME, POSTFACH_ID)); + } +} diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/ServiceKontoTestFactory.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/ServiceKontoTestFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..b7e01059f1f4adbe6ae885320e6a798aa7537dc9 --- /dev/null +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/ServiceKontoTestFactory.java @@ -0,0 +1,44 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.collaboration.vorgang; + +import de.ozgcloud.collaboration.vorgang.ServiceKonto.ServiceKontoBuilder; + +public class ServiceKontoTestFactory { + + public static final TrustLevel TRUST_LEVEL = TrustLevel.LEVEL_1; + public static final String TYPE = "type"; + public static final ServiceKonto.PostfachAddress POSTFACH_ADDRESS = PostfachAddressTestFactory.create(); + + public static ServiceKonto create() { + return createBuilder().build(); + } + + public static ServiceKontoBuilder createBuilder() { + return ServiceKonto.builder() + .type(TYPE) + .trustLevel(TRUST_LEVEL) + .address(POSTFACH_ADDRESS); + } +} diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/TrustLevelTest.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/TrustLevelTest.java new file mode 100644 index 0000000000000000000000000000000000000000..ff9dbfae3a6f75a0f6f3c0854b950249f5d1a546 --- /dev/null +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/TrustLevelTest.java @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2024 Das Land Schleswig-Holstein vertreten durch den + * Ministerpräsidenten des Landes Schleswig-Holstein + * Staatskanzlei + * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung + * + * Lizenziert unter der EUPL, Version 1.2 oder - sobald + * diese von der Europäischen Kommission genehmigt wurden - + * Folgeversionen der EUPL ("Lizenz"); + * Sie dürfen dieses Werk ausschließlich gemäß + * dieser Lizenz nutzen. + * Eine Kopie der Lizenz finden Sie hier: + * + * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + * + * Sofern nicht durch anwendbare Rechtsvorschriften + * gefordert oder in schriftlicher Form vereinbart, wird + * die unter der Lizenz verbreitete Software "so wie sie + * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN - + * ausdrücklich oder stillschweigend - verbreitet. + * Die sprachspezifischen Genehmigungen und Beschränkungen + * unter der Lizenz sind dem Lizenztext zu entnehmen. + */ +package de.ozgcloud.collaboration.vorgang; + +import static org.assertj.core.api.Assertions.*; + +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; +import org.junit.jupiter.api.Test; + +import de.ozgcloud.apilib.vorgang.OzgCloudTrustLevel; + +class TrustLevelTest { + + @DisplayName("From string") + @Nested + class TestFromString { + + @DisplayName("should return TrustLevel if value matches with existing") + @Test + void shouldReturnTrustLevel() { + var trustLevelValue = OzgCloudTrustLevel.from(TrustLevel.LEVEL_2.getValue()); + + var trustLevel = TrustLevel.from(trustLevelValue); + + assertThat(trustLevel).isEqualTo(TrustLevel.LEVEL_2); + } + + @Test + void shouldThrowExceptionIfValueNotMatches() { + var trustLevelValue = OzgCloudTrustLevel.from("quatsch"); + + assertThatThrownBy(() -> TrustLevel.from(trustLevelValue)).isInstanceOf(IllegalArgumentException.class); + } + } +} diff --git a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/VorgangHeaderTestFactory.java b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/VorgangHeaderTestFactory.java index 0dd77436474c823413748fe40134f5032e35fda0..9a5736132b24dadfe3c03a2d0a83002deafac596 100644 --- a/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/VorgangHeaderTestFactory.java +++ b/collaboration-manager-server/src/test/java/de/ozgcloud/collaboration/vorgang/VorgangHeaderTestFactory.java @@ -2,11 +2,12 @@ package de.ozgcloud.collaboration.vorgang; import java.time.ZonedDateTime; -class VorgangHeaderTestFactory { +public class VorgangHeaderTestFactory { public final static String CREATED_AT_STR = "2023-04-01T10:00:15Z"; public final static ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR); public final static String AKTENZEICHEN = "DE_12345_XY"; + public final static ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.create(); public static VorgangHeader create() { return createBuilder().build(); @@ -15,6 +16,7 @@ class VorgangHeaderTestFactory { public static VorgangHeader.VorgangHeaderBuilder createBuilder() { return VorgangHeader.builder() .createdAt(CREATED_AT) - .aktenzeichen(AKTENZEICHEN); + .aktenzeichen(AKTENZEICHEN) + .serviceKonto(SERVICE_KONTO); } }