diff --git a/.gitignore b/.gitignore index 3fc1d884b983db7cd48581b4198239e70ebc5119..174f39620a3a67eaad565eae9eaff3b03614809e 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ target/ .idea *.iml *.orig +.vscode/ diff --git a/bescheid-manager/pom.xml b/bescheid-manager/pom.xml index d69aa225b87cbc83242e60f10776d5b36a3e26a4..3fb3aa6e717be3bd4cc608bc22f85401fbb5b878 100644 --- a/bescheid-manager/pom.xml +++ b/bescheid-manager/pom.xml @@ -17,12 +17,18 @@ <properties> <vorgang-manager.version>2.13.0</vorgang-manager.version> <nachrichten-manager.version>2.9.0</nachrichten-manager.version> + <document-manager.version>1.0.0-PR-1-SNAPSHOT</document-manager.version> <api-lib.version>0.12.0</api-lib.version> <spring-cloud-config-client.version>4.1.3</spring-cloud-config-client.version> </properties> <dependencies> <!-- ozg-cloud --> + <dependency> + <groupId>de.ozgcloud.document</groupId> + <artifactId>document-manager-server</artifactId> + <version>${document-manager.version}</version> + </dependency> <dependency> <groupId>de.ozgcloud.vorgang</groupId> <artifactId>vorgang-manager-interface</artifactId> @@ -109,7 +115,8 @@ </dependency> - <!--dev tools--> + <!--dev + tools--> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> @@ -133,4 +140,4 @@ </plugin> </plugins> </build> -</project> +</project> \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java deleted file mode 100644 index 63f65d84733dae7ab98e63095234692c04f09dc7..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/Bescheid.java +++ /dev/null @@ -1,77 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.time.LocalDate; -import java.util.List; -import java.util.Optional; - -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.common.binaryfile.FileId; -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; - -@Builder(toBuilder = true) -@Getter -public class Bescheid { - - public static final String FIELD_VORGANG_ID = "vorgangId"; - public static final String FIELD_CREATED_BY = "createdBy"; - - public static final String FIELD_BEWILLIGT = "bewilligt"; - public static final String FIELD_STATUS = "status"; - public static final String FIELD_BESCHEID_DOCUMENT = "bescheidDocument"; - public static final String FIELD_BESCHIEDEN_AM = "beschiedenAm"; - public static final String FIELD_SEND_BY = "sendBy"; - - public static final String FIELD_NACHRICHT_TEXT = "nachrichtText"; - public static final String FIELD_NACHRICHT_SUBJECT = "nachrichtSubject"; - public static final String FIELD_ATTACHMENTS = "attachments"; - public static final String FIELD_SENT_INFO = "sentInfo"; - - private BescheidId id; - private long version; - - private VorgangId vorgangId; - private UserId createdBy; - - private boolean bewilligt; - private Status status; - private FileId bescheidDocument; - private LocalDate beschiedenAm; - private SendBy sendBy; - - private SentInfo sentInfo; - - @Builder.Default - private Optional<String> nachrichtSubject = Optional.empty(); - @Builder.Default - private Optional<String> nachrichtText = Optional.empty(); - - @Singular - private List<FileId> attachments; - - public enum Status { - DRAFT, SENT; - - public boolean not(Object value) { - return !hasValue(value); - } - - public boolean hasValue(Object value) { - return this.name().equalsIgnoreCase(String.valueOf(value)); - } - } - - public enum SendBy { - NACHRICHT, MANUAL; - - public boolean notValue(Object sendByValue) { - return !hasValue(sendByValue); - } - - public boolean hasValue(Object sendByValue) { - return this.name().equalsIgnoreCase(String.valueOf(sendByValue)); - } - - } -} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCallContextAttachingInterceptor.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCallContextAttachingInterceptor.java deleted file mode 100644 index c3e424ba83e903aee750e69067b037cd5a6e4875..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCallContextAttachingInterceptor.java +++ /dev/null @@ -1,61 +0,0 @@ -package de.ozgcloud.bescheid; - -import static de.ozgcloud.common.grpc.GrpcUtil.*; - -import java.util.UUID; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; - -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import io.grpc.CallOptions; -import io.grpc.Channel; -import io.grpc.ClientCall; -import io.grpc.ClientInterceptor; -import io.grpc.ForwardingClientCall.SimpleForwardingClientCall; -import io.grpc.Metadata; -import io.grpc.MethodDescriptor; - -@Component("bescheidCallContextInterceptor") -public class BescheidCallContextAttachingInterceptor implements ClientInterceptor { - - public static final String BESCHEID_MANAGER_CLIENT_NAME = "OzgCloud_BescheidManager"; - - @Autowired - private CurrentUserService userService; - - // <A> = Request, <B> = Response - @Override - public <A, B> ClientCall<A, B> interceptCall(MethodDescriptor<A, B> method, CallOptions callOptions, Channel next) { - return new CallContextAttachingClientCall<>(next.newCall(method, callOptions)); - } - - final class CallContextAttachingClientCall<A, B> extends SimpleForwardingClientCall<A, B> { - - protected CallContextAttachingClientCall(ClientCall<A, B> delegate) { - super(delegate); - } - - @Override - public void start(Listener<B> responseListener, Metadata headers) { - headers.merge(buildCallContextMetadata()); - super.start(responseListener, headers); - } - - private Metadata buildCallContextMetadata() { - var metadata = new Metadata(); - - userService.getUser().getUserId().ifPresent(userId -> metadata.put(HEADER_KEY_USER_ID, userId.getBytes())); - metadata.put(HEADER_KEY_CLIENT_NAME, BESCHEID_MANAGER_CLIENT_NAME.getBytes()); - metadata.put(HEADER_KEY_REQUEST_ID, generateRequestId().getBytes()); - - return metadata; - } - - // TODO requestId für command handling uebertragen / erstellen - private String generateRequestId() { - return UUID.randomUUID().toString(); - } - - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCreatedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCreatedEvent.java deleted file mode 100644 index 237f07e8205b684d16980017556901a95034ec2f..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidCreatedEvent.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.ozgcloud.bescheid; - -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandExecutedEvent; - -class BescheidCreatedEvent extends CommandExecutedEvent { - - public BescheidCreatedEvent(Command command) { - super(command.getId()); - } - - public BescheidCreatedEvent(Command command, String createdItemId) { - super(command, createdItemId); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidDeletedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidDeletedEvent.java deleted file mode 100644 index dd8fc4c9c180a9bd7125415509125ad57ab830a0..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidDeletedEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.bescheid; - -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandExecutedEvent; - -class BescheidDeletedEvent extends CommandExecutedEvent { - - public BescheidDeletedEvent(Command command) { - super(command); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java deleted file mode 100644 index 3beaadf3f4fd167bba8a29b34c613afe2348604c..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidEventListener.java +++ /dev/null @@ -1,226 +0,0 @@ -/* - * 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.bescheid; - -import static java.util.Objects.*; - -import java.time.LocalDate; -import java.util.Arrays; -import java.util.Optional; -import java.util.function.Consumer; -import java.util.function.Predicate; -import java.util.stream.Collectors; - -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.event.EventListener; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.stereotype.Component; - -import de.ozgcloud.bescheid.Bescheid.SendBy; -import de.ozgcloud.bescheid.binaryfile.BinaryFileService; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.bescheid.common.user.UserProfileService; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandCreatedEvent; -import de.ozgcloud.command.CommandExecutedEvent; -import de.ozgcloud.command.CommandFailedEvent; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.BescheidDocumentCreatedEvent; -import de.ozgcloud.document.Document; -import de.ozgcloud.document.DocumentService; -import lombok.NonNull; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Log4j2 -@Component -@RequiredArgsConstructor -class BescheidEventListener { - - public static final String CREATE_BESCHEID_ORDER = "CREATE_BESCHEID"; - public static final String DELETE_BESCHEID_ORDER = "DELETE_BESCHEID"; - public static final String UPDATE_BESCHEID_ORDER = "UPDATE_BESCHEID"; - public static final String CREATE_BESCHEID_DOCUMENT_ORDER = "CREATE_BESCHEID_DOCUMENT"; - public static final String SEND_BESCHEID_ORDER = "SEND_BESCHEID"; - - public static final Predicate<Command> IS_CREATE_BESCHEID_COMMAND = command -> CREATE_BESCHEID_ORDER.equals(command.getOrder()); - private static final String IS_CREATE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_CREATE_BESCHEID_COMMAND.test(event.getSource())}"; - - public static final Predicate<Command> IS_DELETE_BESCHEID_COMMAND = command -> DELETE_BESCHEID_ORDER.equals(command.getOrder()); - private static final String IS_DELETE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_DELETE_BESCHEID_COMMAND.test(event.getSource())}"; - - public static final Predicate<Command> IS_UPDATE_BESCHEID_COMMAND = command -> UPDATE_BESCHEID_ORDER.equals(command.getOrder()); - private static final String IS_UPDATE_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_UPDATE_BESCHEID_COMMAND.test(event.getSource())}"; - - public static final Predicate<Command> IS_CREATE_BESCHEID_DOCUMENT_COMMAND = command -> CREATE_BESCHEID_DOCUMENT_ORDER.equals(command.getOrder()); - private static final String IS_CREATE_BESCHEID_DOCUMENT = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_CREATE_BESCHEID_DOCUMENT_COMMAND.test(event.getSource())}"; - - public static final Predicate<Command> IS_SEND_BESCHEID_COMMAND = command -> nonNull(command) && SEND_BESCHEID_ORDER.equals(command.getOrder()); - private static final String IS_SEND_BESCHEID = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_SEND_BESCHEID_COMMAND.test(event.getSource())}"; - private static final String IS_SEND_BESCHEID_ORDER = "{T(de.ozgcloud.bescheid.BescheidEventListener).IS_SEND_BESCHEID_COMMAND.test(event.getCommand())}"; - - static final String VORGANG_ID_BODY_KEY = "vorgangId"; - static final String BESCHEID_VOM_BODY_KEY = "bescheidVom"; - static final String GENEHMIGT_BODY_KEY = "genehmigt"; - - private static final String LOG_MESSAGE_TEMPLATE = "{}. Command failed."; - private static final String ERROR_MESSAGE_TEMPLATE = "Error on executing %s Command."; - - private final BescheidService service; - private final BinaryFileService fileService; - private final AttachedItemService attachedItemService; - private final DocumentService documentService; - - private final ApplicationEventPublisher eventPublisher; - private final CurrentUserService userService; - private final UserProfileService userProfileService; - - @EventListener(condition = IS_CREATE_BESCHEID) - public void onCreateBescheidCommand(CommandCreatedEvent event) { - runWithSecurityContext(event.getSource(), this::doCreateBescheid); - } - - void doCreateBescheid(Command command) { - var createdItemId = service.createBescheidDraft(command); - eventPublisher.publishEvent(new BescheidCreatedEvent(command, createdItemId)); - } - - @EventListener(condition = IS_DELETE_BESCHEID) - public void onDeleteBescheid(CommandCreatedEvent event) { - runWithSecurityContext(event.getSource(), this::doDeleteBescheid); - } - - void doDeleteBescheid(Command command) { - attachedItemService.deleteBescheidDraft(command); - eventPublisher.publishEvent(new BescheidDeletedEvent(command)); - } - - @EventListener(condition = IS_UPDATE_BESCHEID) - public void onUpdateBescheidCommand(CommandCreatedEvent event) { - runWithSecurityContext(event.getSource(), this::doUpdateBescheid); - } - - void doUpdateBescheid(Command command) { - attachedItemService.updateBescheidDraft(command, getDocument(command)); - eventPublisher.publishEvent(new BescheidUpdatedEvent(command)); - } - - Optional<Document> getDocument(Command command) { - return Optional.ofNullable(MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT)) - .map(StringUtils::trimToNull) - .map(documentService::getDocument); - } - - @EventListener(condition = IS_CREATE_BESCHEID_DOCUMENT) - public void onCreatedBescheidDocument(CommandCreatedEvent event) { - runWithSecurityContext(event.getSource(), this::doCreateBescheidDocument); - } - - void doCreateBescheidDocument(Command command) { - var bescheid = doCreateBescheidBiz(command); - var bescheidDocument = documentService.createBescheidDocument(command, bescheid); - eventPublisher.publishEvent(new BescheidDocumentCreatedEvent(command, bescheidDocument)); - } - - BescheidResponse doCreateBescheidBiz(@NonNull Command command) { - var bescheid = service.createBescheid(createRequest(command)); - return fileService.uploadBescheidFile(bescheid); - } - - @EventListener(condition = IS_SEND_BESCHEID) - public void onSendBescheidCommand(CommandCreatedEvent event) { - runWithSecurityContext(event.getSource(), this::doSendBescheid); - } - - void doSendBescheid(Command command) { - var bescheidItem = attachedItemService.getItem(command.getRelationId()); - if (SendBy.MANUAL.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY))) { - service.sendBescheidManually(bescheidItem, command); - } else if (SendBy.NACHRICHT.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY))) { - service.sendBescheidPostfachMail(bescheidItem, command); - } else { - throw new TechnicalException("Bescheid has unexpected sendBy value: '%s'. Allowed values are %s." - .formatted(bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY), - Arrays.stream(SendBy.values()).map(SendBy::name).collect(Collectors.joining(",")))); - } - eventPublisher.publishEvent(new BescheidSentEvent(command)); - } - - BescheidRequest createRequest(Command command) { - var eventBody = command.getBodyObject(); - var builder = BescheidRequest.builder(); - - builder.vorgangId(VorgangId.from(command.getVorgangId())); - Optional.ofNullable(MapUtils.getString(eventBody, BESCHEID_VOM_BODY_KEY)) - .map(LocalDate::parse).ifPresent(builder::bescheidVom); - Optional.ofNullable(MapUtils.getBoolean(eventBody, GENEHMIGT_BODY_KEY)) - .ifPresentOrElse(builder::genehmigt, () -> builder.genehmigt(true)); - builder.createFor(userProfileService.getUserProfile()); - - return builder.build(); - } - - @EventListener(condition = IS_SEND_BESCHEID_ORDER) - public void onBescheidSent(CommandExecutedEvent event) { - runWithSecurityContext(event.getCommand(), this::setAntragBewilligung); - } - - void setAntragBewilligung(Command command) { - service.setAntragBewilligung(attachedItemService.getItem(command.getRelationId())); - } - - void runWithSecurityContext(Command command, Consumer<Command> commandExecutor) { - SecurityContext prevContext = null; - try { - prevContext = userService.startSecurityContext(command); - commandExecutor.accept(command); - } catch (Exception e) { - var errorMessage = ERROR_MESSAGE_TEMPLATE.formatted(command.getOrder()); - LOG.error(LOG_MESSAGE_TEMPLATE, errorMessage, e); - eventPublisher.publishEvent(new CommandFailedEvent(command.getId(), buildErrorMessage(errorMessage, e))); - } finally { - userService.resetSecurityContext(prevContext); - } - } - - private String buildErrorMessage(String message, Exception cause) { - try { - StringBuilder sb = new StringBuilder(message); - - if (StringUtils.isNotBlank(cause.getMessage())) { - sb.append(" Cause: ").append(cause.getMessage()); - } - - return sb.toString(); - } catch (Exception e2) { - LOG.error("Error in building Error Message (sick).", e2); - return message; - } - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java index a4636f96286f70d63b1edc7c45ea6d317744cc2f..b544b196ca78f1ab9d85ea1b787d20657163b2ae 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidGrpcService.java @@ -4,13 +4,16 @@ import java.util.Optional; import java.util.stream.Stream; import de.ozgcloud.bescheid.BescheidServiceGrpc.BescheidServiceImplBase; -import de.ozgcloud.bescheid.vorgang.VorgangId; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.BescheidService; +import de.ozgcloud.document.bescheid.vorgang.VorgangId; import io.grpc.stub.StreamObserver; import lombok.RequiredArgsConstructor; import net.devh.boot.grpc.server.service.GrpcService; @GrpcService @RequiredArgsConstructor +@Deprecated class BescheidGrpcService extends BescheidServiceImplBase { private final BescheidService service; diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java deleted file mode 100644 index 4c0f60434f23ebdc201ed906cdc5eb80f9a363cd..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidId.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.bescheid; - -import de.ozgcloud.common.datatype.StringBasedValue; - -public class BescheidId extends StringBasedValue { - - BescheidId(String id) { - super(id); - } - - public static BescheidId from(String id) { - return new BescheidId(id); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfig.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfig.java deleted file mode 100644 index 7fbeae993b492c3a8f0d891641640faac9958065..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfig.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.bescheid; - -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -public class BescheidManagerConfig { - - private String version; - private String javaVersion; - private Features features; - - @Builder - @Getter - static class Features { - - private boolean canCreateBescheidDocument; - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfiguration.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfiguration.java deleted file mode 100644 index 824f5ad0608057bec16dd5ef1d701fe481d9ff71..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidManagerConfiguration.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.bescheid; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.apilib.common.command.grpc.GrpcOzgCloudCommandService; -import de.ozgcloud.bescheid.common.callcontext.BescheidManagerCallContextProvider; -import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc; -import net.devh.boot.grpc.client.inject.GrpcClient; - -@Configuration -public class BescheidManagerConfiguration { - - public static final String COMMAND_SERVICE_NAME = "bescheid_OzgCloudCommandService"; - - @GrpcClient("command-manager") - private CommandServiceGrpc.CommandServiceBlockingStub commandServiceStub; - - @Bean(COMMAND_SERVICE_NAME) - OzgCloudCommandService grpcOzgCloudCommandService(CommandMapper commandMapper, BescheidManagerCallContextProvider contextProvider) { - return new GrpcOzgCloudCommandService(commandServiceStub, commandMapper, contextProvider, - GrpcOzgCloudCommandService.DEFAULT_COMMAND_REQUEST_THRESHOLD_MILLIS); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java index 28d4be14a789e33ff2b5b301c70341ad80f0b560..c1330860cc92a7b38e9f81b9a30921613d121730 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidMapper.java @@ -1,6 +1,6 @@ package de.ozgcloud.bescheid; -import static de.ozgcloud.bescheid.Bescheid.*; +import static de.ozgcloud.document.bescheid.Bescheid.*; import java.time.LocalDate; import java.util.Collection; @@ -21,18 +21,26 @@ import org.mapstruct.NullValuePropertyMappingStrategy; import org.mapstruct.ReportingPolicy; import org.springframework.beans.factory.annotation.Autowired; -import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.command.Command; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.common.datatype.StringBasedValue; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.Bescheid.SendBy; +import de.ozgcloud.document.bescheid.BescheidCallContextAttachingInterceptor; +import de.ozgcloud.document.bescheid.BescheidId; +import de.ozgcloud.document.bescheid.BescheidManagerConfig; +import de.ozgcloud.document.bescheid.SentInfo; +import de.ozgcloud.document.bescheid.UserId; +import de.ozgcloud.document.bescheid.vorgang.VorgangId; +import de.ozgcloud.document.common.attached_item.AttachedItem; +import de.ozgcloud.document.common.attached_item.AttachedItemService; @Mapper(uses = { SentInfoMapper.class }, // unmappedTargetPolicy = ReportingPolicy.WARN, // collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED, // nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE, // nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) // +@Deprecated public abstract class BescheidMapper { @Autowired diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java deleted file mode 100644 index 3110e878975886da00f8989e378afc465415f67c..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRemoteService.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.ozgcloud.bescheid; - -import de.ozgcloud.bescheid.vorgang.Vorgang; - -public interface BescheidRemoteService { - - BescheidResponse create(BescheidRequest request, Vorgang vorgang); -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java deleted file mode 100644 index bd827b7b2f17effbf96c62304087fcf873925227..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.time.LocalDate; - -import de.ozgcloud.bescheid.common.user.UserProfile; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -public class BescheidRequest { - - private VorgangId vorgangId; - - private LocalDate bescheidVom; - private boolean genehmigt; - - private UserProfile createFor; -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java deleted file mode 100644 index 234aec472536d4d2b549abda4606d2368f2bbd74..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidResponse.java +++ /dev/null @@ -1,40 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.io.File; -import java.util.List; -import java.util.Optional; - -import de.ozgcloud.bescheid.vorgang.Vorgang.ServiceKonto; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.common.binaryfile.FileId; -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; -import lombok.With; - -@Builder(toBuilder = true) -@Getter -public class BescheidResponse { - - private VorgangId vorgangId; - - private boolean bewilligt; - private UserId createdBy; - - private String bescheidFileName; - private File bescheidFile; - @With - private FileId bescheidFileId; - private String contentType; - private long size; - - @Builder.Default - private Optional<String> nachrichtSubject = Optional.empty(); - @Builder.Default - private Optional<String> nachrichtText = Optional.empty(); - - @Singular - private List<FileId> attachments; - - private ServiceKonto serviceKonto; -} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidSentEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidSentEvent.java deleted file mode 100644 index 8bfb22f6eec2e1cdee3bef6f7414dedfad82bd26..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidSentEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.bescheid; - -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandExecutedEvent; - -public class BescheidSentEvent extends CommandExecutedEvent { - - public BescheidSentEvent(final Command command) { - super(command); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java deleted file mode 100644 index cd1d2fc2ccb45a29beedfc74b4d90b7ecc8d559f..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidService.java +++ /dev/null @@ -1,378 +0,0 @@ -package de.ozgcloud.bescheid; - -import static java.util.Objects.*; - -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.Collectors; -import java.util.stream.Stream; - -import jakarta.annotation.PostConstruct; - -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.info.BuildProperties; -import org.springframework.stereotype.Service; - -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.bescheid.administration.AdministrationService; -import de.ozgcloud.bescheid.attributes.ClientAttributeService; -import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; -import de.ozgcloud.bescheid.common.user.UserProfileService; -import de.ozgcloud.bescheid.vorgang.Vorgang; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.bescheid.vorgang.VorgangService; -import de.ozgcloud.command.Command; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.Document; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Service -@Log4j2 -@RequiredArgsConstructor -public class BescheidService { - - static final String DEFAULT_NACHRICHT_SUBJECT = "Ihr Bescheid zum Antrag"; - public static final String DEFAULT_NACHRICHT_TEMPLATE_FILE = "bescheid.nachrichtTemplate.txt.ftlh"; - public static final String KEY_TEMPLATE_SIGNATURE = "signature"; - - private static final String ERROR_MESSAGE_NO_SERVICE = "No Bescheid Endpoint is configured."; - - static final String VORGANG_BESCHEIDEN_ORDER = "VORGANG_BESCHEIDEN"; - static final String SUBCOMMANDS_EXECUTION_MODE = "PARALLEL"; - static final String SEND_POSTFACH_NACHRICHT_ORDER = "SEND_POSTFACH_NACHRICHT"; - - static final String FIELD_POSTFACH_ID = "postfachId"; - 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 FIELD_ATTACHMENTS = "attachments"; - static final String SUBJECT = "Ihr Bescheid zum Antrag"; - - private final VorgangService vorgangService; - private final AttachedItemService attachedItemService; - private final UserProfileService userProfileService; - @Qualifier(BescheidManagerConfiguration.COMMAND_SERVICE_NAME) - private final OzgCloudCommandService commandService; - private final AdministrationService administrationService; - - private final CommandMapper commandMapper; - private final ClientAttributeService bescheidClientAttributeService; - private final BuildProperties buildProperties; - private final Optional<BescheidRemoteService> remoteService; - private final BescheidMapper mapper; - - private final TemplateHandler templateHandler; - - @PostConstruct - void logStatus() { - remoteService.ifPresentOrElse( - service -> LOG.info("Bescheid-Manager is configured."), - () -> LOG.info("No BescheidRemoteService configured - Bescheid creation is not possible.")); - } - - public Optional<Bescheid> findDraft(String vorgangId) { - return attachedItemService.findBescheidItem(VorgangId.from(vorgangId)).map(mapper::mapFromAttachedItem); - } - - public Stream<Bescheid> findAll(VorgangId vorgangId) { - return attachedItemService.findAllBescheid(vorgangId).stream().map(mapper::mapFromAttachedItem); - } - - public String createBescheidDraft(Command createBescheidDraftCommand) { - validateBescheidData(createBescheidDraftCommand.getBodyObject()); - return attachedItemService.createBescheidDraft(buildBescheidDraft(createBescheidDraftCommand)); - } - - void validateBescheidData(Map<String, Object> bodyObject) { - validateBescheidField(bodyObject, Bescheid.FIELD_BESCHIEDEN_AM); - validateBescheidField(bodyObject, Bescheid.FIELD_BEWILLIGT); - validateSendBy(MapUtils.getString(bodyObject, Bescheid.FIELD_SEND_BY)); - } - - void validateBescheidField(Map<String, Object> bescheid, String field) { - if (isNull(bescheid.get(field))) { - throw new TechnicalException("Fields '%s' is required for bescheid creation".formatted(field)); - } - } - - void validateSendBy(String sendBy) { - if (isUnknownSendByValue(sendBy)) { - var possibleSendByValues = Arrays.stream(Bescheid.SendBy.values()).map(Bescheid.SendBy::name) - .collect(Collectors.joining(",")); - var message = String.format("Unexpected value for field '%s': %s. Allowed are: %s", Bescheid.FIELD_SEND_BY, sendBy, - possibleSendByValues); - throw new TechnicalException(message); - } - } - - private boolean isUnknownSendByValue(String sendByValue) { - return Arrays.stream(Bescheid.SendBy.values()).noneMatch(sendBy -> sendBy.hasValue(sendByValue)); - } - - Bescheid buildBescheidDraft(Command command) { - var bescheid = mapper.mapFromCommand(command); - var resultBuilder = bescheid.toBuilder().id(null).version(0).status(Bescheid.Status.DRAFT); - if (bescheid.getNachrichtSubject().isEmpty()) { - resultBuilder.nachrichtSubject(Optional.of(DEFAULT_NACHRICHT_SUBJECT)); - } - if (bescheid.getNachrichtText().isEmpty()) { - resultBuilder.nachrichtText(Optional.of(createNachrichtText())); - } - return resultBuilder.build(); - } - - String createNachrichtText() { - return templateHandler.fillTemplate(DEFAULT_NACHRICHT_TEMPLATE_FILE, getTemplateParameters()); - } - - Map<String, Object> getTemplateParameters() { - return administrationService.getNachrichtSignature().map(signature -> Map.<String, Object>of(KEY_TEMPLATE_SIGNATURE, signature)) - .orElseGet(Collections::emptyMap); - } - - public BescheidResponse createBescheid(BescheidRequest request) { - checkRemoteService(); - - return doCreateBescheid(request); - } - - private BescheidResponse doCreateBescheid(BescheidRequest request) { - var vorgang = vorgangService.getById(request.getVorgangId()); - return remoteService.map(service -> service.create(request, vorgang)) - .map(bescheid -> updateBescheid(bescheid, vorgang)) - .orElseThrow(() -> new TechnicalException(ERROR_MESSAGE_NO_SERVICE)); - } - - private BescheidResponse updateBescheid(BescheidResponse bescheid, Vorgang vorgang) { - return bescheid.toBuilder().vorgangId(vorgang.getId()).serviceKonto(vorgang.getServiceKonto()).build(); - } - - private void checkRemoteService() { - if (remoteService.isEmpty()) { - LOG.error(ERROR_MESSAGE_NO_SERVICE); - throw new TechnicalException(ERROR_MESSAGE_NO_SERVICE); - } - } - - public void sendBescheidManually(AttachedItem bescheidItem, Command parentCommand) { - validateBescheidSendManually(bescheidItem, parentCommand.getRelationVersion()); - var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId())); - addSubCommands(parentCommand.getId(), buildSetBescheidSentSubCommands(bescheidItem, vorgang, getUserId())); - } - - void validateBescheidSendManually(AttachedItem bescheidItem, long version) { - validateBescheid(bescheidItem, version); - var sendBy = bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY); - if (Bescheid.SendBy.MANUAL.notValue(sendBy)) { - throw new TechnicalException( - "Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.MANUAL)); - } - } - - public void sendBescheidPostfachMail(AttachedItem bescheidItem, Command parentCommand) { - validateBescheidSendPostfach(bescheidItem, parentCommand.getRelationVersion()); - var vorgang = vorgangService.getById(VorgangId.from(bescheidItem.getVorgangId())); - var userId = getUserId(); - var subCommands = buildSetBescheidSentSubCommands(bescheidItem, vorgang, userId); - subCommands.add(buildSendPostfachNachrichtCommand(bescheidItem, vorgang.getServiceKonto(), userId)); - addSubCommands(parentCommand.getId(), subCommands); - } - - public void validateBescheidSendPostfach(AttachedItem bescheidItem, long version) { - validateBescheid(bescheidItem, version); - var sendBy = bescheidItem.getItem().get(Bescheid.FIELD_SEND_BY); - if (Bescheid.SendBy.NACHRICHT.notValue(sendBy)) { - throw new TechnicalException( - "Bescheid has unexpected sendBy value: '%s'. Expected is %s".formatted(sendBy, Bescheid.SendBy.NACHRICHT)); - } - if (getNachrichtSubject(bescheidItem).isEmpty()) { - throw new TechnicalException("Bescheid has no nachricht subject"); - } - if (getNachrichtText(bescheidItem).isEmpty()) { - throw new TechnicalException("Bescheid has no nachricht text"); - } - } - - void validateBescheid(AttachedItem bescheidItem, long version) { - if (bescheidItem.getVersion() != version) { - throw new TechnicalException("Bescheid has different version. Expected: %d, but was: %d".formatted(version, bescheidItem.getVersion())); - } - var status = MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_STATUS); - if (Bescheid.Status.DRAFT.not(status)) { - throw new TechnicalException("Bescheid has status '%s'. Bescheid must have status DRAFT".formatted(status)); - } - if (StringUtils.isBlank(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_BESCHEID_DOCUMENT))) { - throw new TechnicalException("Bescheid has no document"); - } - } - - Optional<String> getNachrichtSubject(AttachedItem bescheidItem) { - return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_SUBJECT)) - .map(StringUtils::trimToNull); - } - - Optional<String> getNachrichtText(AttachedItem bescheidItem) { - return Optional.ofNullable(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_NACHRICHT_TEXT)) - .map(StringUtils::trimToNull); - } - - String getUserId() { - return userProfileService.getUserProfile().getId().toString(); - } - - List<OzgCloudCommand> buildSetBescheidSentSubCommands(AttachedItem bescheidItem, Vorgang vorgang, String userId) { - var subCommands = new ArrayList<OzgCloudCommand>(); - subCommands.add(buildVorgangBescheidenCommand(vorgang)); - subCommands.add(buildSetBescheidSentStatusCommand(bescheidItem, userId)); - return subCommands; - } - - OzgCloudCommand buildVorgangBescheidenCommand(Vorgang vorgang) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(vorgang.getId().toString())) - .relationId(commandMapper.mapRelationId(vorgang.getId().toString())) - .relationVersion(vorgang.getVersion()) - .order(VORGANG_BESCHEIDEN_ORDER) - .build(); - } - - OzgCloudCommand buildSetBescheidSentStatusCommand(AttachedItem bescheidItem, String userId) { - return OzgCloudCommand.builder() - .relationId(commandMapper.mapRelationId(bescheidItem.getId())) - .relationVersion(bescheidItem.getVersion()) - .order(AttachedItemService.PATCH_ATTACHED_ITEM) - .bodyObject(Map.of( - AttachedItem.PROPERTY_ID, bescheidItem.getId(), - AttachedItem.PROPERTY_ITEM, buildBescheidSentStatusItem(userId))) - .build(); - } - - Map<String, Object> buildBescheidSentStatusItem(String userId) { - return Map.of( - Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name(), - Bescheid.FIELD_SENT_INFO, buildSentInfoMap(userId)); - } - - Map<String, Object> buildSentInfoMap(String userId) { - return Map.of( - SentInfo.FIELD_SENT_AT, ZonedDateTime.now().format(DateTimeFormatter.ISO_DATE_TIME), - SentInfo.FIELD_SENT_BY, userId); - } - - OzgCloudCommand buildSendPostfachNachrichtCommand(AttachedItem bescheidItem, Vorgang.ServiceKonto serviceKonto, String userId) { - var bodyObject = buildSendNachrichtCommandBody(bescheidItem, buildPostfachAddress(serviceKonto.getPostfachAddresses().getFirst(), - serviceKonto.getType())); - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(bescheidItem.getVorgangId())) - .relationId(commandMapper.mapRelationId(bescheidItem.getVorgangId())) - .order(SEND_POSTFACH_NACHRICHT_ORDER) - .createdBy(commandMapper.toOzgCloudUserId(userId)) - .bodyObject(bodyObject) - .build(); - } - - Map<String, Object> buildPostfachAddress(Vorgang.PostfachAddress postfachAddress, String serviceKontoType) { - return Map.of(Vorgang.PostfachAddress.FIELD_TYPE, postfachAddress.getType(), - Vorgang.PostfachAddress.FIELD_VERSION, postfachAddress.getVersion(), - Vorgang.PostfachAddress.FIELD_IDENTIFIER, postfachAddress.getIdentifier(), - Vorgang.ServiceKonto.FIELD_SERVICEKONTO_TYPE, serviceKontoType); - } - - Map<String, Object> buildSendNachrichtCommandBody(AttachedItem bescheidItem, Map<String, Object> postfachAddress) { - return Map.of( - FIELD_REPLY_OPTION, REPLY_OPTION, - FIELD_SUBJECT, getNachrichtSubject(bescheidItem).orElse(SUBJECT), - FIELD_MAIL_BODY, getNachrichtText(bescheidItem).orElse(StringUtils.EMPTY), - FIELD_ATTACHMENTS, buildAttachments(bescheidItem), - Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, postfachAddress); - - } - - List<String> buildAttachments(AttachedItem bescheidItem) { - return Stream.concat(Stream.of(getBescheidFileId(bescheidItem)), getAttachments(bescheidItem).stream()).map(FileId::toString).toList(); - } - - FileId getBescheidFileId(AttachedItem bescheidItem) { - var bescheidDocument = attachedItemService.getItem(MapUtils.getString(bescheidItem.getItem(), Bescheid.FIELD_BESCHEID_DOCUMENT)); - return FileId.from(MapUtils.getString(bescheidDocument.getItem(), Document.FIELD_DOCUMENT_FILE)); - } - - List<FileId> getAttachments(AttachedItem bescheidItem) { - var attachmentsObject = bescheidItem.getItem().get(Bescheid.FIELD_ATTACHMENTS); - if (attachmentsObject instanceof Collection<?> attachments) { - return attachments.stream().map(String::valueOf).map(FileId::from).toList(); - } - return getStringAsList(attachmentsObject); - } - - List<FileId> getStringAsList(Object attachmentsObject) { - if (attachmentsObject instanceof String attachment && StringUtils.isNotBlank(attachment)) { - return Collections.singletonList(FileId.from(attachment)); - } - return Collections.emptyList(); - } - - void addSubCommands(String parentCommandId, List<OzgCloudCommand> subCommands) { - commandService.addSubCommands(buildCreateSubCommandsRequest(parentCommandId, subCommands)); - } - - OzgCloudCreateSubCommandsRequest buildCreateSubCommandsRequest(String parentCommandId, List<OzgCloudCommand> subCommands) { - return OzgCloudCreateSubCommandsRequest.builder() - .parentId(parentCommandId) - .executionMode(SUBCOMMANDS_EXECUTION_MODE) - .completedIfSubsCompleted(true) - .subCommands(subCommands) - .build(); - } - - public void setAntragBewilligung(AttachedItem bescheidItem) { - try { - bescheidClientAttributeService.setAntragResult(bescheidItem.getVorgangId(), getBewilligt(bescheidItem)); - } catch (Exception e) { - LOG.error("Cannot set antrag result on vorgang (id: {})", bescheidItem.getVorgangId(), e); - } - } - - boolean getBewilligt(AttachedItem bescheidItem) { - return MapUtils.getBooleanValue(bescheidItem.getItem(), Bescheid.FIELD_BEWILLIGT, false); - } - - public BescheidManagerConfig getConfig() { - return BescheidManagerConfig.builder() - .version(buildProperties.getVersion()) - .javaVersion(getJavaVersion()) - .features(buildFeatures()) - .build(); - } - - String getJavaVersion() { - return System.getProperty("java.version"); - } - - BescheidManagerConfig.Features buildFeatures() { - return BescheidManagerConfig.Features.builder() - .canCreateBescheidDocument(remoteService.isPresent()) - .build(); - } - - public Bescheid getBescheid(String id) { - return mapper.mapFromAttachedItem(attachedItemService.getItem(id)); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidUpdatedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidUpdatedEvent.java deleted file mode 100644 index a6021663da81fbecf37f177b3d522cefeb7d8afb..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/BescheidUpdatedEvent.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.ozgcloud.bescheid; - -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandExecutedEvent; - -class BescheidUpdatedEvent extends CommandExecutedEvent { - - public BescheidUpdatedEvent(Command command) { - super(command); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java deleted file mode 100644 index a3e1fb0389b3612d212fa0678aedfd11ecf950e4..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfo.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.bescheid; - -import java.time.ZonedDateTime; - -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -public class SentInfo { - - public static final String FIELD_SENT_BY = "sentBy"; - public static final String FIELD_SENT_AT = "sentAt"; - - private String sentBy; - private ZonedDateTime sentAt; - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java index 95c5b586e88adc7881815f3331ad7213f5bcb530..138a5af62fa293d5b937c8e1c99230c7e5578200 100644 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java +++ b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/SentInfoMapper.java @@ -12,7 +12,10 @@ import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.ReportingPolicy; +import de.ozgcloud.document.bescheid.SentInfo; + @Mapper(unmappedTargetPolicy = ReportingPolicy.WARN, collectionMappingStrategy = CollectionMappingStrategy.ADDER_PREFERRED) +@Deprecated public interface SentInfoMapper { String GRPC_DATE_TIME_FORMATTER = "yyyy-MM-dd'T'HH:mm:ss'Z'"; diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java deleted file mode 100644 index d92b4024521b151c049a71edc1f22f3bafa55de0..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/UserId.java +++ /dev/null @@ -1,21 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.util.Objects; - -import de.ozgcloud.common.datatype.StringBasedValue; -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -public class UserId extends StringBasedValue { - - UserId(String userId) { - super(userId); - } - - public static UserId from(String userId) { - if (Objects.nonNull(userId)) { - return new UserId(userId); - } - return null; - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationProperties.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationProperties.java deleted file mode 100644 index 59f93a0239f649eb4156fb5512494e06749066d9..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationProperties.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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.bescheid.administration; - -import java.util.Optional; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.cloud.context.config.annotation.RefreshScope; -import org.springframework.context.annotation.Configuration; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@RefreshScope -@Configuration -@ConfigurationProperties(prefix = "ozgcloud.postfach") -public class AdministrationProperties { - - private Optional<String> signatur = Optional.empty(); - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationService.java deleted file mode 100644 index 920c5ea67d8285d1646b7840bf6c5fd91fb8c1ab..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationService.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.bescheid.administration; - -import java.util.Optional; - -import org.springframework.cloud.endpoint.RefreshEndpoint; -import org.springframework.stereotype.Service; - -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class AdministrationService { - - private final AdministrationProperties administrationProperties; - private final RefreshEndpoint refreshEndpoint; - - public Optional<String> getNachrichtSignature() { - return administrationProperties.getSignatur(); - } - - public void refreshConfig() { - refreshEndpoint.refresh(); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationSyncScheduler.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationSyncScheduler.java deleted file mode 100644 index 41fde870cc01fe94e9d2089742e77ffffd6a3f4a..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/administration/AdministrationSyncScheduler.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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.bescheid.administration; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -import lombok.RequiredArgsConstructor; - -@Component -@ConditionalOnProperty(value = "ozgcloud.administration.sync.enabled", havingValue = "true", matchIfMissing = true) -@RequiredArgsConstructor -public class AdministrationSyncScheduler { - - private final AdministrationService service; - - @Scheduled(initialDelayString = "${ozgcloud.administration.sync.delay}", fixedDelayString = "${ozgcloud.administration.sync.delay}") - public void sync() { - service.refreshConfig(); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteService.java deleted file mode 100644 index d87ae7496591bc23df9ba65148ca8c5f2ba24559..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteService.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2022 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.bescheid.attributes; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.vorgang.grpc.clientAttribute.ClientAttributeServiceGrpc.ClientAttributeServiceBlockingStub; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcAccessPermission; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttributeValue; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcSetClientAttributeRequest; -import io.grpc.ClientInterceptor; -import net.devh.boot.grpc.client.inject.GrpcClient; - -@Service("bescheid_ClientAttributeRemoteService") -class ClientAttributeRemoteService { - - @GrpcClient("vorgang-manager") - private ClientAttributeServiceBlockingStub serviceBlockingStub; - - @Autowired - private ClientInterceptor bescheidCallContextInterceptor; - - public void setBooleanReadOnlyClientAttribute(String vorgangId, String attributeName, boolean value) { - serviceBlockingStub.withInterceptors(bescheidCallContextInterceptor).set(buildRequest(vorgangId, attributeName, value)); - } - - GrpcSetClientAttributeRequest buildRequest(String vorgangId, String attributeName, boolean value) { - return GrpcSetClientAttributeRequest.newBuilder() - .setVorgangId(vorgangId) - .setAttribute(buildClientAttribute(attributeName, value)) - .build(); - } - - GrpcClientAttribute buildClientAttribute(String attributeName, boolean value) { - return GrpcClientAttribute.newBuilder() - .setClientName(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME) - .setAccess(GrpcAccessPermission.READ_ONLY) - .setAttributeName(attributeName) - .setValue(GrpcClientAttributeValue.newBuilder().setBoolValue(value).build()) - .build(); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeService.java deleted file mode 100644 index 158597163c2ee60cfc4640a47e4704b453bda5b6..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/attributes/ClientAttributeService.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2022 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.bescheid.attributes; - -import org.springframework.stereotype.Service; - -import lombok.RequiredArgsConstructor; - -@Service("bescheid_ClientAttributeService") -@RequiredArgsConstructor -public class ClientAttributeService { - - public static final String ATTRIBUTE_NAME_ANTRAG_BEWILLIGT = "antragBewilligt"; - - private final ClientAttributeRemoteService bescheidClientAttributeRemoteService; - - public void setAntragResult(String vorgangId, boolean antragResult) { - bescheidClientAttributeRemoteService.setBooleanReadOnlyClientAttribute(vorgangId, ATTRIBUTE_NAME_ANTRAG_BEWILLIGT, antragResult); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java deleted file mode 100644 index 08cac0cfb0bb41e32c4c71b4ad88556326607c4f..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileRemoteService.java +++ /dev/null @@ -1,100 +0,0 @@ -package de.ozgcloud.bescheid.binaryfile; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.InputStream; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.TimeUnit; -import java.util.concurrent.TimeoutException; - -import org.apache.commons.io.IOUtils; -import org.springframework.stereotype.Service; - -import com.google.protobuf.ByteString; - -import de.ozgcloud.bescheid.BescheidResponse; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils; -import de.ozgcloud.common.binaryfile.GrpcFileUploadUtils.FileSender; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.vorgang.grpc.binaryFile.BinaryFileServiceGrpc.BinaryFileServiceStub; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileMetaData; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileRequest; -import de.ozgcloud.vorgang.grpc.binaryFile.GrpcUploadBinaryFileResponse; -import de.ozgcloud.vorgang.grpc.command.GrpcCallContext; -import io.grpc.stub.CallStreamObserver; -import io.grpc.stub.StreamObserver; -import lombok.NonNull; -import net.devh.boot.grpc.client.inject.GrpcClient; - -@Service -class BinaryFileRemoteService { - - private static final String CALL_CONTEXT_CLIENT = "bescheid-manager"; - private static final String VORGANG_ATTACHMENT_FIELD = "bescheid"; - - @GrpcClient("vorgang-manager") - private BinaryFileServiceStub binaryFileRemoteStub; - - public FileId uploadBescheidFile(@NonNull BescheidResponse bescheid) { - try (var in = openFile(bescheid.getBescheidFile())) { - var resultFuture = GrpcFileUploadUtils.createSender(this::buildChunkRequest, in, - this::buildCallStreamObserver) - .withMetaData(buildMetaDataRequest(bescheid)) - .send(); - - return FileId.from(waitUntilFutureToComplete(resultFuture, in).getFileId()); - } catch (IOException e) { - throw new TechnicalException("Error on uploading file.", e); - } - } - - private InputStream openFile(File file) { - try { - return new FileInputStream(file); - } catch (FileNotFoundException e) { - throw new TechnicalException("File to upload not found.", e); - } - } - - private GrpcUploadBinaryFileRequest buildMetaDataRequest(BescheidResponse bescheid) { - return GrpcUploadBinaryFileRequest.newBuilder() - .setMetadata(GrpcUploadBinaryFileMetaData.newBuilder() - // TODO remove context - check why needed! - .setContext(GrpcCallContext.newBuilder().setClient(CALL_CONTEXT_CLIENT).build()) - .setVorgangId(bescheid.getVorgangId().toString()) - .setField(VORGANG_ATTACHMENT_FIELD) - .setContentType(bescheid.getContentType()) - .setSize(bescheid.getBescheidFile().length()) - .setFileName(bescheid.getBescheidFileName()) - .build()) - .build(); - } - - private GrpcUploadBinaryFileRequest buildChunkRequest(byte[] bytes, Integer length) { - return GrpcUploadBinaryFileRequest.newBuilder().setFileContent((ByteString.copyFrom(bytes, 0, length))).build(); - } - - private CallStreamObserver<GrpcUploadBinaryFileRequest> buildCallStreamObserver( - StreamObserver<GrpcUploadBinaryFileResponse> responseObserver) { - return (CallStreamObserver<GrpcUploadBinaryFileRequest>) binaryFileRemoteStub.uploadBinaryFileAsStream(responseObserver); - } - - GrpcUploadBinaryFileResponse waitUntilFutureToComplete(FileSender<GrpcUploadBinaryFileRequest, GrpcUploadBinaryFileResponse> fileSender, - InputStream fileContentStream) { - try { - return fileSender.getResultFuture().get(10, TimeUnit.MINUTES); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - fileSender.cancelOnError(e); - throw new TechnicalException("Waiting for finishing upload was interrupted.", e); - } catch (ExecutionException | TimeoutException e) { - fileSender.cancelOnTimeout(); - throw new TechnicalException("Error / Timeout on uploading data.", e); - } finally { - IOUtils.closeQuietly(fileContentStream); - } - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java deleted file mode 100644 index 11ddd6e95554acaf4a7839057a92489f373fa1c2..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/binaryfile/BinaryFileService.java +++ /dev/null @@ -1,20 +0,0 @@ -package de.ozgcloud.bescheid.binaryfile; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.bescheid.BescheidResponse; -import lombok.NonNull; - -@Service -public class BinaryFileService { - - @Autowired - private BinaryFileRemoteService remoteService; - - public BescheidResponse uploadBescheidFile(@NonNull BescheidResponse bescheid) { - var fileId = remoteService.uploadBescheidFile(bescheid); - - return bescheid.withBescheidFileId(fileId); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProvider.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProvider.java deleted file mode 100644 index 40cbdaffe962730c81d9c95239babda672aac989..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProvider.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.bescheid.common.callcontext; - -import java.util.Optional; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.apilib.common.callcontext.CallContext; -import de.ozgcloud.apilib.common.callcontext.OzgCloudCallContextProvider; -import de.ozgcloud.apilib.user.OzgCloudUserId; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import lombok.RequiredArgsConstructor; - -@Component -@RequiredArgsConstructor -public class BescheidManagerCallContextProvider implements OzgCloudCallContextProvider { - - private final CurrentUserService currentUserService; - - @Override - public CallContext provideContext() { - var callContextBuilder = CallContext.builder().clientName(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - getUserId().ifPresent(callContextBuilder::userId); - return callContextBuilder.build(); - } - - Optional<OzgCloudUserId> getUserId() { - return currentUserService.getUser().getUserId().map(OzgCloudUserId::from); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextAuthenticationToken.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextAuthenticationToken.java deleted file mode 100644 index 77ec99f9581295e299a16064de28351cfc3ffaf4..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextAuthenticationToken.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (C) 2022 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.bescheid.common.callcontext; - -import java.util.Collection; -import java.util.stream.Collectors; - -import org.springframework.security.authentication.AbstractAuthenticationToken; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.authority.SimpleGrantedAuthority; - -import lombok.EqualsAndHashCode; - -@EqualsAndHashCode(callSuper = true) -public class CallContextAuthenticationToken extends AbstractAuthenticationToken { - - private final CallContextUser user; - - static CallContextAuthenticationToken authenticate(CallContextUser user) { - return new CallContextAuthenticationToken(user); - } - - private CallContextAuthenticationToken(CallContextUser user) { - super(user.getOrganisatorischeEinheitenIds().stream().map(SimpleGrantedAuthority::new).collect(Collectors.toSet())); - this.user = user; - super.setAuthenticated(true); - } - - @Override - public Object getCredentials() { - return null; - } - - @Override - public Object getPrincipal() { - return user; - } - - @Override - public Collection<GrantedAuthority> getAuthorities() { - return user.getOrganisatorischeEinheitenIds().stream().map(SimpleGrantedAuthority::new).collect(Collectors.toUnmodifiableSet()); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextUser.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextUser.java deleted file mode 100644 index 667bb03d8dacb64af48b7d542c893cdca0d594c2..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CallContextUser.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2022 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.bescheid.common.callcontext; - -import java.io.Serializable; -import java.util.Collection; -import java.util.Optional; - -import org.springframework.security.core.AuthenticatedPrincipal; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; - -@Builder -@Getter -public class CallContextUser implements AuthenticatedPrincipal, Serializable { - - private static final long serialVersionUID = 1L; - - private final String clientName; - - @Builder.Default - private final transient Optional<String> userId = Optional.empty(); - @Builder.Default - private final transient Optional<String> userName = Optional.empty(); - @Singular - private final Collection<String> organisatorischeEinheitenIds; - @Builder.Default - private final transient boolean organisationEinheitenIdCheckNecessary = false; - - @Override - public String getName() { - return clientName; - } - -} 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 deleted file mode 100644 index b77b10a648b85eb1da8a39dfc30ecd6a00f18cd9..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserService.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (C) 2022 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.bescheid.common.callcontext; - -import java.util.Objects; -import java.util.Optional; -import java.util.stream.Collectors; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.security.authentication.AuthenticationTrustResolver; -import org.springframework.security.core.Authentication; -import org.springframework.security.core.GrantedAuthority; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.security.core.context.SecurityContextHolder; -import org.springframework.stereotype.Service; - -import de.ozgcloud.command.Command; -import lombok.RequiredArgsConstructor; - -@RequiredArgsConstructor -@Service("bescheid_currentUserService") -public class CurrentUserService { - - private final AuthenticationTrustResolver trustResolver; - - public CallContextUser getUser() { - return findUser().orElseThrow(() -> new IllegalStateException("No authenticated User found")); - } - - public Optional<CallContextUser> findUser() { - return findTrustedAuthentication() - .map(this::mapToCallContextUser) - // remove this filter as soon we have a trusted authentication - .filter(user -> StringUtils.isNotBlank(user.getClientName())); - } - - private CallContextUser mapToCallContextUser(Authentication auth) { - if (auth instanceof CallContextAuthenticationToken) { - return (CallContextUser) auth.getPrincipal(); - } else { - return CallContextUser.builder() - .clientName(auth.getName()) - .organisatorischeEinheitenIds( - auth.getAuthorities().stream().map(GrantedAuthority::getAuthority).collect(Collectors.toUnmodifiableSet())) - .build(); - } - } - - public Optional<Authentication> findAuthentication() { - return findTrustedAuthentication(); - } - - Optional<Authentication> findTrustedAuthentication() { - return Optional.ofNullable(SecurityContextHolder.getContext()) - .map(SecurityContext::getAuthentication) - .filter(auth -> !trustResolver.isAnonymous(auth)) - .filter(Authentication::isAuthenticated); - } - - public SecurityContext startSecurityContext(Command command) { - var prevContext = SecurityContextHolder.getContext(); - - SecurityContextHolder.clearContext(); - SecurityContextHolder.getContext().setAuthentication(CallContextAuthenticationToken.authenticate(createUser(command))); - - return prevContext; - } - - CallContextUser createUser(Command command) { - var builder = CallContextUser.builder() - .userId(Optional.ofNullable(command.getCreatedBy())) - .userName(Optional.ofNullable(command.getCreatedByName())) - .clientName("Alfa") // FIXME read client name from command - .organisationEinheitenIdCheckNecessary(false); - - return builder.build(); - } - - public void resetSecurityContext(SecurityContext context) { - SecurityContextHolder.clearContext(); - if (Objects.nonNull(context)) { - SecurityContextHolder.setContext(context); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandler.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandler.java deleted file mode 100644 index 8355a9ffca2cf8b9ad91449133240e11745131c5..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandler.java +++ /dev/null @@ -1,43 +0,0 @@ -package de.ozgcloud.bescheid.common.freemarker; - -import java.io.IOException; -import java.io.StringWriter; - -import org.springframework.stereotype.Component; - -import de.ozgcloud.common.errorhandling.TechnicalException; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; -import lombok.RequiredArgsConstructor; - -@Component -@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/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfile.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfile.java deleted file mode 100644 index 889dbbad42e09d5195cc3daa107994e9af542b5f..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfile.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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.bescheid.common.user; - -import de.ozgcloud.bescheid.UserId; -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -public class UserProfile { - - private UserId id; - private String firstName; - private String lastName; - private String email; -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileMapper.java deleted file mode 100644 index 0c7c5ceda1c008597995a38a5306b704226085b6..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileMapper.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.bescheid.common.user; - -import org.mapstruct.Mapper; - -import de.ozgcloud.apilib.user.OzgCloudUserId; -import de.ozgcloud.apilib.user.OzgCloudUserProfile; -import de.ozgcloud.bescheid.UserId; - -@Mapper -public interface UserProfileMapper { - - UserProfile mapProfile(OzgCloudUserProfile userProfile); - - default UserId mapUserId(OzgCloudUserId id) { - return UserId.from(id.toString()); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileService.java deleted file mode 100644 index 5346ead50451064408dd1db5146536520b566b99..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileService.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.bescheid.common.user; - -import java.util.Optional; - -import org.springframework.stereotype.Service; - -import de.ozgcloud.apilib.user.OzgCloudUserId; -import de.ozgcloud.apilib.user.OzgCloudUserProfileService; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class UserProfileService { - - private final CurrentUserService currentUserService; - private final Optional<OzgCloudUserProfileService> userProfileService; - private final UserProfileMapper mapper; - - public UserProfile getUserProfile() { - var service = userProfileService.orElseThrow(() -> new IllegalStateException("No connection to user-manager configured.")); - - return currentUserService.getUser().getUserId().map(OzgCloudUserId::from) - .map(service::getById) - .map(mapper::mapProfile).orElseThrow(() -> new TechnicalException("Unknown UserId or cannot load user profile.")); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileTestFactory.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileTestFactory.java deleted file mode 100644 index 60949bbe87cf4d3b6c2a366dcc529d4be45c99bf..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/common/user/UserProfileTestFactory.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.bescheid.common.user; - -import java.util.UUID; - -import com.thedeanda.lorem.LoremIpsum; - -import de.ozgcloud.bescheid.UserId; - -public class UserProfileTestFactory { - - private static final LoremIpsum LOREM_IPSUM = LoremIpsum.getInstance(); - - public static final String ID_STR = UUID.randomUUID().toString(); - public static final UserId ID = UserId.from(ID_STR); - - public static final String FIRST_NAME = LOREM_IPSUM.getFirstName(); - public static final String LAST_NAME = LOREM_IPSUM.getLastName(); - public static final String EMAIL = "test-email@local"; - - public static UserProfile create() { - return createBuilder().build(); - } - - public static UserProfile.UserProfileBuilder createBuilder() { - return UserProfile.builder() - .id(ID) - .firstName(FIRST_NAME) - .lastName(LAST_NAME) - .email(EMAIL); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java deleted file mode 100644 index ef9589219948ef6c2db265e1d6653b1f06403ba3..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/dummy/DummyBescheidRemoteService.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.ozgcloud.bescheid.dummy; - -import java.util.Optional; - -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.stereotype.Service; - -import com.google.common.net.MediaType; - -import de.ozgcloud.bescheid.BescheidResponse; -import de.ozgcloud.bescheid.BescheidRemoteService; -import de.ozgcloud.bescheid.BescheidRequest; -import de.ozgcloud.bescheid.vorgang.Vorgang; -import de.ozgcloud.common.binaryfile.TempFileUtils; - -@Service -@ConditionalOnProperty("ozgcloud.feature.bescheid.enable-dummy-document-processor") -class DummyBescheidRemoteService implements BescheidRemoteService { - - private static final String DUMMY_BESCHEID_FILE_NAME = "dummy-bescheid.pdf"; - private static final String DUMMY_BESCHEID_CONTENT_TYPE = MediaType.PDF.toString(); - - @Override - public BescheidResponse create(BescheidRequest request, Vorgang vorgang) { - var file = TempFileUtils.writeTmpFile(this.getClass().getClassLoader().getResourceAsStream(DUMMY_BESCHEID_FILE_NAME)); - - return BescheidResponse.builder() - .bescheidFile(file) - .bescheidFileName(DUMMY_BESCHEID_FILE_NAME) - .contentType(DUMMY_BESCHEID_CONTENT_TYPE) - .nachrichtText(Optional.of("Dummy Bescheid")) - .nachrichtSubject(Optional.of("Nachricht Subject")) - .size(file.length()) - .createdBy(request.getCreateFor().getId()) - .build(); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java deleted file mode 100644 index b93412e26623f5b7f04b7f96a1e38a51b56018d2..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteService.java +++ /dev/null @@ -1,248 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import java.io.File; -import java.io.IOException; -import java.util.Collection; -import java.util.Optional; - -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.xpath.XPathConstants; -import javax.xml.xpath.XPathExpressionException; -import javax.xml.xpath.XPathFactory; - -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.http.HttpStatusCode; -import org.springframework.http.MediaType; -import org.springframework.stereotype.Service; -import org.springframework.web.reactive.function.BodyExtractors; -import org.springframework.web.reactive.function.client.ClientResponse; -import org.springframework.web.reactive.function.client.WebClient; -import org.w3c.dom.Document; -import org.w3c.dom.Text; -import org.xml.sax.SAXException; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import com.fasterxml.jackson.databind.annotation.JsonDeserialize; - -import de.ozgcloud.bescheid.BescheidResponse; -import de.ozgcloud.bescheid.BescheidRemoteService; -import de.ozgcloud.bescheid.BescheidRequest; -import de.ozgcloud.bescheid.common.user.UserProfile; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentDocument; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentFile; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.BescheidData; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.UserData; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.SmartDocument.Selection; -import de.ozgcloud.bescheid.vorgang.Vorgang; -import de.ozgcloud.common.binaryfile.FileDataDeserializer; -import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; -import reactor.core.publisher.Mono; - -@Log4j2 -@Service -@RequiredArgsConstructor -@ConditionalOnProperty("ozgcloud.bescheid.smart-documents.url") -class SmartDocumentsBescheidRemoteService implements BescheidRemoteService { - - private static final String FILE_TYPE_PDF = "PDF"; - private static final String FILE_TYPE_XML = "XML"; - - static final String NACHRICHTEN_TEXT_EXPRESSION = "/root/SmartDocument/Fields/NachrichtenText/text()"; // NOSONAR - static final String FIELD_TEMPLATE_EXPRESSION = "/root/SmartDocument/Fields/Field[@ID=\"Template.56E7AA0956C7486292E9A02114CB231C\"]/text()"; // NOSONAR - - @SuppressWarnings("deprecation") // SD requires forced UTF-8 encoding - private static final MediaType JSON_MEDIA_TYPE_FOR_SD = MediaType.APPLICATION_JSON_UTF8; - - @Qualifier("smartDocuments") - private final WebClient smartDocumentsWebClient; - - private final SmartDocumentsProperties properties; - - @Override - public BescheidResponse create(BescheidRequest request, Vorgang vorgang) { - var sdRequest = createRequest(request, vorgang); - LOG.debug(() -> buildLogRequest(sdRequest)); - - return smartDocumentsWebClient.post().accept(MediaType.APPLICATION_JSON) - .contentType(JSON_MEDIA_TYPE_FOR_SD) - .bodyValue(sdRequest) - .retrieve() - .onStatus(HttpStatusCode::is4xxClientError, this::handleClientError) - .bodyToMono(SmartDocumentsResponse.class) - .map(response -> buildBescheid(request, response)) - .block(); - } - - Mono<Throwable> handleClientError(ClientResponse response) { - return response.body(BodyExtractors.toMono(String.class)) - .map(content -> new TechnicalException("Client-Error: " + content)); - } - - private String buildLogRequest(SmartDocumentsRequest request) { - try { - ObjectMapper oj = new ObjectMapper(); - return oj.writerWithDefaultPrettyPrinter().writeValueAsString(request); - } catch (Exception e) { - LOG.warn("Error writing request as json-string for logging.", e); - return "Error generating logging string"; - } - } - - BescheidResponse buildBescheid(BescheidRequest request, SmartDocumentsResponse smartDocumentsResponse) { - var smartDocumentsFile = getSmartDocumentsFile(smartDocumentsResponse); - - return BescheidResponse.builder() - .bescheidFile(smartDocumentsFile.getDocument().getData()) - .bescheidFileName(smartDocumentsFile.getFilename()) - .size(smartDocumentsFile.getDocument().getData().length()) - .contentType(MediaType.APPLICATION_PDF_VALUE) - .nachrichtText(getNachrichtText(smartDocumentsResponse)) - .bewilligt(request.isGenehmigt()) - .createdBy(request.getCreateFor().getId()) - .vorgangId(request.getVorgangId()) - .build(); - } - - private SmartDocumentFile getSmartDocumentsFile(SmartDocumentsResponse response) { - return getSmartDocumentsFile(response, FILE_TYPE_PDF) - .orElseThrow(() -> new IllegalStateException("No PDF File in SmartDocuments Response found.")); - } - - Optional<String> getNachrichtText(SmartDocumentsResponse response) { - return getXMLFile(response).flatMap(this::extractTextFromXmlFile); - } - - Optional<String> extractTextFromXmlFile(File xmlFile) { - try { - var document = parseXml(xmlFile); - if (document.isPresent()) { - return document.flatMap(this::getNachrichtenText).or(() -> getFieldTemplateText(document.get())).map(Text::getTextContent); - } - } catch (RuntimeException e) { - LOG.warn("Unexpected Error on extracting NachrichtText: {}", e.getMessage(), e); - } - return Optional.empty(); - } - - Optional<Document> parseXml(File xmlFile) { - try { - return Optional.of(DocumentBuilderFactory.newDefaultInstance().newDocumentBuilder().parse(xmlFile)); - } catch (SAXException | IOException | ParserConfigurationException e) { - LOG.warn("XML-Parsing error on extracting Nachricht-Text: {}", e.getMessage(), e); - } - return Optional.empty(); - } - - Optional<Text> getNachrichtenText(Document document) { - return evaluateXPath(document, NACHRICHTEN_TEXT_EXPRESSION); - } - - Optional<Text> getFieldTemplateText(Document document) { - return evaluateXPath(document, FIELD_TEMPLATE_EXPRESSION); - } - - Optional<Text> evaluateXPath(Document document, String xpathExpression) { - try { - var expr = XPathFactory.newInstance().newXPath().compile(xpathExpression); - return Optional.ofNullable(expr.evaluate(document, XPathConstants.NODE)).map(Text.class::cast); - } catch (ClassCastException e) { - LOG.warn("Error on extraction Nachricht-Text. XPath return unexpected Type.", e); - } catch (XPathExpressionException e) { - LOG.warn("Cannot evaluate XPath: {}", xpathExpression, e); - } - return Optional.empty(); - } - - Optional<File> getXMLFile(SmartDocumentsResponse response) { - return getSmartDocumentsFile(response, FILE_TYPE_XML) - .map(SmartDocumentFile::getDocument) - .map(SmartDocumentDocument::getData); - } - - Optional<SmartDocumentFile> getSmartDocumentsFile(SmartDocumentsResponse response, String fileType) { - return response.getFile().stream() - .filter(file -> file.getOutputFormat().equals(fileType)) - .findFirst(); - } - - SmartDocumentsRequest createRequest(BescheidRequest request, Vorgang vorgang) { - return logRequest(SmartDocumentsRequest.builder() - .smartDocument(buildSDSection(vorgang)) - .customerData( - CustomerData.builder() - .vorgang(vorgang) - .userData(buildUserData(request.getCreateFor())) - .bescheid(BescheidData.builder().bescheidVom(request.getBescheidVom()).genehmigt(request.isGenehmigt()).build()) - .build()) - - .build()); - } - - private UserData buildUserData(UserProfile userProfile) { - return UserData.builder() - .firstName(userProfile.getFirstName()) - .lastName(userProfile.getLastName()) - .email(userProfile.getEmail()) - .build(); - } - - private SmartDocumentsRequest.SmartDocument buildSDSection(Vorgang vorgang) { - return SmartDocumentsRequest.SmartDocument.builder().selection(Selection.builder() - .templateGroup(properties.getTemplateGroup()) - .template(vorgang.getVorgangName()) - .build()) - .build(); - } - - private SmartDocumentsRequest logRequest(SmartDocumentsRequest request) { - LOG.debug(() -> { - var ojMapper = new ObjectMapper(); - try { - return ojMapper.writeValueAsString(request); - } catch (JsonProcessingException e) { - LOG.warn("Json Processing Exception on logging request.", e); - return request.toString(); - } - }); - - return request; - } - - @Builder - @Getter - @NoArgsConstructor - @AllArgsConstructor - static class SmartDocumentsResponse { - Collection<SmartDocumentFile> file; - - @Builder - @Getter - @NoArgsConstructor - @AllArgsConstructor - static class SmartDocumentFile { - private String filename; - private SmartDocumentDocument document; - private String outputFormat; - } - - @Builder - @Getter - @NoArgsConstructor - @AllArgsConstructor - static class SmartDocumentDocument { - @JsonDeserialize(using = FileDataDeserializer.class) - private File data; - } - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsConfiguration.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsConfiguration.java deleted file mode 100644 index 579a53d016fe65a7a0c9110173ead505b2793476..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsConfiguration.java +++ /dev/null @@ -1,53 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.http.client.reactive.ReactorClientHttpConnector; -import org.springframework.web.reactive.function.client.ExchangeFilterFunctions; -import org.springframework.web.reactive.function.client.WebClient; - -import reactor.netty.http.client.HttpClient; -import reactor.netty.transport.ProxyProvider; - -@Configuration -@ConditionalOnProperty("ozgcloud.bescheid.smart-documents.url") -class SmartDocumentsConfiguration { - - @Autowired - private SmartDocumentsProperties properties; - - @Bean("smartDocuments") - WebClient smartDocumentsWebClient() { - ReactorClientHttpConnector connector = new ReactorClientHttpConnector(buildHttpClient()); - - return WebClient.builder() - .baseUrl(properties.getUrl()) - .filter(ExchangeFilterFunctions.basicAuthentication(properties.getBasicAuth().getUsername(), properties.getBasicAuth().getPassword())) - .clientConnector(connector) - .build(); - } - - private HttpClient buildHttpClient() { - if (properties.getProxy() != null) { - return createProxyHttpClient(); - } else { - return createNoProxyHttpClient(); - } - } - - private HttpClient createNoProxyHttpClient() { - return HttpClient.create(); - } - - private HttpClient createProxyHttpClient() { - return HttpClient.create() - .proxy(proxy -> proxy.type(ProxyProvider.Proxy.HTTP) - .host(properties.getProxy().getHost()) - .port(properties.getProxy().getPort()) - .username(properties.getProxy().getUsername()) - .password(username -> properties.getProxy().getPassword())); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsProperties.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsProperties.java deleted file mode 100644 index c45e9383c581e237dbf565d6daab0a5b9c217dc7..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsProperties.java +++ /dev/null @@ -1,88 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; - -import org.apache.logging.log4j.core.config.plugins.validation.constraints.NotBlank; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.context.annotation.Configuration; -import org.springframework.validation.annotation.Validated; - -import lombok.Getter; -import lombok.Setter; - -@ConditionalOnProperty("ozgcloud.bescheid.smart-documents.url") -@Validated -@Getter -@Setter -@Configuration -@ConfigurationProperties("ozgcloud.bescheid.smart-documents") -public class SmartDocumentsProperties { - - /** - * Location of the Smart Documents Server - */ - @NotBlank - private String url; - - /** - * Credential for basic auth to the Smart Documents Server - */ - @NotNull - @Valid - private UsernamePassword basicAuth; - - /** - * Smart Documents Template Group - */ - @NotBlank - private String templateGroup; - /** - * Smart Documents Template - */ - @NotBlank - private String template; - - /** - * Proxy Configuration if required. - */ - private ProxyConfiguration proxy; - - @Getter - @Setter - static class UsernamePassword { - /** - * Username for authentication - */ - @NotBlank - private String username; - /** - * Password for authentication - */ - @NotBlank - private String password; - } - - @Getter - @Setter - static class ProxyConfiguration { - /** - * Host Address of the proxy server with protocol - */ - @NotBlank - private String host; - /** - * Port Number of the proxy server - */ - private int port = 8080; - /** - * Username for Authentication for the proxy server - */ - private String username; - /** - * Username for Authentication for the proxy server - */ - private String password; - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java deleted file mode 100644 index d842134f98b72ab6a3961ecef0f6aad924d90637..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsRequest.java +++ /dev/null @@ -1,68 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import java.time.LocalDate; - -import com.fasterxml.jackson.annotation.JsonProperty; -import com.fasterxml.jackson.databind.PropertyNamingStrategies; -import com.fasterxml.jackson.databind.annotation.JsonNaming; - -import de.ozgcloud.bescheid.vorgang.Vorgang; -import lombok.Builder; -import lombok.Getter; -import lombok.ToString; - -@Builder -@Getter -@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class) -@ToString -class SmartDocumentsRequest { - - @Builder.Default - private CustomerData customerData = CustomerData.builder().build(); - @Builder.Default - private SmartDocument smartDocument = SmartDocument.builder().build(); - - @Builder - @Getter - static class CustomerData { - private Vorgang vorgang; - private BescheidData bescheid; - private UserData userData; - - @Builder - @Getter - static class BescheidData { - private LocalDate bescheidVom; - private boolean genehmigt; - } - - @Builder - @Getter - static class UserData { - private String firstName; - private String lastName; - private String email; - } - } - - @Builder - @Getter - @JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class) - static class SmartDocument { - - @Builder.Default - @JsonProperty("Selection") - private Selection selection = Selection.builder().build(); - - @Builder - @Getter - @JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class) - static class Selection { - @Builder.Default - private String templateGroup = "Kiel"; - @Builder.Default - private String template = "Halteverbot"; - } - } - -} 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 deleted file mode 100644 index a5445250df8668b4c23a5c8db18295914e78a9ae..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapper.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.ReportingPolicy; -import org.mapstruct.factory.Mappers; - -import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; -import de.ozgcloud.vorgang.vorgang.GrpcEingang; -import de.ozgcloud.vorgang.vorgang.GrpcFormData; -import de.ozgcloud.vorgang.vorgang.GrpcPostfachAddress; -import de.ozgcloud.vorgang.vorgang.GrpcServiceKonto; -import de.ozgcloud.vorgang.vorgang.GrpcVorgangWithEingang; - -@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, // - 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); - - default Collection<FormDataEntry> mapFormData(GrpcFormData value) { - var result = new ArrayList<FormDataEntry>(); - var entryMapper = Mappers.getMapper(FormDataEntryMapper.class); - - result.addAll(value.getFieldList().stream().map(entryMapper::fromGrpc).toList()); - result.addAll(value.getFormList().stream().map(entryMapper::fromGrpc).toList()); - - return Collections.unmodifiableList(result); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java deleted file mode 100644 index e0e2988ba7883c82f423e767b6df2b0d8cd34b87..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntry.java +++ /dev/null @@ -1,63 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import java.util.List; - -import com.fasterxml.jackson.annotation.JsonIgnore; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; - -@JsonSerialize(using = FormDataEntrySerializer.class) -public interface FormDataEntry { - - String getName(); - @JsonIgnore - String getLabel(); - - @JsonIgnore - default boolean isSubForm() { - return false; - } - - @JsonIgnore - default boolean isFormEntry() { - return false; - } - - @Builder - @Getter - static class SubForm implements FormDataEntry { - - private String name; - @JsonIgnore - private String label; - - @Singular - private List<FormDataEntry> entries; - - @JsonIgnore - @Override - public boolean isSubForm() { - return true; - } - } - - @Builder - @Getter - static class FormField implements FormDataEntry { - - private String name; - @JsonIgnore - private String label; - - private Object value; - - @JsonIgnore - @Override - public boolean isFormEntry() { - return true; - } - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java deleted file mode 100644 index 6cd404f3247936a7b6c6ff83e07c00c85c914b20..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntryMapper.java +++ /dev/null @@ -1,34 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import java.util.List; -import java.util.stream.Stream; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Named; -import org.mapstruct.ReportingPolicy; - -import de.ozgcloud.bescheid.vorgang.FormDataEntry.FormField; -import de.ozgcloud.bescheid.vorgang.FormDataEntry.SubForm; -import de.ozgcloud.vorgang.vorgang.GrpcFormField; -import de.ozgcloud.vorgang.vorgang.GrpcSubForm; - -@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR) -public interface FormDataEntryMapper { - - @Mapping(target = "entries", source = ".", qualifiedByName = "mapEntrys") - @Mapping(target = "entry", ignore = true) - @Mapping(target = "name", source = "title") - SubForm fromGrpc(GrpcSubForm subForm); - - FormField fromGrpc(GrpcFormField field); - - @Named("mapEntrys") - default List<FormDataEntry> mapEntrys(GrpcSubForm subForm) { - var fieldStream = subForm.getFieldList().stream().map(this::fromGrpc); - var subFormsStream = subForm.getSubFormList().stream().map(this::fromGrpc); - - return Stream.concat(fieldStream, subFormsStream).toList(); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializer.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializer.java deleted file mode 100644 index 0a3b48dbe0074d56570a050af1f196edf4da2222..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializer.java +++ /dev/null @@ -1,81 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import java.io.IOException; -import java.util.List; -import java.util.Optional; - -import org.apache.commons.lang3.StringUtils; - -import com.fasterxml.jackson.core.JsonGenerator; -import com.fasterxml.jackson.databind.SerializerProvider; -import com.fasterxml.jackson.databind.ser.std.StdSerializer; - -import de.ozgcloud.bescheid.vorgang.FormDataEntry.FormField; -import de.ozgcloud.bescheid.vorgang.FormDataEntry.SubForm; -import de.ozgcloud.common.errorhandling.TechnicalException; - -public class FormDataEntrySerializer extends StdSerializer<FormDataEntry> { - - public FormDataEntrySerializer() { - super(FormDataEntry.class); - } - - @Override - public void serialize(FormDataEntry value, JsonGenerator gen, SerializerProvider provider) throws IOException { - - if (value.isFormEntry()) { - var formEntry = (FormField) value; - Optional.ofNullable(formEntry.getValue()).map(Object::toString).filter(StringUtils::isNoneBlank) - .ifPresent(val -> writeStringField(value.getName(), val, gen)); - } - if (value.isSubForm()) { - gen.writeFieldName(value.getName()); - gen.writeStartObject(); - var subForm = (SubForm) value; - - subForm.getEntries().forEach(entry -> writeObject(entry, gen)); - gen.writeEndObject(); - } - } - - private void writeStringField(String name, String value, JsonGenerator gen) { - try { - gen.writeStringField(name, value); - } catch (IOException e) { - throw new TechnicalException("Error writing string field in json.", e); - } - } - - static void writeObject(Object pojo, JsonGenerator jgen) { - try { - jgen.writeObject(pojo); - } catch (IOException e) { - throw new TechnicalException("Error on writing object to json.", e); - } - } -} - -class FormDataEntryListSerializer extends StdSerializer<List<FormDataEntry>> { - - public FormDataEntryListSerializer() { - super(List.class, true); - } - - @Override - public void serialize(List<FormDataEntry> value, JsonGenerator gen, SerializerProvider provider) throws IOException { - gen.writeStartObject(); - - value.forEach(entry -> defaultSerializeValue(entry, gen, provider)); - gen.writeEndObject(); - } - - private void defaultSerializeValue(Object value, JsonGenerator jgen, SerializerProvider provider) { - try { - var serializer = provider.findValueSerializer(FormDataEntry.class); - serializer.serialize(value, jgen, provider); - } catch (IOException e) { - throw new TechnicalException("Error serializing value.", e); - } - } - -} 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 deleted file mode 100644 index ba0e51d7681c81f51a00cad46317330410b98d1e..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/Vorgang.java +++ /dev/null @@ -1,97 +0,0 @@ -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; -import com.fasterxml.jackson.annotation.JsonInclude.Include; -import com.fasterxml.jackson.databind.annotation.JsonSerialize; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; -import lombok.ToString; - -@Builder -@Getter -@ToString -public class Vorgang { - - @JsonIgnore - private VorgangId id; - private long version; - - private String vorgangName; - - private String vorgangNummer; - private String aktenzeichen; - - @JsonIgnore - @ToString.Exclude - private ServiceKonto serviceKonto; - @ToString.Exclude - private Eingang eingang; - - @Builder - @Getter - public static class ServiceKonto { - - public static final String FIELD_SERVICEKONTO_TYPE = "serviceKontoType"; - public static final String FIELD_POSTFACH_ADDRESS = "postfachAddress"; - - private String type; - @Singular - private List<PostfachAddress> postfachAddresses; - } - - @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; - } - - @Builder - @Getter - static class Eingang { - private Antragsteller antragsteller; - private ZustaendigeStelle zustaendigeStelle; - - @Singular("formData") - @JsonSerialize(using = FormDataEntryListSerializer.class) - private List<FormDataEntry> formData; - } - - @Builder - @Getter - @JsonInclude(Include.NON_EMPTY) - static class Antragsteller { - private String anrede; - private String nachname; - private String vorname; - private String geburtsdatum; - private String geburtsort; - private String geburtsname; - private String email; - private String telefon; - private String strasse; - private String hausnummer; - private String plz; - private String ort; - } - - @Builder - @Getter - static class ZustaendigeStelle { - private String organisationseinheitenId; - private String email; - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java deleted file mode 100644 index 2cb8785e563dbbff842baa5996e971d905be1bc7..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangId.java +++ /dev/null @@ -1,15 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import de.ozgcloud.common.datatype.StringBasedValue; - -public class VorgangId extends StringBasedValue { - - VorgangId(String vorgangId) { - super(vorgangId); - } - - public static VorgangId from(String vorgangId) { - return new VorgangId(vorgangId); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java deleted file mode 100644 index c3a1aa72e30e3147d913117c6f5f4d77e8ee6a12..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteService.java +++ /dev/null @@ -1,31 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangRequest; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; -import io.grpc.ClientInterceptor; -import lombok.NonNull; -import net.devh.boot.grpc.client.inject.GrpcClient; - -@Service("bescheid_VorgangRemoteService") -class VorgangRemoteService { - - @GrpcClient("vorgang-manager") - private VorgangServiceBlockingStub vorgangServiceStub; - @Autowired - private BescheidVorgangMapper mapper; - - @Autowired - private ClientInterceptor bescheidCallContextInterceptor; - - public Vorgang getById(@NonNull VorgangId vorgangId) { - var request = GrpcFindVorgangWithEingangRequest.newBuilder().setId(vorgangId.toString()).build(); - var response = vorgangServiceStub - .withInterceptors(bescheidCallContextInterceptor) - .findVorgangWithEingang(request); - - return mapper.mapVorgang(response.getVorgangWithEingang()); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java b/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java deleted file mode 100644 index 98689c96ea25c66ffcfbe9cab54556b148b7fc65..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/bescheid/vorgang/VorgangService.java +++ /dev/null @@ -1,18 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import org.springframework.stereotype.Service; - -import lombok.NonNull; -import lombok.RequiredArgsConstructor; - -@Service("bescheid_VorgangService") -@RequiredArgsConstructor -public class VorgangService { - - private final VorgangRemoteService remoteService; - - public Vorgang getById(@NonNull VorgangId id) { - return remoteService.getById(id); - } - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java deleted file mode 100644 index f47223bc22488d80380ad986dd37ebf79e4c27db..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItem.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.common.attached_item; - -import java.util.Map; - -import lombok.Builder; -import lombok.Getter; -import lombok.Singular; - -@Builder(toBuilder = true) -@Getter -public class AttachedItem { - - public static final String PROPERTY_ID = "id"; - public static final String PROPERTY_CLIENT = "client"; - public static final String PROPERTY_VORGANG_ID = "vorgangId"; - public static final String PROPERTY_ITEM_NAME = "itemName"; - public static final String PROPERTY_VERSION = "version"; - public static final String PROPERTY_ITEM = "item"; - - private String id; - @Builder.Default - private long version = 0L; - - private String client; - private String vorgangId; - private String itemName; - - @Singular("itemEntry") - private Map<String, Object> item; - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java deleted file mode 100644 index c3431d175ebf43e14f6a7fd15baf34cb7b81a5f6..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemMapper.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.common.attached_item; - -import java.util.Map; - -import org.mapstruct.Mapper; -import org.mapstruct.NullValueCheckStrategy; - -import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; - -@Mapper(uses = { GrpcObjectMapper.class }, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) -public interface AttachedItemMapper { - - AttachedItem mapFromVorgangAttachedItem(GrpcVorgangAttachedItem item); - - default Map<String, Object> toMap(AttachedItem attachedItem) { - return Map.of( - AttachedItem.PROPERTY_VORGANG_ID, attachedItem.getVorgangId(), - AttachedItem.PROPERTY_CLIENT, attachedItem.getClient(), - AttachedItem.PROPERTY_ITEM_NAME, attachedItem.getItemName(), - AttachedItem.PROPERTY_ITEM, attachedItem.getItem()); - } - -} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java deleted file mode 100644 index d0ad2ed4e32a2eb9fe424440629f23e0e50e9331..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/AttachedItemService.java +++ /dev/null @@ -1,230 +0,0 @@ -/* - * 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.common.attached_item; - -import java.util.Collection; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.function.Function; - -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; - -import de.ozgcloud.apilib.common.command.OzgCloudCommand; -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.Bescheid.Status; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.BescheidManagerConfiguration; -import de.ozgcloud.bescheid.BescheidMapper; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.command.Command; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.Document; -import lombok.RequiredArgsConstructor; - -@Service -@RequiredArgsConstructor -public class AttachedItemService { - - public static final String BESCHEID_ITEM_NAME = "Bescheid"; - public static final String PATCH_ATTACHED_ITEM = "PATCH_ATTACHED_ITEM"; - static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM"; - static final String UPDATE_ATTACHED_ITEM_ORDER = "UPDATE_ATTACHED_ITEM"; - static final String DELETE_ATTACHED_ITEM = "DELETE_ATTACHED_ITEM"; - - @Qualifier(BescheidManagerConfiguration.COMMAND_SERVICE_NAME) - private final OzgCloudCommandService commandService; - private final VorgangAttachedItemRemoteService remoteService; - - private final CommandMapper commandMapper; - private final AttachedItemMapper attachedItemMapper; - private final BescheidMapper bescheidMapper; - - public Optional<AttachedItem> findBescheidItem(VorgangId vorgangId) { - return remoteService.findBescheidDraft(vorgangId); - } - - public AttachedItem getItem(String id) { - return remoteService.getItem(id); - } - - public String createBescheidDraft(Bescheid bescheidDraft) { - return remoteService.findBescheidDraft(bescheidDraft.getVorgangId()) - .map(bescheidItem -> overrideAttachedItem(mergeBescheidDrafts(bescheidItem, bescheidDraft))) - .orElseGet(() -> createAttachedItem(bescheidDraft)); - } - - AttachedItem mergeBescheidDrafts(AttachedItem existingBescheidItem, Bescheid newBescheidDraft) { - return existingBescheidItem.toBuilder() - .item(bescheidMapper.mapToItem(newBescheidDraft)) - .build(); - } - - String overrideAttachedItem(AttachedItem bescheidItem) { - var finishedOzgCloudCommand = commandService.createAndWaitUntilDone(buildPatchAttachedItemCommand(bescheidItem, bescheidItem.getItem())); - return finishedOzgCloudCommand.getCreatedResource(); - } - - Map<String, Object> buildItemMapWithAllBescheidFields(Command command) { - var result = new HashMap<String, Object>(); - result.put(Bescheid.FIELD_BESCHIEDEN_AM, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_BESCHIEDEN_AM)); - result.put(Bescheid.FIELD_BEWILLIGT, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_BEWILLIGT)); - result.put(Bescheid.FIELD_BESCHEID_DOCUMENT, - MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT)); - result.put(Bescheid.FIELD_SEND_BY, getSendBy(command.getBodyObject())); - result.put(Bescheid.FIELD_NACHRICHT_TEXT, MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_TEXT)); - result.put(Bescheid.FIELD_NACHRICHT_SUBJECT, - MapUtils.getString(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_SUBJECT)); - result.put(Bescheid.FIELD_ATTACHMENTS, MapUtils.getObject(command.getBodyObject(), Bescheid.FIELD_ATTACHMENTS)); - return result; - } - - private String getSendBy(Map<String, Object> body) { - return MapUtils.getString(body, Bescheid.FIELD_SEND_BY); - } - - public void updateBescheidDraft(Command command, Optional<Document> document) { - createCommandAfterValidation(command, bescheid -> buildUpdateBescheidDraftCommand(command, document, bescheid)); - } - - private OzgCloudCommand buildUpdateBescheidDraftCommand(Command command, Optional<Document> document, AttachedItem bescheidItem) { - return buildPatchAttachedItemCommand(bescheidItem, buildAttachedItemAsMap(command, buildBescheidItemAsMap(command, document))); - } - - Map<String, Object> buildBescheidItemAsMap(Command command, Optional<Document> newDocument) { - var itemMap = buildItemMapWithExistingBescheidFields(command); - var savedBescheid = getItem(command.getRelationId()); - - getNewNachrichtText(savedBescheid, newDocument) - .ifPresent(nachrichtText -> itemMap.put(Bescheid.FIELD_NACHRICHT_TEXT, nachrichtText)); - - return itemMap; - } - - Optional<String> getNewNachrichtText(AttachedItem bescheidItem, Optional<Document> newDocument) { - return newDocument - .filter(document -> isDifferentDocument(document, bescheidItem)) - .map(Document::getNachrichtText) - .filter(StringUtils::isNotBlank); - } - - boolean isDifferentDocument(Document document, AttachedItem bescheidItem) { - return !StringUtils.equals(document.getId(), getBescheidDocumentId(bescheidItem)); - } - - private String getBescheidDocumentId(AttachedItem item) { - return MapUtils.getString(item.getItem(), Bescheid.FIELD_BESCHEID_DOCUMENT); - } - - OzgCloudCommand buildPatchAttachedItemCommand(AttachedItem bescheidItem, Map<String, Object> bodyObject) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(bescheidItem.getVorgangId())) - .relationId(commandMapper.mapRelationId(bescheidItem.getId())) - .relationVersion(bescheidItem.getVersion()) - .order(PATCH_ATTACHED_ITEM) - .bodyObject(bodyObject) - .build(); - } - - String createAttachedItem(Bescheid bescheidDraft) { - var bescheidItem = bescheidMapper.mapFromBescheid(bescheidDraft); - return commandService.createAndWaitUntilDone(buildCreateAttachedItemCommand(bescheidItem)).getCreatedResource(); - } - - OzgCloudCommand buildCreateAttachedItemCommand(AttachedItem bescheidItem) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(bescheidItem.getVorgangId())) - .relationId(commandMapper.mapRelationId(bescheidItem.getVorgangId())) - .order(CREATE_ATTACHED_ITEM_ORDER) - .bodyObject(attachedItemMapper.toMap(bescheidItem)).build(); - } - - Map<String, Object> buildAttachedItemAsMap(Command command, Map<String, Object> itemMap) { - var result = new HashMap<String, Object>(); - result.put(AttachedItem.PROPERTY_VORGANG_ID, command.getVorgangId()); - result.put(AttachedItem.PROPERTY_CLIENT, BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - result.put(AttachedItem.PROPERTY_ITEM_NAME, BESCHEID_ITEM_NAME); - result.put(AttachedItem.PROPERTY_ITEM, itemMap); - return result; - } - - Map<String, Object> buildItemMapWithExistingBescheidFields(Command command) { - var result = buildItemMap(Bescheid.Status.DRAFT); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_BESCHIEDEN_AM, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_BEWILLIGT, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_BESCHEID_DOCUMENT, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_SEND_BY, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_TEXT, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_NACHRICHT_SUBJECT, result); - addValueFromMapIfExists(command.getBodyObject(), Bescheid.FIELD_ATTACHMENTS, result); - return result; - } - - void addValueFromMapIfExists(Map<String, Object> sourceMap, String key, Map<String, Object> targetMap) { - if (sourceMap.containsKey(key)) { - targetMap.put(key, sourceMap.get(key)); - } - } - - public void deleteBescheidDraft(Command command) { - createCommandAfterValidation(command, bescheid -> buildDeleteItemCommand(command, bescheid)); - } - - private void createCommandAfterValidation(Command command, Function<AttachedItem, OzgCloudCommand> buildCommand) { - var bescheid = remoteService.getItem(command.getRelationId()); - validateBescheidStatus(bescheid); - commandService.createAndWaitUntilDone(buildCommand.apply(bescheid)); - } - - void validateBescheidStatus(AttachedItem bescheid) { - var bescheidStatus = MapUtils.getString(bescheid.getItem(), Bescheid.FIELD_STATUS); - if (Bescheid.Status.DRAFT.not(bescheidStatus)) { - throw new TechnicalException("Bescheid draft with ID '%s' has an unexpected status: '%s'".formatted(bescheid.getId(), bescheidStatus)); - } - } - - OzgCloudCommand buildDeleteItemCommand(Command command, AttachedItem bescheid) { - return OzgCloudCommand.builder() - .vorgangId(commandMapper.toOzgCloudVorgangId(command.getVorgangId())) - .relationId(commandMapper.mapRelationId(bescheid.getId())) - .relationVersion(bescheid.getVersion()) - .order(DELETE_ATTACHED_ITEM) - .build(); - } - - Map<String, Object> buildItemMap(Status status) { - var itemMap = new HashMap<String, Object>(); - itemMap.put(Bescheid.FIELD_STATUS, status.name()); - return itemMap; - } - - public Collection<AttachedItem> findAllBescheid(VorgangId vorgangId) { - return remoteService.findAllBescheid(vorgangId); - } -} \ No newline at end of file diff --git a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java b/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java deleted file mode 100644 index 1d8756a0c968d0463e6f94391afb91fad9143c04..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteService.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * 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.common.attached_item; - -import static de.ozgcloud.common.attached_item.AttachedItemService.*; - -import java.time.LocalDate; -import java.util.Comparator; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -import org.apache.commons.collections.MapUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemRequest; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemRequest; -import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub; -import io.grpc.ClientInterceptor; -import lombok.extern.log4j.Log4j2; -import net.devh.boot.grpc.client.inject.GrpcClient; - -@Service -@Log4j2 -class VorgangAttachedItemRemoteService { - - private static final Comparator<AttachedItem> BY_BESCHIEDEN_AM_DESC = (bescheid1, bescheid2) -> { - var beschiedenAm1 = LocalDate.parse(MapUtils.getString(bescheid1.getItem(), Bescheid.FIELD_BESCHIEDEN_AM)); - var beschiedenAm2 = LocalDate.parse(MapUtils.getString(bescheid2.getItem(), Bescheid.FIELD_BESCHIEDEN_AM)); - return beschiedenAm2.compareTo(beschiedenAm1); - }; - - @GrpcClient("vorgang-manager") - private VorgangAttachedItemServiceBlockingStub serviceStub; - @Autowired - private ClientInterceptor bescheidCallContextInterceptor; - @Autowired - private AttachedItemMapper attachedItemMapper; - - public Optional<AttachedItem> findBescheidDraft(VorgangId vorgangId) { - return findBescheidDraft(buildFindRequest(vorgangId.toString())); - } - - public List<AttachedItem> findAllBescheid(VorgangId vorgangId) { - return findAllBescheid(buildFindRequest(vorgangId.toString())).toList(); - } - - GrpcFindVorgangAttachedItemRequest buildFindRequest(String vorgangId) { - return GrpcFindVorgangAttachedItemRequest.newBuilder() - .setVorgangId(vorgangId) - .setItemName(BESCHEID_ITEM_NAME) - .setClient(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME) - .build(); - } - - Optional<AttachedItem> findBescheidDraft(GrpcFindVorgangAttachedItemRequest request) { - var bescheidItems = findAllBescheid(request).filter(this::hasStatusDraft).toList(); - if (bescheidItems.size() > 1) { - LOG.error("Found more than one ({}) draft bescheid for vorgangId: {}. Return one with last beschiedenAm date", bescheidItems.size(), - bescheidItems.getFirst().getVorgangId()); - } - return bescheidItems.isEmpty() ? Optional.empty() : Optional.of(bescheidItems.getFirst()); - } - - Stream<AttachedItem> findAllBescheid(GrpcFindVorgangAttachedItemRequest request) { - var grpcResponse = getServiceStub().find(request); - return grpcResponse.getVorgangAttachedItemsList().stream().map(attachedItemMapper::mapFromVorgangAttachedItem) - .sorted(BY_BESCHIEDEN_AM_DESC); - } - - boolean hasStatusDraft(AttachedItem bescheidItem) { - return Bescheid.Status.DRAFT.hasValue(bescheidItem.getItem().get(Bescheid.FIELD_STATUS)); - } - - public AttachedItem getItem(String id) { - var grpcVorgangAttachedItemResponse = getServiceStub().getById(buildGetByIdRequest(id)); - return attachedItemMapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()); - } - - GrpcVorgangAttachedItemRequest buildGetByIdRequest(String bescheidId) { - return GrpcVorgangAttachedItemRequest.newBuilder().setId(bescheidId).build(); - } - - VorgangAttachedItemServiceBlockingStub getServiceStub() { - return serviceStub.withInterceptors(bescheidCallContextInterceptor); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/BescheidDocumentCreatedEvent.java b/bescheid-manager/src/main/java/de/ozgcloud/document/BescheidDocumentCreatedEvent.java deleted file mode 100644 index aa8c127a165ad74cb1132759d977139faace6434..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/BescheidDocumentCreatedEvent.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.document; - -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandExecutedEvent; - -public class BescheidDocumentCreatedEvent extends CommandExecutedEvent { - - public BescheidDocumentCreatedEvent(Command command, String createdResource) { - super(command, createdResource); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java b/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java deleted file mode 100644 index fc0d09b53f1d9cbc4d3792dca94c429f46d3e5e1..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/Document.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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.document; - -import lombok.Builder; -import lombok.Getter; - -@Builder -@Getter -public class Document { - - public static final String FIELD_DOCUMENT_TYPE = "type"; - public static final String FIELD_DOCUMENT_FILE = "documentFile"; - public static final String FIELD_NACHRICHT_TEXT = "nachrichtText"; - public static final String FIELD_NACHRICHT_SUBJECT = "nachrichtSubject"; - - private String id; - private String type; - private String fileId; - private String nachrichtSubject; - private String nachrichtText; - -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentEventListener.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentEventListener.java deleted file mode 100644 index 316388c1057e9a90a9459d21abf64f01dec871a3..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentEventListener.java +++ /dev/null @@ -1,99 +0,0 @@ -/* - * 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.document; - -import java.util.Objects; -import java.util.function.Predicate; - -import org.apache.commons.lang3.StringUtils; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.event.EventListener; -import org.springframework.security.core.context.SecurityContext; -import org.springframework.stereotype.Component; - -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandCreatedEvent; -import de.ozgcloud.command.CommandFailedEvent; -import de.ozgcloud.common.errorhandling.TechnicalException; -import lombok.RequiredArgsConstructor; -import lombok.extern.log4j.Log4j2; - -@Component -@RequiredArgsConstructor -@Log4j2 -public class DocumentEventListener { - - static final String CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER = "CREATE_BESCHEID_DOCUMENT_FROM_FILE"; - public static final Predicate<Command> IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE_COMMAND = command -> - CREATE_BESCHEID_DOCUMENT_FROM_FILE_ORDER.equals(command.getOrder()); - private static final String IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE = "{T(de.ozgcloud.document.DocumentEventListener).IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE_COMMAND.test(event.getSource())}"; - - private static final String ERROR_MESSAGE = "Error on executing Create Bescheid Document Command."; - - private final DocumentService documentService; - - private final ApplicationEventPublisher eventPublisher; - private final CurrentUserService userService; - - @EventListener(condition = IS_CREATE_BESCHEID_DOCUMENT_FROM_FILE) - public void onCreateBescheidDocumentFromFile(CommandCreatedEvent event) { - SecurityContext prevContext = null; - var command = event.getSource(); - try { - prevContext = userService.startSecurityContext(command); - var createdDocumentId = documentService.createBescheidDocument(command); - publishEvent(new BescheidDocumentCreatedEvent(command, createdDocumentId)); - } catch (Exception e) { - LOG.error("{} Command failed.", ERROR_MESSAGE, e); - publishEvent(new CommandFailedEvent(command.getId(), buildErrorMessage(e))); - } finally { - userService.resetSecurityContext(prevContext); - } - } - - void publishEvent(ApplicationEvent event) { - eventPublisher.publishEvent(event); - } - - String buildErrorMessage(Exception e) { - try { - StringBuilder sb = new StringBuilder(ERROR_MESSAGE); - - if (Objects.nonNull(e.getCause()) && StringUtils.isNotBlank(e.getCause().getMessage())) { - sb.append(" Cause: " + e.getCause().getMessage()); - } - - if (e instanceof TechnicalException techException) { - sb.append(" ExceptionId: " + techException); - } - - return sb.toString(); - } catch (Exception e2) { - LOG.error("Error in building Error Message (sick).", e2); - return ERROR_MESSAGE; - } - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java deleted file mode 100644 index 673935d696777f3708fafbe134a8a496541b0d02..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentGrpcService.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.document; - -import de.ozgcloud.document.DocumentServiceGrpc.DocumentServiceImplBase; -import io.grpc.stub.StreamObserver; -import lombok.RequiredArgsConstructor; -import net.devh.boot.grpc.server.service.GrpcService; - -@GrpcService -@RequiredArgsConstructor -public class DocumentGrpcService extends DocumentServiceImplBase { - - private final DocumentService documentService; - private final DocumentMapper documentMapper; - - @Override - public void getDocument(GrpcGetDocumentRequest request, StreamObserver<GrpcGetDocumentResponse> responseObserver) { - var document = documentService.getDocument(request.getId()); - responseObserver.onNext(buildGetDocumentResponse(document)); - responseObserver.onCompleted(); - } - - GrpcGetDocumentResponse buildGetDocumentResponse(Document document) { - return GrpcGetDocumentResponse.newBuilder().setDocument(documentMapper.toGrpcDocument(document)).build(); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java deleted file mode 100644 index a0e8848a34a11b3f1f1a12c961b178563d935647..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentMapper.java +++ /dev/null @@ -1,58 +0,0 @@ -/* - * 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.document; - -import org.apache.commons.collections.MapUtils; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.NullValueCheckStrategy; - -import de.ozgcloud.common.attached_item.AttachedItem; - -@Mapper(nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS) -interface DocumentMapper { - - @Mapping(target = "allFields", ignore = true) - @Mapping(target = "unknownFields", ignore = true) - @Mapping(target = "typeBytes", ignore = true) - @Mapping(target = "nachrichtTextBytes", ignore = true) - @Mapping(target = "nachrichtSubjectBytes", ignore = true) - @Mapping(target = "mergeUnknownFields", ignore = true) - @Mapping(target = "mergeFrom", ignore = true) - @Mapping(target = "idBytes", ignore = true) - @Mapping(target = "fileIdBytes", ignore = true) - @Mapping(target = "clearOneof", ignore = true) - @Mapping(target = "clearField", ignore = true) - GrpcDocument toGrpcDocument(Document document); - - default Document fromAttachedItem(AttachedItem attachedItem) { - return Document.builder() - .id(attachedItem.getId()) - .type(MapUtils.getString(attachedItem.getItem(), Document.FIELD_DOCUMENT_TYPE)) - .fileId(MapUtils.getString(attachedItem.getItem(), Document.FIELD_DOCUMENT_FILE)) - .nachrichtText(MapUtils.getString(attachedItem.getItem(), Document.FIELD_NACHRICHT_TEXT)) - .nachrichtSubject(MapUtils.getString(attachedItem.getItem(), Document.FIELD_NACHRICHT_SUBJECT)) - .build(); - } -} diff --git a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java b/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java deleted file mode 100644 index 0a4d0f0660902d0e74d1b93db4a5ac09d877ddda..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/main/java/de/ozgcloud/document/DocumentService.java +++ /dev/null @@ -1,129 +0,0 @@ -/* - * 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.document; - -import static java.util.Objects.*; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; - -import org.apache.commons.collections.MapUtils; -import org.apache.commons.lang3.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.stereotype.Service; - -import de.ozgcloud.apilib.common.command.OzgCloudCommand; -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.BescheidResponse; -import de.ozgcloud.command.Command; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.errorhandling.TechnicalException; - -@Service -public class DocumentService { - - public static final String DOCUMENT_ITEM_NAME = "Document"; - public static final String DOCUMENT_TYPE = "BESCHEID"; - - static final String CREATE_ATTACHED_ITEM_ORDER = "CREATE_ATTACHED_ITEM"; - public static final String FIELD_DOCUMENT_TYPE = "type"; - public static final String FIELD_DOCUMENT_FILE = "documentFile"; - public static final String FIELD_NACHRICHT_TEXT = "nachrichtText"; - - @Autowired - private AttachedItemService attachedItemService; - @Autowired - @Qualifier("bescheid_OzgCloudCommandService") - private OzgCloudCommandService commandService; - @Autowired - private CommandMapper commandMapper; - @Autowired - private DocumentMapper documentMapper; - - public String createBescheidDocument(Command command) { - return createBescheidDocument(command, buildItemMap(command)); - } - - public String createBescheidDocument(Command command, BescheidResponse bescheid) { - return createBescheidDocument(command, buildItemMap(bescheid)); - } - - String createBescheidDocument(Command command, Map<String, Object> itemMap) { - validateBescheidItem(command.getRelationId()); - var ozgCloudCommand = buildCreateDocumentOzgCommand(command, buildAttachedItem(command, itemMap)); - var executedCommand = commandService.createAndWaitUntilDone(ozgCloudCommand); - return executedCommand.getCreatedResource(); - } - - void validateBescheidItem(String bescheidId) { - var bescheidData = attachedItemService.getItem(bescheidId).getItem(); - var status = MapUtils.getString(bescheidData, Bescheid.FIELD_STATUS); - if (Bescheid.Status.DRAFT.not(status)) { - throw new TechnicalException("Bescheid is not in draft status"); - } - } - - OzgCloudCommand buildCreateDocumentOzgCommand(Command command, Map<String, Object> bodyObject) { - return OzgCloudCommand.builder() - .order(CREATE_ATTACHED_ITEM_ORDER) - .vorgangId(commandMapper.toOzgCloudVorgangId(command.getVorgangId())) - .relationId(commandMapper.mapRelationId(command.getVorgangId())) - .bodyObject(bodyObject) - .build(); - } - - Map<String, Object> buildAttachedItem(Command command, Map<String, Object> itemMap) { - var result = new HashMap<String, Object>(); - result.put(AttachedItem.PROPERTY_VORGANG_ID, command.getVorgangId()); - result.put(AttachedItem.PROPERTY_CLIENT, BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - result.put(AttachedItem.PROPERTY_ITEM_NAME, DOCUMENT_ITEM_NAME); - result.put(AttachedItem.PROPERTY_ITEM, itemMap); - return result; - } - - Map<String, Object> buildItemMap(Command command) { - var fileId = Optional.ofNullable(command.getBodyObject().get(FIELD_DOCUMENT_FILE)).map(String::valueOf) - .orElseThrow(() -> new TechnicalException("Document file is missing")); - return Map.of(FIELD_DOCUMENT_TYPE, DOCUMENT_TYPE, FIELD_DOCUMENT_FILE, fileId); - } - - Map<String, Object> buildItemMap(BescheidResponse bescheid) { - if (isNull(bescheid.getBescheidFileId())) { - throw new TechnicalException("Bescheid file id is missing."); - } - return Map.of(FIELD_DOCUMENT_TYPE, DOCUMENT_TYPE, - FIELD_DOCUMENT_FILE, bescheid.getBescheidFileId().toString(), - FIELD_NACHRICHT_TEXT, bescheid.getNachrichtText().orElse(StringUtils.EMPTY)); - } - - public Document getDocument(String id) { - return documentMapper.fromAttachedItem(attachedItemService.getItem(id)); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java deleted file mode 100644 index 66403e2e7b83b2ac4ce30cb2b532cbdca881da64..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerITCase.java +++ /dev/null @@ -1,137 +0,0 @@ -package de.ozgcloud.bescheid; - -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; -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.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.bescheid.common.user.UserProfile; -import de.ozgcloud.bescheid.common.user.UserProfileService; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandCreatedEventTestFactory; -import de.ozgcloud.command.CommandExecutedEvent; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.test.ITCase; - -@ITCase -class BescheidEventListenerITCase { - - private static final Command COMMAND_WITH_OTHER_ORDER = CommandTestFactory.createBuilder().order("OTHER").build(); - - @Autowired - private ApplicationEventPublisher publisher; - @SpyBean - private BescheidEventListener listener; - - @MockBean - private BescheidService service; - @MockBean - private CurrentUserService userService; - @MockBean - private UserProfileService userProfileService; - @MockBean - private OzgCloudCommandService commandService; - @MockBean - private CommandMapper commandMapper; - @MockBean - private AttachedItemService attachedItemService; - - @Mock - private UserProfile userProfile; - - @BeforeEach - void init() { - when(userProfileService.getUserProfile()).thenReturn(userProfile); - } - - @Nested - class TestCreateBescheid { - - private final Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.CREATE_BESCHEID_ORDER).build(); - - @Test - void shouldCallService() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command)); - - verify(service).createBescheidDraft(command); - } - - @Test - void shouldNotReactOnOtherOrder() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER)); - - verifyNoInteractions(service); - } - } - - @Nested - class TestDeleteBescheid { - - private final Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.DELETE_BESCHEID_ORDER).build(); - - @Test - void shouldCallService() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command)); - - verify(attachedItemService).deleteBescheidDraft(command); - } - - @Test - void shouldNotReactOnOtherOrder() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER)); - - verifyNoInteractions(attachedItemService); - } - } - - @Nested - class TestUpdateBescheid { - - private final Command command = CommandTestFactory.createBuilder().order(BescheidEventListener.UPDATE_BESCHEID_ORDER).build(); - - @Test - void shouldCallService() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(command)); - - verify(attachedItemService).updateBescheidDraft(any(), any()); - } - - @Test - void shouldNotReactOnOtherOrder() { - publisher.publishEvent(CommandCreatedEventTestFactory.withCommand(COMMAND_WITH_OTHER_ORDER)); - - verifyNoInteractions(attachedItemService); - } - } - - @Nested - class TestBescheidSent { - - private static final Command COMMAND = CommandTestFactory.createBuilder().order(BescheidEventListener.SEND_BESCHEID_ORDER).build(); - - @Test - void shouldCallMethod() { - publisher.publishEvent(new CommandExecutedEvent(COMMAND)); - - verify(listener).setAntragBewilligung(COMMAND); - } - - @Test - void shouldNotReactOnOtherOrder() { - publisher.publishEvent(new CommandExecutedEvent(COMMAND_WITH_OTHER_ORDER)); - - verifyNoInteractions(listener); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java deleted file mode 100644 index a3734e17d99a07d77410d213ebbe30415424cb1f..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidEventListenerTest.java +++ /dev/null @@ -1,669 +0,0 @@ -package de.ozgcloud.bescheid; - -import static de.ozgcloud.bescheid.BescheidEventListener.*; -import static de.ozgcloud.bescheid.BescheidRequestTestFactory.*; -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; -import java.util.function.Consumer; - -import org.junit.jupiter.api.Assertions; -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.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.security.core.context.SecurityContext; - -import de.ozgcloud.bescheid.Bescheid.SendBy; -import de.ozgcloud.bescheid.binaryfile.BinaryFileService; -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; -import de.ozgcloud.bescheid.common.user.UserProfile; -import de.ozgcloud.bescheid.common.user.UserProfileService; -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandCreatedEventTestFactory; -import de.ozgcloud.command.CommandExecutedEvent; -import de.ozgcloud.command.CommandFailedEvent; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.attached_item.AttachedItemTestFactory; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.BescheidDocumentCreatedEvent; -import de.ozgcloud.document.Document; -import de.ozgcloud.document.DocumentService; -import de.ozgcloud.document.DocumentTestFactory; - -class BescheidEventListenerTest { - - @Spy - @InjectMocks - private BescheidEventListener listener; - - @Mock - private BescheidService service; - @Mock - private BinaryFileService fileService; - @Mock - private AttachedItemService attachedItemService; - @Mock - private DocumentService documentService; - - @Mock - private ApplicationEventPublisher eventPublisher; - @Mock - private CurrentUserService userService; - @Mock - private UserProfileService userProfileService; - @Mock - private TemplateHandler templateHandler; - - @Nested - class TestOnCreateBescheidCommand { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onCreateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).runWithSecurityContext(eq(command), any()); - } - - @Test - void shouldExecuteCreateBescheid() { - listener.onCreateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).doCreateBescheid(command); - } - } - - @Nested - class TestDoCreateBescheid { - - private static final Command COMMAND = CommandTestFactory.createBuilder() - .bodyObject( - Map.of(VORGANG_ID_BODY_KEY, VORGANG_ID.toString(), - BESCHEID_VOM_BODY_KEY, BESCHEID_VOM_STRING, - GENEHMIGT_BODY_KEY, GENEHMIGT)) - .build(); - - @Captor - private ArgumentCaptor<BescheidCreatedEvent> eventCaptor; - - @Test - void shouldCallCreateBescheidDraft() { - listener.doCreateBescheid(COMMAND); - - verify(service).createBescheidDraft(COMMAND); - } - - @Test - @DisplayName("should publish BescheidCreatedEvent after creating BescheidDraft") - void shouldPublishBescheidCreatedEventWithCommand() { - var createdResource = "item-id"; - when(service.createBescheidDraft(any())).thenReturn(createdResource); - - listener.doCreateBescheid(COMMAND); - - verify(eventPublisher).publishEvent(eventCaptor.capture()); - assertThat(eventCaptor.getValue().getCommand()).isSameAs(COMMAND); - } - - @Test - @DisplayName("should publish BescheidCreatedEvent with created resource") - void shouldPublishBescheidCreatedEventWithCreatedResource() { - var createdResource = "item-id"; - when(service.createBescheidDraft(any())).thenReturn(createdResource); - - listener.doCreateBescheid(COMMAND); - - verify(eventPublisher).publishEvent(eventCaptor.capture()); - assertThat(eventCaptor.getValue().getCreatedResource()).isEqualTo(createdResource); - } - } - - @Nested - class TestCreateBescheidRequest { - - private static final Command COMMAND = CommandTestFactory.createBuilder() - .vorgangId(VORGANG_ID.toString()) - .bodyObject( - Map.of(BESCHEID_VOM_BODY_KEY, BESCHEID_VOM_STRING, - GENEHMIGT_BODY_KEY, false)) - .build(); - - @Test - void shouldSetVorgangId() { - var request = createBescheidRequest(); - - assertThat(request.getVorgangId()).isEqualTo(VORGANG_ID); - } - - @Test - void shouldSetBescheidVom() { - var request = createBescheidRequest(); - - assertThat(request.getBescheidVom()).isEqualTo(BESCHEID_VOM); - } - - @Test - void shouldSetGenehmigt() { - var request = createBescheidRequest(); - - assertThat(request.isGenehmigt()).isFalse(); - } - - @Test - void shouldSetDefaultGenehmigt() { - Command command = CommandTestFactory.createBuilder() - .vorgangId(VORGANG_ID.toString()) - .bodyObject( - Map.of(BESCHEID_VOM_BODY_KEY, BESCHEID_VOM_STRING)) - .build(); - - var request = listener.createRequest(command); - - assertThat(request.isGenehmigt()).isTrue(); - } - - @Test - void shouldContainUserProfile() { - UserProfile user = UserProfileTestFactory.create(); - when(userProfileService.getUserProfile()).thenReturn(user); - - var request = listener.createRequest(COMMAND); - - assertThat(request.getCreateFor()).isSameAs(user); - } - - private BescheidRequest createBescheidRequest() { - return listener.createRequest(COMMAND); - } - } - - @Nested - class TestOnDeleteBescheid { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onDeleteBescheid(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).runWithSecurityContext(eq(command), any()); - } - - @Test - void shouldExecuteCreateBescheid() { - listener.onDeleteBescheid(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).doDeleteBescheid(command); - } - } - - @Nested - class TestDoDeleteBescheid { - - @Captor - private ArgumentCaptor<BescheidDeletedEvent> bescheidDeletedEventCaptor; - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallAttachedItemService() { - listener.doDeleteBescheid(command); - - verify(attachedItemService).deleteBescheidDraft(command); - } - - @Test - void shouldPublishCommandExecutedEvent() { - listener.doDeleteBescheid(command); - - verify(eventPublisher).publishEvent(bescheidDeletedEventCaptor.capture()); - assertThat(bescheidDeletedEventCaptor.getValue().getCommand()).isSameAs(command); - } - - } - - @Nested - class TestOnUpdateBescheid { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onUpdateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).runWithSecurityContext(eq(command), any()); - } - - @Test - void shouldExecuteCreateBescheid() { - listener.onUpdateBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).doUpdateBescheid(command); - } - - } - - @Nested - class TestDoUpdateBescheid { - - @Captor - private ArgumentCaptor<BescheidUpdatedEvent> bescheidUpdatedEventCaptor; - - private final Command command = CommandTestFactory.createBuilder().build(); - private final Document document = DocumentTestFactory.create(); - - @BeforeEach - void mock() { - doReturn(Optional.of(document)).when(listener).getDocument(command); - } - - @Test - void shouldGetDocument() { - listener.doUpdateBescheid(command); - - verify(listener).getDocument(command); - } - - @Test - void shouldCallUpdateBescheidDraft() { - listener.doUpdateBescheid(command); - - verify(attachedItemService).updateBescheidDraft(command, Optional.of(document)); - } - - @Test - void shouldPublishBescheidUpdatedEvent() { - listener.doUpdateBescheid(command); - - verify(eventPublisher).publishEvent(bescheidUpdatedEventCaptor.capture()); - assertThat(bescheidUpdatedEventCaptor.getValue().getCommand()).isSameAs(command); - } - } - - @DisplayName("Get document") - @Nested - class TestGetDocument { - - @DisplayName("if exists") - @Nested - class TestIfExists { - - private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - @BeforeEach - void mock() { - when(documentService.getDocument(any())).thenReturn(DocumentTestFactory.create()); - } - - @Test - void shouldCallService() { - listener.getDocument(command); - - verify(documentService).getDocument(DocumentTestFactory.ID); - } - - @Test - void shouldReturnValue() { - var document = listener.getDocument(command); - - assertThat(document.get()).usingRecursiveComparison().isEqualTo(DocumentTestFactory.create()); - } - } - - @Test - void shouldReturnEmptyIfNoDocumentExists() { - var document = listener.getDocument(createCommandWithoutDocument()); - - assertThat(document).isEmpty(); - } - - private Command createCommandWithoutDocument() { - var bescheidItemMap = AttachedItemTestFactory.createBescheidItem(); - bescheidItemMap.remove(DocumentTestFactory.ID); - return CommandTestFactory.createBuilder().bodyObject(bescheidItemMap).build(); - } - } - - @Nested - class TestOnCreateBescheidDocument { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onCreatedBescheidDocument(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).runWithSecurityContext(eq(command), any()); - } - - @Test - void shouldExecuteCreateBescheidDocument() { - listener.onCreatedBescheidDocument(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).doCreateBescheidDocument(command); - } - } - - @Nested - class TestDoCreateBescheidDocument { - - private static final Command COMMAND = CommandTestFactory.create(); - private static final BescheidResponse BESCHEID = BescheidResponseTestFactory.create(); - - @Captor - private ArgumentCaptor<BescheidDocumentCreatedEvent> eventCaptor; - - @BeforeEach - void init() { - doReturn(BESCHEID).when(listener).doCreateBescheidBiz(any()); - } - - @Test - void shouldCallCreateBescheidBiz() { - listener.doCreateBescheidDocument(COMMAND); - - verify(listener).doCreateBescheidBiz(COMMAND); - } - - @Test - void shouldCallCreateBescheidDocument() { - listener.doCreateBescheidDocument(COMMAND); - - verify(documentService).createBescheidDocument(COMMAND, BESCHEID); - } - - @Test - @DisplayName("should publish BescheidDocumentCreatedEvent with command") - void shouldPublishEventWithCommand() { - listener.doCreateBescheidDocument(COMMAND); - - verify(eventPublisher).publishEvent(eventCaptor.capture()); - assertThat(eventCaptor.getValue().getCommand()).isEqualTo(COMMAND); - } - - @Test - @DisplayName("should publish BescheidDocumentCreatedEvent with createdResource") - void shouldPublishEventWithCreatedResource() { - var bescheidDocument = "document-id"; - when(documentService.createBescheidDocument(any(), any(BescheidResponse.class))).thenReturn(bescheidDocument); - - listener.doCreateBescheidDocument(COMMAND); - - verify(eventPublisher).publishEvent(eventCaptor.capture()); - assertThat(eventCaptor.getValue().getCreatedResource()).isEqualTo(bescheidDocument); - } - } - - @Nested - class TestCreateBescheidBiz { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallCreateRequest() { - listener.doCreateBescheidBiz(command); - - verify(listener).createRequest(command); - } - - @Test - void shouldCallBescheidService() { - var bescheidRequest = BescheidRequestTestFactory.create(); - doReturn(bescheidRequest).when(listener).createRequest(any()); - - listener.doCreateBescheidBiz(command); - - verify(service).createBescheid(bescheidRequest); - } - - @Test - void shouldCallFileService() { - var bescheid = BescheidResponseTestFactory.create(); - when(service.createBescheid(any())).thenReturn(bescheid); - - listener.doCreateBescheidBiz(command); - - verify(fileService).uploadBescheidFile(bescheid); - } - - @Test - void shouldReturnBescheid() { - var bescheid = BescheidResponseTestFactory.create(); - when(fileService.uploadBescheidFile(any())).thenReturn(bescheid); - - var result = listener.doCreateBescheidBiz(command); - - assertThat(result).isSameAs(bescheid); - } - } - - @Nested - class TestOnSendBescheidCommand { - - private final Command command = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onSendBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).runWithSecurityContext(eq(command), any()); - } - - @Test - void shouldExecuteDoSendBescheid() { - listener.onSendBescheidCommand(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).doSendBescheid(command); - } - } - - @Nested - class TestDoSendBescheid { - - @Captor - private ArgumentCaptor<BescheidSentEvent> bescheidSentEventCaptor; - - @Test - void shouldThrowExceptionIfUnkonwnSendBy() { - var item = AttachedItemTestFactory.createBescheidItem(); - item.put(Bescheid.FIELD_SEND_BY, "unknown"); - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(item).build(); - when(attachedItemService.getItem(any())).thenReturn(bescheidItem); - var command = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID).build(); - - Assertions.assertThrows(TechnicalException.class, () -> listener.doSendBescheid(command)); - } - - @DisplayName("manually") - @Nested - class TestManually { - - private static final Command COMMAND = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID) - .relationVersion(AttachedItemTestFactory.VERSION).bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - private final AttachedItem bescheidItem = createManuallyBescheidItem(); - - private AttachedItem createManuallyBescheidItem() { - var attachedItem = AttachedItemTestFactory.createBescheid(); - var item = new HashMap<>(attachedItem.getItem()); - - item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL); - - return attachedItem.toBuilder().item(item).build(); - } - - @BeforeEach - void init() { - when(attachedItemService.getItem(any())).thenReturn(bescheidItem); - } - - @Test - void shouldCallSendBescheid() { - listener.doSendBescheid(COMMAND); - - verify(service).sendBescheidManually(bescheidItem, COMMAND); - verify(service, never()).sendBescheidPostfachMail(any(), any()); - } - - @Test - void shouldPublishEvent() { - listener.doSendBescheid(COMMAND); - - verify(eventPublisher).publishEvent(bescheidSentEventCaptor.capture()); - assertThat(bescheidSentEventCaptor.getValue().getCommand()).isEqualTo(COMMAND); - } - } - - @DisplayName("per postfach mail") - @Nested - class TestPostfachMail { - - private static final Command COMMAND = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID) - .relationVersion(AttachedItemTestFactory.VERSION).bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - private AttachedItem bescheidItem; - - @BeforeEach - void init() { - var item = AttachedItemTestFactory.createBescheidItem(); - item.put(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()); - bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(item).build(); - when(attachedItemService.getItem(any())).thenReturn(bescheidItem); - } - - @Test - void shouldCallBescheidService() { - listener.doSendBescheid(COMMAND); - - verify(service).sendBescheidPostfachMail(bescheidItem, COMMAND); - verify(service, never()).sendBescheidManually(any(), any()); - } - - @Test - void shouldPublishEvent() { - listener.doSendBescheid(COMMAND); - - verify(eventPublisher).publishEvent(bescheidSentEventCaptor.capture()); - assertThat(bescheidSentEventCaptor.getValue().getCommand()).isEqualTo(COMMAND); - } - } - } - - @Nested - class TestOnBescheidSent { - - private static final Command COMMAND = CommandTestFactory.create(); - - @Test - void shouldCallRunWithSecurityContext() { - listener.onBescheidSent(new CommandExecutedEvent(COMMAND)); - - verify(listener).runWithSecurityContext(eq(COMMAND), any()); - } - - @Test - void shouldExecuteSetAntragBewilligung() { - listener.onBescheidSent(new CommandExecutedEvent(COMMAND)); - - verify(listener).setAntragBewilligung(COMMAND); - } - } - - @Nested - class TestSetAntragBewilligung { - - private static final Command COMMAND = CommandTestFactory.create(); - - @Test - void shouldCallGetItem() { - listener.setAntragBewilligung(COMMAND); - - verify(attachedItemService).getItem(CommandTestFactory.RELATION_ID); - } - - @Test - void shouldCallSetAntragBewilligung() { - var item = AttachedItemTestFactory.createBescheid(); - when(attachedItemService.getItem(any())).thenReturn(item); - - listener.setAntragBewilligung(COMMAND); - - verify(service).setAntragBewilligung(item); - } - } - - @Nested - class TestRunWithSecurityContext { - - private final Command command = CommandTestFactory.createBuilder().build(); - - @Mock - private Consumer<Command> commandExecutor; - @Mock - private SecurityContext secContext; - @Captor - private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor; - - @BeforeEach - void init() { - when(userService.startSecurityContext(any())).thenReturn(secContext); - } - - @Test - void shouldStartSecurityContext() { - listener.runWithSecurityContext(command, commandExecutor); - - verify(userService).startSecurityContext(command); - } - - @Test - void shouldExecuteCommand() { - listener.runWithSecurityContext(command, commandExecutor); - - verify(commandExecutor).accept(command); - } - - @Test - void shouldResetSecurityContext() { - listener.runWithSecurityContext(command, commandExecutor); - - verify(userService).resetSecurityContext(secContext); - } - - @Test - void shouldResetSecurityContextAfterException() { - doThrow(new RuntimeException("ups")).when(commandExecutor).accept(any()); - - listener.runWithSecurityContext(command, commandExecutor); - - verify(userService).resetSecurityContext(secContext); - } - - @Test - void shouldPublishCommandFailedEvent() { - doThrow(new RuntimeException("ups")).when(commandExecutor).accept(any()); - - listener.runWithSecurityContext(command, commandExecutor); - - verify(eventPublisher).publishEvent(commandFailedEventCaptor.capture()); - assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId()); - assertThat(commandFailedEventCaptor.getValue().getErrorMessage()).isNotEmpty(); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java index 04871bb15ac3d213da2197b73610bd3660bd410e..311d893f13c7e541cd15f8763e33d2736d7b3f59 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidGrpcServiceTest.java @@ -17,11 +17,13 @@ import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; -import de.ozgcloud.bescheid.vorgang.VorgangId; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.common.attached_item.AttachedItemMapper; -import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.attached_item.AttachedItemTestFactory; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.BescheidService; +import de.ozgcloud.document.bescheid.vorgang.VorgangId; +import de.ozgcloud.document.common.attached_item.AttachedItemMapper; +import de.ozgcloud.document.common.attached_item.AttachedItemService; import io.grpc.stub.StreamObserver; class BescheidGrpcServiceTest { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java index cdd3c20e856282db187f1f101422e449e2ecd354..58d8b89820838aba7b2f76a916c3ce1da3d91b1b 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidManagerConfigTestFactory.java @@ -23,8 +23,9 @@ */ package de.ozgcloud.bescheid; -import de.ozgcloud.bescheid.BescheidManagerConfig.BescheidManagerConfigBuilder; -import de.ozgcloud.bescheid.BescheidManagerConfig.Features; +import de.ozgcloud.document.bescheid.BescheidManagerConfig; +import de.ozgcloud.document.bescheid.BescheidManagerConfig.BescheidManagerConfigBuilder; +import de.ozgcloud.document.bescheid.BescheidManagerConfig.Features; public class BescheidManagerConfigTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java index 4e867c490dcc6bdcecd99e3b26cbc221caf686be..feabd948c1bd5f5233bcc69761dd1fc5eb040bd7 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidMapperTest.java @@ -19,9 +19,11 @@ import org.mockito.Spy; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItemService; import de.ozgcloud.common.attached_item.AttachedItemTestFactory; import de.ozgcloud.document.DocumentTestFactory; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.BescheidCallContextAttachingInterceptor; +import de.ozgcloud.document.common.attached_item.AttachedItemService; class BescheidMapperTest { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java deleted file mode 100644 index dbe4f9e43deb4fbcd43ea0b8b960bc3861570174..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidRequestTestFactory.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.time.LocalDate; - -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; - -public class BescheidRequestTestFactory { - - static final VorgangId VORGANG_ID = VorgangTestFactory.ID; - static final String BESCHEID_VOM_STRING = "2023-01-04"; - static final LocalDate BESCHEID_VOM = LocalDate.parse(BESCHEID_VOM_STRING); - static final boolean GENEHMIGT = true; - - public static BescheidRequest create() { - return createBuilder().build(); - } - - public static BescheidRequest.BescheidRequestBuilder createBuilder() { - return BescheidRequest.builder() - .vorgangId(VORGANG_ID) - .bescheidVom(BESCHEID_VOM) - .genehmigt(GENEHMIGT) - .createFor(UserProfileTestFactory.create()); - - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java deleted file mode 100644 index 94581c9fe21016dfb70cdb0b7f5279b42f877b94..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidResponseTestFactory.java +++ /dev/null @@ -1,42 +0,0 @@ -package de.ozgcloud.bescheid; - -import java.io.File; -import java.util.Optional; - -import org.springframework.http.MediaType; - -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; -import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.document.DocumentTestFactory; - -public class BescheidResponseTestFactory { - - public static final String BESCHEID_FILE_NAME = "testbescheid"; - public static final File BESCHEID_FILE = TempFileUtils.writeTmpFile(BESCHEID_FILE_NAME.getBytes()); - public static final int BESCHEID_FILE_SIZE = BESCHEID_FILE_NAME.getBytes().length; - - public static final String CONTENT_TYPE = MediaType.APPLICATION_PDF_VALUE; - - public static BescheidResponse create() { - return createBuilder().build(); - } - - public static BescheidResponse.BescheidResponseBuilder createBuilder() { - return BescheidResponse.builder() - .createdBy(UserProfileTestFactory.ID) - .vorgangId(VorgangTestFactory.ID) - .contentType(CONTENT_TYPE) - .bescheidFileName(BESCHEID_FILE_NAME) - .bescheidFile(BESCHEID_FILE) - .bescheidFileId(FileId.from(DocumentTestFactory.ID)) - .nachrichtSubject(Optional.of(BescheidTestFactory.NACHRICHT_SUBJECT)) - .nachrichtText(Optional.of(BescheidTestFactory.NACHRICHT_TEXT)) - .bewilligt(BescheidTestFactory.BEWILLIGT) - .size(BESCHEID_FILE_SIZE) - .attachments(BescheidTestFactory.ATTACHMENTS) - .serviceKonto(ServiceKontoTestFactory.create()); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java deleted file mode 100644 index e593e429c550d90454013369ab01640091b5afef..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidServiceTest.java +++ /dev/null @@ -1,1599 +0,0 @@ -package de.ozgcloud.bescheid; - -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.time.ZonedDateTime; -import java.time.format.DateTimeFormatter; -import java.time.temporal.ChronoUnit; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -import org.apache.commons.lang3.StringUtils; -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.EnumSource; -import org.junit.jupiter.params.provider.NullSource; -import org.junit.jupiter.params.provider.ValueSource; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.boot.info.BuildProperties; -import org.springframework.test.util.ReflectionTestUtils; - -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.common.datatypes.GenericId; -import de.ozgcloud.apilib.user.OzgCloudUserId; -import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; -import de.ozgcloud.bescheid.Bescheid.SendBy; -import de.ozgcloud.bescheid.administration.AdministrationService; -import de.ozgcloud.bescheid.attributes.ClientAttributeService; -import de.ozgcloud.bescheid.common.freemarker.TemplateHandler; -import de.ozgcloud.bescheid.common.user.UserProfile; -import de.ozgcloud.bescheid.common.user.UserProfileService; -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; -import de.ozgcloud.bescheid.vorgang.PostfachAddressTestFactory; -import de.ozgcloud.bescheid.vorgang.ServiceKontoTestFactory; -import de.ozgcloud.bescheid.vorgang.Vorgang; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.bescheid.vorgang.VorgangService; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.attached_item.AttachedItemTestFactory; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.datatype.StringBasedValue; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.DocumentTestFactory; - -class BescheidServiceTest { - - @Spy - @InjectMocks - private BescheidService service; - - @Mock - private VorgangService vorgangService; - @Mock - private AttachedItemService attachedItemService; - @Mock - private UserProfileService userProfileService; - @Mock - private OzgCloudCommandService commandService; - @Mock - private CommandMapper commandMapper; - @Mock - private ClientAttributeService clientAttributeService; - @Mock - private BuildProperties buildProperties; - @Mock - private BescheidRemoteService remoteService; - @Mock - private BescheidMapper mapper; - @Mock - private AdministrationService administrationService; - @Mock - private TemplateHandler templateHandler; - - @BeforeEach - void init() { - ReflectionTestUtils.setField(service, "remoteService", Optional.of(remoteService)); - } - - @Nested - class TestFindDraft { - - private final AttachedItem vorgangAttachedItem = AttachedItemTestFactory.create(); - - private final Bescheid bescheid = BescheidTestFactory.create(); - - @BeforeEach - void mock() { - when(attachedItemService.findBescheidItem(any())).thenReturn(Optional.of(vorgangAttachedItem)); - when(mapper.mapFromAttachedItem(any())).thenReturn(bescheid); - } - - @Test - void shouldCallVorgangAttachedItemRemoteService() { - service.findDraft(VorgangTestFactory.ID_STR); - - verify(attachedItemService).findBescheidItem(VorgangTestFactory.ID); - } - - @Test - void shouldCallMapper() { - service.findDraft(VorgangTestFactory.ID_STR); - - verify(mapper).mapFromAttachedItem(vorgangAttachedItem); - } - - @Test - void shouldReturnValue() { - var draft = service.findDraft(VorgangTestFactory.ID_STR); - - assertThat(draft).hasValue(bescheid); - } - } - - @DisplayName("Find all") - @Nested - class TestFindAll { - - private final AttachedItem attachedItem = AttachedItemTestFactory.create(); - private final Bescheid bescheid = BescheidTestFactory.create(); - - @BeforeEach - void mock() { - when(attachedItemService.findAllBescheid(any())).thenReturn(Collections.singleton(attachedItem)); - when(mapper.mapFromAttachedItem(any())).thenReturn(bescheid); - } - - @Test - void shouldCallVorgangAttachedItemService() { - findAll(); - - verify(attachedItemService).findAllBescheid(VorgangTestFactory.ID); - } - - @Test - void shouldCallMapper() { - findAll(); - - verify(mapper).mapFromAttachedItem(attachedItem); - } - - @Test - void shouldReturnValue() { - var bescheide = findAll(); - - assertThat(bescheide).containsExactly(bescheid); - } - - private List<Bescheid> findAll() { - return service.findAll(VorgangTestFactory.ID).toList(); - } - } - - @Nested - class TestCreateBescheidDraft { - - private static final Map<String, Object> COMMAND_BODY = Map.of("key", "value"); - private static final Command COMMAND = CommandTestFactory.createBuilder().bodyObject(COMMAND_BODY).build(); - private static final Bescheid BESCHEID_DRAFT = BescheidTestFactory.create(); - - @BeforeEach - void init() { - doNothing().when(service).validateBescheidData(any()); - doReturn(BESCHEID_DRAFT).when(service).buildBescheidDraft(any()); - } - - @Test - void shouldCallValidateBescheidData() { - service.createBescheidDraft(COMMAND); - - verify(service).validateBescheidData(COMMAND_BODY); - } - - @Test - void shouldCallAttachedItemService() { - service.createBescheidDraft(COMMAND); - - verify(attachedItemService).createBescheidDraft(BESCHEID_DRAFT); - } - - @Test - void shouldReturnResult() { - var createdBescheidId = "created-bescheid-id"; - when(attachedItemService.createBescheidDraft(any(Bescheid.class))).thenReturn(createdBescheidId); - - var result = service.createBescheidDraft(COMMAND); - - assertThat(result).isEqualTo(createdBescheidId); - } - } - - @Nested - class TestValidateBescheidData { - - private static final Command CREATE_BESCHEID_DRAFT_COMMAND = CommandTestFactory.createBuilder() - .bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - @Test - void shouldValidate() { - assertDoesNotThrow(() -> service.validateBescheidData(CREATE_BESCHEID_DRAFT_COMMAND.getBodyObject())); - } - - @DisplayName("should fail if bescheidAm is missing") - @Test - void shouldThrowExceptionByBescheidAm() { - var map = Map.<String, Object>of(Bescheid.FIELD_BEWILLIGT, true); - - assertThrows(TechnicalException.class, () -> service.validateBescheidData(map)); - } - - @DisplayName("should fail if bewilligt is missing") - @Test - void shouldThrowExceptionByBewilligt() { - var map = Map.<String, Object>of(Bescheid.FIELD_BESCHIEDEN_AM, "2021-01-01"); - - assertThrows(TechnicalException.class, () -> service.validateBescheidData(map)); - } - - @Test - void shouldValidateSendBy() { - var bodyObject = Map.<String, Object>of(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name()); - doNothing().when(service).validateBescheidField(any(), any()); - - service.validateBescheidData(bodyObject); - - verify(service).validateSendBy(SendBy.MANUAL.name()); - } - - @DisplayName("validate sendBy") - @Nested - class TestValidateSendBy { - - @ValueSource(strings = { "not-exist", "" }) - @ParameterizedTest - void shouldThrowExceptionOnNonExistingSendByValue(String sendBy) { - assertThrows(TechnicalException.class, () -> service.validateSendBy(sendBy)); - } - - @EnumSource(names = { "NACHRICHT", "MANUAL" }) - @ParameterizedTest - void shouldNotThrowAnyExceptionOnExistingSendByValue(SendBy sendBy) { - assertDoesNotThrow(() -> service.validateSendBy(sendBy.name())); - } - } - } - - @Nested - class TestBuildBescheidDraft { - - private static final Command CREATE_BESCHEID_DRAFT_COMMAND = CommandTestFactory.createBuilder() - .bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - private final Bescheid bescheid = BescheidTestFactory.createBuilder().status(Bescheid.Status.SENT).build(); - - @BeforeEach - void init() { - when(mapper.mapFromCommand(any())).thenReturn(bescheid); - } - - @Test - void shouldCallMapFromCommand() { - buildBescheidDraft(); - - verify(mapper).mapFromCommand(CREATE_BESCHEID_DRAFT_COMMAND); - } - - @Test - void shouldResetId() { - var result = buildBescheidDraft(); - - assertThat(result.getId()).isNull(); - } - - @Test - void shouldResetVersion() { - var result = buildBescheidDraft(); - - assertThat(result.getVersion()).isZero(); - } - - @Test - void shouldSetStatus() { - var result = buildBescheidDraft(); - - assertThat(result.getStatus()).isEqualTo(Bescheid.Status.DRAFT); - } - - @Test - void shouldNotOverrideNachrichtSubject() { - var result = buildBescheidDraft(); - - assertThat(result.getNachrichtSubject()).contains(BescheidTestFactory.NACHRICHT_SUBJECT); - } - - @Test - void shouldSetNachrichtSubject() { - var bescheid = BescheidTestFactory.createBuilder().nachrichtSubject(Optional.empty()).build(); - when(mapper.mapFromCommand(any())).thenReturn(bescheid); - - var result = buildBescheidDraft(); - - assertThat(result.getNachrichtSubject()).contains(BescheidService.SUBJECT); - } - - @Test - void shouldNotOverrideNachrichtText() { - var result = buildBescheidDraft(); - - assertThat(result.getNachrichtText()).contains(BescheidTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldCallCreateNachrichtText() { - var createdText = "created text"; - doReturn(createdText).when(service).createNachrichtText(); - var bescheid = BescheidTestFactory.createBuilder().nachrichtText(Optional.empty()).build(); - when(mapper.mapFromCommand(any())).thenReturn(bescheid); - - buildBescheidDraft(); - - verify(service).createNachrichtText(); - } - - @Test - void shouldSetNachrichtText() { - var createdText = "created text"; - doReturn(createdText).when(service).createNachrichtText(); - var bescheid = BescheidTestFactory.createBuilder().nachrichtText(Optional.empty()).build(); - when(mapper.mapFromCommand(any())).thenReturn(bescheid); - - var result = buildBescheidDraft(); - - assertThat(result.getNachrichtText()).contains(createdText); - } - - private Bescheid buildBescheidDraft() { - return service.buildBescheidDraft(CREATE_BESCHEID_DRAFT_COMMAND); - } - } - - @Nested - class TestCreateNachrichtText { - - @Captor - private ArgumentCaptor<Map<String, Object>> signatureCaptor; - - @Test - void shouldCallGetTemplateParameters() { - service.createNachrichtText(); - - verify(service).getTemplateParameters(); - } - - @Test - void shouldCallFillTemplate() { - var parameterMap = Map.<String, Object>of("key", "value"); - doReturn(parameterMap).when(service).getTemplateParameters(); - - service.createNachrichtText(); - - verify(templateHandler).fillTemplate(BescheidService.DEFAULT_NACHRICHT_TEMPLATE_FILE, parameterMap); - } - - @Test - void shouldReturnNachricht() { - when(templateHandler.fillTemplate(any(), any())).thenReturn(BescheidTestFactory.NACHRICHT_TEXT); - - var result = service.createNachrichtText(); - - assertThat(result).isEqualTo(BescheidTestFactory.NACHRICHT_TEXT); - } - } - - @Nested - class TestGetTemplateParameters { - - @Test - void shouldCallAdministrationService() { - service.createNachrichtText(); - - verify(administrationService).getNachrichtSignature(); - } - - @Test - void shouldReturnParameters() { - var signature = "signature"; - when(administrationService.getNachrichtSignature()).thenReturn(Optional.of(signature)); - - var result = service.getTemplateParameters(); - - assertThat(result).containsEntry(BescheidService.KEY_TEMPLATE_SIGNATURE, signature); - } - - @Test - void shouldReturnEmptyMap() { - var result = service.getTemplateParameters(); - - assertThat(result).isEmpty(); - } - } - - @Nested - class TestCreateBescheid { - - private final Vorgang vorgang = VorgangTestFactory.create(); - private final BescheidResponse bescheid = BescheidResponseTestFactory.createBuilder().vorgangId(null).build(); - - @BeforeEach - void initMocks() { - when(vorgangService.getById(any())).thenReturn(vorgang); - when(remoteService.create(any(), any())).thenReturn(bescheid); - } - - @Test - void shouldLoadVorgang() { - service.createBescheid(BescheidRequestTestFactory.create()); - - verify(vorgangService).getById(VorgangTestFactory.ID); - } - - @Test - void shouldCreateBescheid() { - BescheidRequest request = BescheidRequestTestFactory.create(); - - service.createBescheid(request); - - verify(remoteService).create(request, vorgang); - } - - @Test - void shouldReturnCreatedBescheid() { - var result = service.createBescheid(BescheidRequestTestFactory.create()); - - assertThat(result).usingRecursiveComparison().isEqualTo(BescheidResponseTestFactory.create()); - } - } - - @Nested - class TestSendBescheidManually { - - private static final Vorgang VORGANG = VorgangTestFactory.create(); - - @Mock - private OzgCloudCommand subCommand; - - @Captor - private ArgumentCaptor<VorgangId> vorgangIdCaptor; - - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); - - @BeforeEach - void init() { - doNothing().when(service).validateBescheidSendManually(any(), anyLong()); - doNothing().when(service).addSubCommands(any(), any()); - doReturn(UserProfileTestFactory.ID_STR).when(service).getUserId(); - doReturn(List.of(subCommand)).when(service).buildSetBescheidSentSubCommands(any(), any(), any()); - when(vorgangService.getById(any())).thenReturn(VORGANG); - } - - @Test - void shouldCallValidateBescheid() { - sendBescheid(); - - verify(service).validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION); - } - - @Test - void shouldCallGetVorgang() { - sendBescheid(); - - verify(vorgangService).getById(vorgangIdCaptor.capture()); - assertThat(vorgangIdCaptor.getValue()).hasToString(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldCallGetUserId() { - sendBescheid(); - - verify(service).getUserId(); - } - - @Test - void shouldCallBuildSetBescheidSentSubCommands() { - sendBescheid(); - - verify(service).buildSetBescheidSentSubCommands(bescheidItem, VORGANG, UserProfileTestFactory.ID_STR); - } - - @Test - void shouldCallAddSubCommands() { - sendBescheid(); - - verify(service).addSubCommands(CommandTestFactory.ID, List.of(subCommand)); - } - - private void sendBescheid() { - var parentCommand = CommandTestFactory.createBuilder().relationVersion(AttachedItemTestFactory.VERSION).build(); - service.sendBescheidManually(bescheidItem, parentCommand); - } - } - - @Nested - class TestValidateBescheidSendManually { - - private final AttachedItem attachedItem = createManuallySendBescheid(); - - private AttachedItem createManuallySendBescheid() { - var bescheidItem = AttachedItemTestFactory.createBescheid(); - var item = new HashMap<>(bescheidItem.getItem()); - - item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name()); - - return bescheidItem.toBuilder().item(item).build(); - } - - @Test - void shouldCallValidateBescheid() { - service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION); - - verify(service).validateBescheid(attachedItem, AttachedItemTestFactory.VERSION); - } - - @Test - void shouldValidate() { - doNothing().when(service).validateBescheid(any(), anyLong()); - - assertDoesNotThrow(() -> service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION)); - } - - @DisplayName("should decline when") - @ParameterizedTest(name = "sendBy = {0}") - @EnumSource(value = Bescheid.SendBy.class, names = "MANUAL", mode = EnumSource.Mode.EXCLUDE) - void shouldDeclineSendByNotManual(Bescheid.SendBy sendBy) { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_SEND_BY, sendBy.name()).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("sendBy"); - } - } - - @Nested - class TestSendBescheidPostfachMail { - - private static final Command PARENT_COMMAND = CommandTestFactory.createBuilder().relationVersion(AttachedItemTestFactory.VERSION).build(); - private static final Vorgang.ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.create(); - private static final Vorgang VORGANG = VorgangTestFactory.createBuilder().serviceKonto(SERVICE_KONTO).build(); - - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @Mock - private OzgCloudCommand setBescheidSentSubCommand; - @Mock - private OzgCloudCommand sendPostfachNachrichtSubCommand; - @Captor - private ArgumentCaptor<VorgangId> vorgangIdCaptor; - @Captor - private ArgumentCaptor<List<OzgCloudCommand>> subCommandsCaptor; - - @BeforeEach - void init() { - doNothing().when(service).validateBescheidSendPostfach(any(), anyLong()); - doNothing().when(service).addSubCommands(any(), any()); - doReturn(UserProfileTestFactory.ID_STR).when(service).getUserId(); - var subCommands = new ArrayList<OzgCloudCommand>(); - subCommands.add(setBescheidSentSubCommand); - doReturn(subCommands).when(service).buildSetBescheidSentSubCommands(any(), any(), any()); - doReturn(sendPostfachNachrichtSubCommand).when(service).buildSendPostfachNachrichtCommand(any(), any(), any()); - when(vorgangService.getById(any())).thenReturn(VORGANG); - } - - @Test - void shouldCallValidateBescheid() { - sendBescheid(); - - verify(service).validateBescheidSendPostfach(BESCHEID_ITEM, AttachedItemTestFactory.VERSION); - } - - @Test - void shouldCallVorgangService() { - sendBescheid(); - - verify(vorgangService).getById(vorgangIdCaptor.capture()); - assertThat(vorgangIdCaptor.getValue()).hasToString(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldCallGetUserId() { - sendBescheid(); - - verify(service).getUserId(); - } - - @Test - void shouldCallBuildSetBescheidSentSubCommands() { - sendBescheid(); - - verify(service).buildSetBescheidSentSubCommands(BESCHEID_ITEM, VORGANG, UserProfileTestFactory.ID_STR); - } - - @Test - void shouldCallBuildSendPostfachNachrichtCommand() { - sendBescheid(); - - verify(service).buildSendPostfachNachrichtCommand(BESCHEID_ITEM, SERVICE_KONTO, UserProfileTestFactory.ID_STR); - } - - @Test - void shouldCallAddSubCommands() { - sendBescheid(); - - verify(service).addSubCommands(eq(CommandTestFactory.ID), subCommandsCaptor.capture()); - assertThat(subCommandsCaptor.getValue()).containsExactly(setBescheidSentSubCommand, sendPostfachNachrichtSubCommand); - } - - private void sendBescheid() { - service.sendBescheidPostfachMail(BESCHEID_ITEM, PARENT_COMMAND); - } - } - - @Nested - class TestValidateBescheidSendPostfach { - - @Test - void shouldCallValidateBescheid() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() - .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); - - service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION); - - verify(service).validateBescheid(bescheidItem, AttachedItemTestFactory.VERSION); - } - - @Test - void shouldValidate() { - doNothing().when(service).validateBescheid(any(), anyLong()); - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() - .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); - - assertDoesNotThrow(() -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)); - } - - @DisplayName("should decline when") - @ParameterizedTest(name = "sendBy = {0}") - @EnumSource(value = Bescheid.SendBy.class, names = "NACHRICHT", mode = EnumSource.Mode.EXCLUDE) - void shouldDeclineSendByNotPostfach(Bescheid.SendBy sendBy) { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() - .itemEntry(Bescheid.FIELD_SEND_BY, sendBy.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("sendBy"); - } - - @Test - void shouldDeclineWhenNoSubject() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() - .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, null) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("nachricht subject"); - } - - @Test - void shouldDeclineWhenNoText() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder() - .itemEntry(Bescheid.FIELD_SEND_BY, Bescheid.SendBy.NACHRICHT.name()) - .itemEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT) - .itemEntry(Bescheid.FIELD_NACHRICHT_TEXT, null).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendPostfach(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("nachricht text"); - } - } - - @Nested - class TestValidateBescheid { - - private final AttachedItem attachedItem = createManuallySendBescheid(); - - private AttachedItem createManuallySendBescheid() { - var bescheidItem = AttachedItemTestFactory.createBescheid(); - var item = new HashMap<>(bescheidItem.getItem()); - - item.put(Bescheid.FIELD_SEND_BY, SendBy.MANUAL.name()); - - return bescheidItem.toBuilder().item(item).build(); - } - - @Test - void shouldValidateBescheid() { - assertDoesNotThrow(() -> service.validateBescheidSendManually(attachedItem, AttachedItemTestFactory.VERSION)); - } - - @DisplayName("should decline when") - @ParameterizedTest(name = "status = {0}") - @EnumSource(value = Bescheid.Status.class, names = "DRAFT", mode = EnumSource.Mode.EXCLUDE) - void shouldDeclineNotDraft(Bescheid.Status status) { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_STATUS, status.name()).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("has status"); - } - - @Test - void shouldDeclineWhenNoDocument() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, null).build(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION)).getMessage(); - assertThat(message).contains("document"); - } - - @Test - void shouldDeclineWhenVersionMismatch() { - var bescheidItem = AttachedItemTestFactory.createBescheid(); - - var message = assertThrows(TechnicalException.class, - () -> service.validateBescheidSendManually(bescheidItem, AttachedItemTestFactory.VERSION + 1)).getMessage(); - assertThat(message).contains("version"); - } - } - - @Nested - class TestGetAttachments { - - @Test - void shouldReturnEmptyList() { - var result = service.getAttachments(AttachedItemTestFactory.createBescheidBuilder().clearItem().build()); - - assertThat(result).isEmpty(); - } - - @Nested - class TestWithCollection { - - @Test - void shouldReturnAttachments() { - var result = service.getAttachments(AttachedItemTestFactory.createBescheid()); - - assertThat(result).containsExactly(BescheidTestFactory.ATTACHMENT, BescheidTestFactory.ATTACHMENT); - } - - @Test - void shouldReturnEmpty() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem() - .itemEntry(Bescheid.FIELD_ATTACHMENTS, Collections.emptyList()).build(); - - var result = service.getAttachments(bescheidItem); - - assertThat(result).isEmpty(); - } - - } - - @Nested - class TestSingleAttachment { - - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem() - .itemEntry(Bescheid.FIELD_ATTACHMENTS, BescheidTestFactory.ATTACHMENT).build(); - - @Test - void shouldCallGetStringAsList() { - service.getAttachments(bescheidItem); - - verify(service).getStringAsList(BescheidTestFactory.ATTACHMENT); - } - - @Test - void shouldReturnBescheidFileIdList() { - var expectedResult = List.of(BescheidTestFactory.ATTACHMENT); - doReturn(expectedResult).when(service).getStringAsList(any()); - - var result = service.getAttachments(bescheidItem); - - assertThat(result).isSameAs(expectedResult); - } - } - } - - @Nested - class TestGetStringAsList { - - @DisplayName("should return empty list when") - @ParameterizedTest(name = "value = \"{0}\"") - @NullSource - @ValueSource(strings = { "", " " }) - void shouldReturnEmptyListOnBlankValue(String value) { - var result = service.getStringAsList(value); - - assertThat(result).isEmpty(); - } - - @Test - void shouldReturnEmptyListOnUnexpectedType() { - var result = service.getStringAsList(0); - - assertThat(result).isEmpty(); - } - } - - @Nested - class TestAddSubCommands { - - @Mock - private OzgCloudCommand subCommand; - @Mock - private OzgCloudCreateSubCommandsRequest createSubCommandsRequest; - - @Test - void shouldCallBuildCreateSubCommandsRequest() { - var subCommands = List.of(subCommand); - - service.addSubCommands(CommandTestFactory.ID, subCommands); - - verify(service).buildCreateSubCommandsRequest(CommandTestFactory.ID, subCommands); - } - - @Test - void shouldCallCommandService() { - doReturn(createSubCommandsRequest).when(service).buildCreateSubCommandsRequest(any(), any()); - - service.addSubCommands(CommandTestFactory.ID, List.of(subCommand)); - - verify(commandService).addSubCommands(createSubCommandsRequest); - } - } - - @Nested - class TestGetBescheidFileId { - - @BeforeEach - void init() { - when(attachedItemService.getItem(anyString())).thenReturn(AttachedItemTestFactory.createDocument()); - } - - @Test - void shouldCallGetItem() { - service.getBescheidFileId(AttachedItemTestFactory.createBescheid()); - - verify(attachedItemService).getItem(DocumentTestFactory.ID); - } - - @Test - void shouldReturnBescheidFileId() { - var result = service.getBescheidFileId(AttachedItemTestFactory.createBescheid()); - - assertThat(result).hasToString(DocumentTestFactory.DOCUMENT_FILE); - } - } - - @Nested - class TestGetNachrichtSubject { - - @Test - void shouldReturnSubject() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(Map.of(Bescheid.FIELD_NACHRICHT_SUBJECT, - BescheidTestFactory.NACHRICHT_SUBJECT)).build(); - - var result = service.getNachrichtSubject(bescheidItem); - - assertThat(result).contains(BescheidTestFactory.NACHRICHT_SUBJECT); - } - } - - @Nested - class TestGetNachrichtText { - - @Test - void shouldReturnText() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().item(Map.of(Bescheid.FIELD_NACHRICHT_TEXT, - BescheidTestFactory.NACHRICHT_TEXT)).build(); - - var result = service.getNachrichtText(bescheidItem); - - assertThat(result).contains(BescheidTestFactory.NACHRICHT_TEXT); - } - } - - @Nested - class TestGetUserId { - - @Mock - private UserProfile userProfile; - - @BeforeEach - void init() { - when(userProfileService.getUserProfile()).thenReturn(userProfile); - when(userProfile.getId()).thenReturn(UserProfileTestFactory.ID); - - } - - @Test - void shouldCallGetUserProfile() { - service.getUserId(); - - verify(userProfileService).getUserProfile(); - } - - @Test - void shouldReturnUserId() { - var result = service.getUserId(); - - assertThat(result).isEqualTo(UserProfileTestFactory.ID_STR); - } - } - - @Nested - class TestBuildSetBescheidSentCommands { - - @Mock - private AttachedItem bescheidItem; - @Mock - private Vorgang vorgang; - @Mock - private OzgCloudCommand vorgangBescheidenCommand; - @Mock - private OzgCloudCommand setBescheidSentStatusCommand; - - @BeforeEach - void inti() { - doReturn(vorgangBescheidenCommand).when(service).buildVorgangBescheidenCommand(any()); - doReturn(setBescheidSentStatusCommand).when(service).buildSetBescheidSentStatusCommand(any(), any()); - } - - @Test - void shouldCallBuildVorgangBescheidenCommand() { - buildSetBescheidSentCommands(); - - verify(service).buildVorgangBescheidenCommand(vorgang); - } - - @Test - void shouldCallBuildSetBescheidSentStatusCommand() { - buildSetBescheidSentCommands(); - - verify(service).buildSetBescheidSentStatusCommand(bescheidItem, UserProfileTestFactory.ID_STR); - } - - @Test - void shouldReturnResult() { - var result = buildSetBescheidSentCommands(); - - assertThat(result).containsExactly(vorgangBescheidenCommand, setBescheidSentStatusCommand); - } - - private List<OzgCloudCommand> buildSetBescheidSentCommands() { - return service.buildSetBescheidSentSubCommands(bescheidItem, vorgang, UserProfileTestFactory.ID_STR); - } - } - - @Nested - class TestBuildVorgangBescheidenCommand { - - 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); - } - - @Test - void shouldCallMapVorgangId() { - buildVorgangBescheidenCommand(); - - verify(commandMapper).toOzgCloudVorgangId(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldSetVorgangId() { - var result = buildVorgangBescheidenCommand(); - - assertThat(result.getVorgangId()).isEqualTo(VORGANG_ID); - } - - @Test - void shouldCallMapRelationId() { - buildVorgangBescheidenCommand(); - - verify(commandMapper).mapRelationId(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldSetRelationId() { - var result = buildVorgangBescheidenCommand(); - - assertThat(result.getRelationId()).isEqualTo(RELATION_ID); - } - - @Test - void shouldSetRelationVersion() { - var result = buildVorgangBescheidenCommand(); - - assertThat(result.getRelationVersion()).isEqualTo(VorgangTestFactory.VERSION); - } - - @Test - void shouldSetOrder() { - var result = buildVorgangBescheidenCommand(); - - assertThat(result.getOrder()).isEqualTo(BescheidService.VORGANG_BESCHEIDEN_ORDER); - } - - private OzgCloudCommand buildVorgangBescheidenCommand() { - return service.buildVorgangBescheidenCommand(VorgangTestFactory.create()); - } - } - - @Nested - class TestBuildSetBescheidSentStatusCommand { - - private static final StringBasedValue RELATION_ID = GenericId.from(VorgangTestFactory.ID.toString()); - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @BeforeEach - void init() { - when(commandMapper.mapRelationId(any())).thenReturn(RELATION_ID); - } - - @Test - void shouldCallMapRelationId() { - buildSetBescheidSentStatusCommand(); - - verify(commandMapper).mapRelationId(AttachedItemTestFactory.ID); - } - - @Test - void shouldSetRelationId() { - var result = buildSetBescheidSentStatusCommand(); - - assertThat(result.getRelationId()).isEqualTo(RELATION_ID); - } - - @Test - void shouldSetRelationVersion() { - var result = buildSetBescheidSentStatusCommand(); - - assertThat(result.getRelationVersion()).isEqualTo(AttachedItemTestFactory.VERSION); - } - - @Test - void shouldSetOrder() { - var result = buildSetBescheidSentStatusCommand(); - - assertThat(result.getOrder()).isEqualTo(AttachedItemService.PATCH_ATTACHED_ITEM); - } - - @Test - void shouldSetPropertyId() { - var result = buildSetBescheidSentStatusCommand(); - - assertThat(result.getBodyObject()).containsEntry(AttachedItem.PROPERTY_ID, AttachedItemTestFactory.ID); - } - - @Test - void shouldCallBuildBescheidSentStatusItem() { - buildSetBescheidSentStatusCommand(); - - verify(service).buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR); - } - - @Test - void shouldSetPropertyItem() { - var itemMap = Map.of("key", "value"); - doReturn(itemMap).when(service).buildBescheidSentStatusItem(any()); - - var result = buildSetBescheidSentStatusCommand(); - - assertThat(result.getBodyObject()).containsEntry(AttachedItem.PROPERTY_ITEM, itemMap); - } - - private OzgCloudCommand buildSetBescheidSentStatusCommand() { - return service.buildSetBescheidSentStatusCommand(BESCHEID_ITEM, UserProfileTestFactory.ID_STR); - } - } - - @Nested - class TestBuildBescheidSentStatusItem { - - @Test - void shouldSetStatus() { - var result = service.buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR); - - assertThat(result).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name()); - } - - @Test - void shouldCallBuildSentInfoMap() { - service.buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR); - - verify(service).buildSentInfoMap(UserProfileTestFactory.ID_STR); - } - - @Test - void shouldSetSentInfo() { - var sentInfoMap = Map.of("key", "value"); - doReturn(sentInfoMap).when(service).buildSentInfoMap(any()); - - var result = service.buildBescheidSentStatusItem(UserProfileTestFactory.ID_STR); - - assertThat(result).containsEntry(Bescheid.FIELD_SENT_INFO, sentInfoMap); - } - } - - @Nested - class TestBuildSentInfoMap { - - @Test - void shouldSetSentAt() { - var result = service.buildSentInfoMap(UserProfileTestFactory.ID_STR); - - assertThat(getSentAt(result)).isCloseTo(ZonedDateTime.now(), within(1, ChronoUnit.SECONDS)); - } - - @Test - void shouldSetSentBy() { - var result = service.buildSentInfoMap(UserProfileTestFactory.ID_STR); - - assertThat(result).containsEntry(SentInfo.FIELD_SENT_BY, UserProfileTestFactory.ID_STR); - } - - private ZonedDateTime getSentAt(Map<String, Object> sentInfoMap) { - return ZonedDateTime.parse((String) sentInfoMap.get(SentInfo.FIELD_SENT_AT), DateTimeFormatter.ISO_DATE_TIME); - } - } - - @Nested - class TestBuildSendPostfachNachrichtCommand { - - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - private static final Vorgang.PostfachAddress POSTFACH_ADDRESS = PostfachAddressTestFactory.create(); - private static final Vorgang.ServiceKonto SERVICE_KONTO = ServiceKontoTestFactory.createBuilder().clearPostfachAddresses() - .postfachAddress(POSTFACH_ADDRESS).build(); - private static final OzgCloudUserId OZG_CLOUD_ID = OzgCloudUserId.from(UserProfileTestFactory.ID_STR); - 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).buildSendNachrichtCommandBody(any(), 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).buildSendNachrichtCommandBody(BESCHEID_ITEM, 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(BescheidService.SEND_POSTFACH_NACHRICHT_ORDER); - } - - @Test - void shouldCallMapToOzgCloudUserId() { - buildSendPostfachNachrichtCommand(); - - verify(commandMapper).toOzgCloudUserId(UserProfileTestFactory.ID_STR); - } - - @Test - void shouldSetCreatedBy() { - var result = buildSendPostfachNachrichtCommand(); - - assertThat(result.getCreatedBy()).isEqualTo(OZG_CLOUD_ID); - } - - private OzgCloudCommand buildSendPostfachNachrichtCommand() { - return service.buildSendPostfachNachrichtCommand(BESCHEID_ITEM, SERVICE_KONTO, UserProfileTestFactory.ID_STR); - } - } - - @Nested - class TestBuildPostfachAddress { - - @Test - void shouldSetType() { - var result = buildPostfachAddress(); - - assertThat(result).containsEntry(Vorgang.PostfachAddress.FIELD_TYPE, PostfachAddressTestFactory.TYPE); - } - - @Test - void shouldSetVersion() { - var result = buildPostfachAddress(); - - assertThat(result).containsEntry(Vorgang.PostfachAddress.FIELD_VERSION, PostfachAddressTestFactory.VERSION); - } - - @Test - void shouldSetIdentifier() { - var result = buildPostfachAddress(); - - assertThat(result).extracting(Vorgang.PostfachAddress.FIELD_IDENTIFIER, MAP) - .containsEntry(BescheidService.FIELD_POSTFACH_ID, PostfachAddressTestFactory.POSTFACH_ID); - } - - @Test - void shouldSetServicekontoType() { - var result = buildPostfachAddress(); - - assertThat(result).containsEntry(Vorgang.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> SERVICE_KONTO_MAP = Map.of("key", "value"); - - @Mock - private AttachedItem bescheidItem; - - private Map<String, Object> buildSendNachrichtCommandBody() { - return service.buildSendNachrichtCommandBody(bescheidItem, SERVICE_KONTO_MAP); - } - - @Nested - class TestWithValuesFromBescheidItem { - - @BeforeEach - void init() { - doReturn(Optional.of(BescheidTestFactory.NACHRICHT_SUBJECT)).when(service).getNachrichtSubject(any()); - doReturn(Optional.of(BescheidTestFactory.NACHRICHT_TEXT)).when(service).getNachrichtText(any()); - doReturn(List.of(BescheidTestFactory.ATTACHMENT)).when(service).buildAttachments(any()); - } - - @Test - void shouldSetReplyOption() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(BescheidService.FIELD_REPLY_OPTION, BescheidService.REPLY_OPTION); - } - - @Test - void shouldCallGetNachrichtSubject() { - buildSendNachrichtCommandBody(); - - verify(service).getNachrichtSubject(bescheidItem); - } - - @Test - void shouldSetSubject() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); - } - - @Test - void shouldCallGetNachrichtText() { - buildSendNachrichtCommandBody(); - - verify(service).getNachrichtText(bescheidItem); - } - - @Test - void shouldSetMailBody() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, BescheidTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldCallBuildAttachments() { - buildSendNachrichtCommandBody(); - - verify(service).buildAttachments(bescheidItem); - } - - @Test - void shouldSetAttachments() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).extracting(BescheidService.FIELD_ATTACHMENTS, LIST).containsExactly(BescheidTestFactory.ATTACHMENT); - } - - @Test - void shouldSetPostfachAddress() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(Vorgang.ServiceKonto.FIELD_POSTFACH_ADDRESS, SERVICE_KONTO_MAP); - } - } - - @Nested - class TestWithDefaultValues { - - @BeforeEach - void init() { - doReturn(Optional.empty()).when(service).getNachrichtSubject(any()); - doReturn(Optional.empty()).when(service).getNachrichtText(any()); - doReturn(Collections.emptyList()).when(service).buildAttachments(any()); - } - - @Test - void shouldSetSubject() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(BescheidService.FIELD_SUBJECT, BescheidService.SUBJECT); - } - - @Test - void shouldSetMailBody() { - var result = buildSendNachrichtCommandBody(); - - assertThat(result).containsEntry(BescheidService.FIELD_MAIL_BODY, StringUtils.EMPTY); - } - } - } - - @Nested - class TestBuildAttachments { - - private static final String BESCHEID_FILE_ID = "bescheid-file-id"; - private static final String ATTACHMENT_FILE_ID = "attachment-file-id"; - - @Mock - private AttachedItem bescheidItem; - - @BeforeEach - void init() { - doReturn(FileId.from(BESCHEID_FILE_ID)).when(service).getBescheidFileId(any()); - doReturn(List.of(FileId.from(ATTACHMENT_FILE_ID))).when(service).getAttachments(any()); - } - - @Test - void shouldCallGetBescheidFileId() { - buildAttachments(); - - verify(service).getBescheidFileId(bescheidItem); - } - - @Test - void shouldCallGetAttachments() { - buildAttachments(); - - verify(service).getAttachments(bescheidItem); - } - - @Test - void shouldReturnAllAttachments() { - var result = buildAttachments(); - - assertThat(result).containsExactly(BESCHEID_FILE_ID, ATTACHMENT_FILE_ID); - } - - private List<String> buildAttachments() { - return service.buildAttachments(bescheidItem); - } - } - - @Nested - class TestSetAntragResult { - - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); - - @Test - void shouldCallGetBewilligt() { - service.setAntragBewilligung(bescheidItem); - - verify(service).getBewilligt(bescheidItem); - } - - @Test - void shouldCallClientAttributeService() { - doReturn(true).when(service).getBewilligt(any()); - - service.setAntragBewilligung(bescheidItem); - - verify(clientAttributeService).setAntragResult(CommandTestFactory.VORGANG_ID, true); - } - - @Test - void shouldCatchException() { - doThrow(new TechnicalException("error")).when(clientAttributeService).setAntragResult(anyString(), anyBoolean()); - - assertDoesNotThrow(() -> service.setAntragBewilligung(bescheidItem)); - } - } - - @Nested - class TestGetBewilligt { - - @Test - void shouldReturnBewilligt() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().itemEntry(Bescheid.FIELD_BEWILLIGT, true).build(); - - var result = service.getBewilligt(bescheidItem); - - assertThat(result).isTrue(); - } - - @Test - void shouldReturnDefault() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().build(); - - var result = service.getBewilligt(bescheidItem); - - assertThat(result).isFalse(); - } - } - - @Nested - class TestGetConfig { - - @Test - void shouldCallGetVersion() { - service.getConfig(); - - verify(buildProperties).getVersion(); - } - - @Test - void shouldSetBescheidManagerVersion() { - when(buildProperties.getVersion()).thenReturn(BescheidManagerConfigTestFactory.VERSION); - - var result = service.getConfig(); - - assertThat(result.getVersion()).isEqualTo(BescheidManagerConfigTestFactory.VERSION); - } - - @Test - void shouldCallGetJavaVersion() { - service.getConfig(); - - verify(service).getJavaVersion(); - } - - @Test - void shouldSetJavaVersion() { - when(service.getJavaVersion()).thenReturn(BescheidManagerConfigTestFactory.JAVA_VERSION); - - var result = service.getConfig(); - - assertThat(result.getJavaVersion()).isEqualTo(BescheidManagerConfigTestFactory.JAVA_VERSION); - } - - @Test - void shouldCallBuildFeatures() { - service.getConfig(); - - verify(service).buildFeatures(); - } - - @Test - void shouldSetFeatures() { - var features = BescheidManagerConfig.Features.builder().build(); - when(service.buildFeatures()).thenReturn(features); - - var result = service.getConfig(); - - assertThat(result.getFeatures()).isSameAs(features); - } - - } - - @Nested - class TestBuildFeatures { - - @Test - void shouldSetCannotCreateBescheidDocument() { - ReflectionTestUtils.setField(service, "remoteService", Optional.empty()); - - var result = service.buildFeatures(); - - assertThat(result.isCanCreateBescheidDocument()).isFalse(); - } - - @Test - void shouldSetCanCreateBescheidDocument() { - var result = service.buildFeatures(); - - assertThat(result.isCanCreateBescheidDocument()).isTrue(); - } - - } - - @DisplayName("Get bescheid") - @Nested - class TestGetBescheid { - - private final AttachedItem attachedItem = AttachedItemTestFactory.create(); - - @BeforeEach - void mock() { - when(attachedItemService.getItem(any())).thenReturn(attachedItem); - when(mapper.mapFromAttachedItem(any())).thenReturn(BescheidTestFactory.create()); - } - - @Test - void shouldCallVorgangAttachedItemService() { - service.getBescheid(AttachedItemTestFactory.ID); - - verify(attachedItemService).getItem(AttachedItemTestFactory.ID); - } - - @Test - void shouldCallMapper() { - service.getBescheid(AttachedItemTestFactory.ID); - - verify(mapper).mapFromAttachedItem(attachedItem); - } - - @Test - void shouldReturnValue() { - var bescheid = service.getBescheid(AttachedItemTestFactory.ID); - - assertThat(bescheid).usingRecursiveComparison().isEqualTo(BescheidTestFactory.create()); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java deleted file mode 100644 index b04cada3828d9fae6a85c5217c97df420972f353..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestApplication.java +++ /dev/null @@ -1,25 +0,0 @@ -package de.ozgcloud.bescheid; - -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.boot.info.BuildProperties; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.cloud.endpoint.RefreshEndpoint; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.security.authentication.AuthenticationTrustResolver; -import org.springframework.security.authentication.AuthenticationTrustResolverImpl; - -@SpringBootApplication -@ComponentScan({ "de.ozgcloud.*" }) -public class BescheidTestApplication { - - @MockBean - private BuildProperties buildProperties; - @MockBean - private RefreshEndpoint refreshEndpoint; - - @Bean - AuthenticationTrustResolver trustResolver() { - return new AuthenticationTrustResolverImpl(); - } -} 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 7b90a2215cbddb56900ea293d7bbfd5cb9f44363..ecfb19190b19c471a553c02f09b6d7abbd6ae7b8 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/BescheidTestFactory.java @@ -7,13 +7,16 @@ import java.util.UUID; import com.thedeanda.lorem.LoremIpsum; -import de.ozgcloud.bescheid.Bescheid.SendBy; -import de.ozgcloud.bescheid.Bescheid.Status; -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; import de.ozgcloud.common.attached_item.AttachedItemTestFactory; import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.document.DocumentTestFactory; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.Bescheid.SendBy; +import de.ozgcloud.document.bescheid.Bescheid.Status; +import de.ozgcloud.document.bescheid.BescheidId; +import de.ozgcloud.document.bescheid.SentInfo; +import de.ozgcloud.document.bescheid.common.user.UserProfileTestFactory; public class BescheidTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java index 8361e82f8c1459da781d70b4603f5e673ec77c81..9f37996adcc11a39d9710cd5b14c6ccdffc75d16 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/SentInfoTestFactory.java @@ -26,7 +26,8 @@ package de.ozgcloud.bescheid; import java.time.ZonedDateTime; import java.util.Map; -import de.ozgcloud.bescheid.SentInfo.SentInfoBuilder; +import de.ozgcloud.document.bescheid.SentInfo; +import de.ozgcloud.document.bescheid.SentInfo.SentInfoBuilder; public class SentInfoTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/administration/AdministrationServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/administration/AdministrationServiceTest.java deleted file mode 100644 index 13e64879f85860b95b1e2a71154e56dced290343..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/administration/AdministrationServiceTest.java +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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.bescheid.administration; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import java.util.Optional; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.cloud.endpoint.RefreshEndpoint; - -class AdministrationServiceTest { - - @InjectMocks - private AdministrationService service; - - @Mock - private AdministrationProperties properties; - @Mock - private RefreshEndpoint refreshEndpoint; - - @Nested - class GetNachrichtSignature { - - @Test - void shouldCallGetSignature() { - service.getNachrichtSignature(); - - verify(properties).getSignatur(); - } - - @Test - void shouldReturnSignature() { - var signature = "signature"; - when(properties.getSignatur()).thenReturn(Optional.of(signature)); - - var result = service.getNachrichtSignature(); - - assertThat(result).contains(signature); - } - } - - @Nested - class TestRefreshConfig { - - @Test - void shouldCallRefresh() { - service.refreshConfig(); - - verify(refreshEndpoint).refresh(); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteServiceTest.java deleted file mode 100644 index cfa18131b58c3ccc123ba07d4848625fcbddfdfb..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeRemoteServiceTest.java +++ /dev/null @@ -1,161 +0,0 @@ -/* - * 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.bescheid.attributes; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.vorgang.grpc.clientAttribute.ClientAttributeServiceGrpc.ClientAttributeServiceBlockingStub; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcAccessPermission; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcClientAttribute; -import de.ozgcloud.vorgang.grpc.clientAttribute.GrpcSetClientAttributeRequest; - -class ClientAttributeRemoteServiceTest { - - private static final String VORGANG_ID = "vorgangId"; - private static final String ATTRIBUTE_NAME = "attributeName"; - - @Spy - @InjectMocks - private ClientAttributeRemoteService service; - - @Mock - private ClientAttributeServiceBlockingStub serviceBlockingStub; - @Mock - private BescheidCallContextAttachingInterceptor bescheidCallContextInterceptor; - - @Nested - class TestSetBooleanReadOnlyClientAttribute { - - @Captor - private ArgumentCaptor<BescheidCallContextAttachingInterceptor> interceptorCaptor; - - @BeforeEach - void setUp() { - when(serviceBlockingStub.withInterceptors(any())).thenReturn(serviceBlockingStub); - } - - @Test - void shouldSetInterceptors() { - service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true); - - verify(serviceBlockingStub).withInterceptors(interceptorCaptor.capture()); - assertThat(interceptorCaptor.getValue()).isEqualTo(bescheidCallContextInterceptor); - } - - @Test - void shouldCallBuildRequest() { - service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true); - - verify(service).buildRequest(VORGANG_ID, ATTRIBUTE_NAME, true); - } - - @Test - void shouldCallSetMethod() { - var request = GrpcSetClientAttributeRequest.newBuilder().build(); - doReturn(request).when(service).buildRequest(any(), any(), anyBoolean()); - - service.setBooleanReadOnlyClientAttribute(VORGANG_ID, ATTRIBUTE_NAME, true); - - verify(serviceBlockingStub).set(request); - - } - } - - @Nested - class TestBuildRequest { - - @Mock - private GrpcClientAttribute clientAttribute; - - @Test - void shouldSetVorgangId() { - var result = buildRequest(); - - assertThat(result.getVorgangId()).isEqualTo(VORGANG_ID); - } - - @Test - void shouldCallBuildClientAttribute() { - buildRequest(); - - verify(service).buildClientAttribute(ATTRIBUTE_NAME, true); - } - - @Test - void shouldSetClientAttribute() { - doReturn(clientAttribute).when(service).buildClientAttribute(any(), anyBoolean()); - - var result = buildRequest(); - - assertThat(result.getAttribute()).isEqualTo(clientAttribute); - } - - private GrpcSetClientAttributeRequest buildRequest() { - return service.buildRequest(VORGANG_ID, ATTRIBUTE_NAME, true); - } - } - - @Nested - class TestBuildClientAttribute { - - @Test - void shouldSetClientName() { - var result = service.buildClientAttribute(ATTRIBUTE_NAME, true); - - assertThat(result.getClientName()).isEqualTo(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - } - - @Test - void shouldSetAccess() { - var result = service.buildClientAttribute(ATTRIBUTE_NAME, true); - - assertThat(result.getAccess()).isEqualTo(GrpcAccessPermission.READ_ONLY); - } - - @Test - void shouldSetAttributeName() { - var result = service.buildClientAttribute(ATTRIBUTE_NAME, true); - - assertThat(result.getAttributeName()).isEqualTo(ATTRIBUTE_NAME); - } - - @Test - void shouldSetValue() { - var result = service.buildClientAttribute(ATTRIBUTE_NAME, true); - - assertThat(result.getValue().getBoolValue()).isTrue(); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeServiceTest.java deleted file mode 100644 index 03d31e54d9df4e505ac172fff010acf8f94f996a..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/attributes/ClientAttributeServiceTest.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.bescheid.attributes; - -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; - -class ClientAttributeServiceTest { - - @InjectMocks - private ClientAttributeService service; - - @Mock - private ClientAttributeRemoteService remoteService; - - @Test - void shouldCallRemoteService() { - var vorgangId = "vorgangId"; - - service.setAntragResult(vorgangId, true); - - verify(remoteService).setBooleanReadOnlyClientAttribute(vorgangId, ClientAttributeService.ATTRIBUTE_NAME_ANTRAG_BEWILLIGT, true); - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProviderTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProviderTest.java deleted file mode 100644 index ec9d3dee4685bb202d88fe617c8235ad2270b717..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/BescheidManagerCallContextProviderTest.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * 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.bescheid.common.callcontext; - -import static org.assertj.core.api.Assertions.*; -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; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.apilib.user.OzgCloudUserId; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; - -class BescheidManagerCallContextProviderTest { - - @Spy - @InjectMocks - private BescheidManagerCallContextProvider provider; - - @Mock - private CurrentUserService currentUserService; - @Mock - private CallContextUser contextUser; - @Mock - private OzgCloudUserId userId; - - @Nested - class TestProvideContext { - - @BeforeEach - void init() { - doReturn(Optional.of(userId)).when(provider).getUserId(); - } - - @Test - void shouldCallGetUserId() { - provider.provideContext(); - - verify(provider).getUserId(); - } - - @Test - void shouldSetUserId() { - var result = provider.provideContext(); - - assertThat(result.getUserId()).isSameAs(userId); - } - - @Test - void shouldSetClientName() { - var result = provider.provideContext(); - - assertThat(result.getClientName()).isEqualTo(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - } - } - - @Nested - class TestGetUserId { - - private static final String USER_ID = "userId"; - - @BeforeEach - void init() { - when(currentUserService.getUser()).thenReturn(contextUser); - } - - @Test - void shouldReturnUserId() { - when(contextUser.getUserId()).thenReturn(Optional.of(USER_ID)); - - var result = provider.getUserId(); - - assertThat(result).isPresent().get().hasToString(USER_ID); - } - - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserServiceTest.java deleted file mode 100644 index 656b191e256f1aef75cd7def1971953b260327aa..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/callcontext/CurrentUserServiceTest.java +++ /dev/null @@ -1,33 +0,0 @@ -package de.ozgcloud.bescheid.common.callcontext; - -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 org.mockito.InjectMocks; -import org.mockito.Mock; -import org.springframework.security.authentication.AuthenticationTrustResolver; - -import de.ozgcloud.command.CommandTestFactory; - -class CurrentUserServiceTest { - - @InjectMocks - private CurrentUserService service; - @Mock - private AuthenticationTrustResolver trustResolver; - - @DisplayName("Create user") - @Nested - class TestCreateUser { - - // FIXME read client name from command - @Test - void shouldContainsClientName() { - var user = service.createUser(CommandTestFactory.create()); - - assertThat(user.getClientName()).isEqualTo("Alfa"); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java deleted file mode 100644 index eeca8c0c770782be6364a6f9ae130e440a1168d7..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/common/freemarker/TemplateHandlerITCase.java +++ /dev/null @@ -1,74 +0,0 @@ -package de.ozgcloud.bescheid.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 org.springframework.boot.test.mock.mockito.MockBean; - -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.BescheidService; -import de.ozgcloud.common.test.ITCase; - -@ITCase -class TemplateHandlerITCase { - - private static final String BESCHEID_TEMPLATE = "dummy.template.txt.ftlh"; - - @Autowired - private TemplateHandler handler; - @MockBean - private OzgCloudCommandService commandService; - @MockBean - private CommandMapper commandMapper; - - @DisplayName("Get raw template") - @Nested - class TestGetRawTemplate { - - @Test - void shouldReturnTemplateAsString() { - var content = handler.getRawTemplate(BESCHEID_TEMPLATE); - - assertThat(content) - .contains("Sehr geehrte/r Antragsteller/in") - .contains("im folgenden wird evtl was ersetzt") - .contains("valueToReplace") - .contains("Mit freundlichen Grüßen"); - } - } - - @DisplayName("Fill template") - @Nested - class TestFillTemplate { - - @Test - void shouldReturnFilledTemplate() { - var signatur = "ganz andere Signatur"; - var content = handler.fillTemplate(BescheidService.DEFAULT_NACHRICHT_TEMPLATE_FILE, - Map.of(BescheidService.KEY_TEMPLATE_SIGNATURE, signatur)); - - assertThat(content) - .contains("Sehr geehrte/r Antragsteller/in") - .contains("im Folgenden erhalten Sie Ihren Bescheid.") - .contains(signatur); - } - - @Test - void shouldReturnWithDefaultValue() { - var content = handler.fillTemplate(BescheidService.DEFAULT_NACHRICHT_TEMPLATE_FILE, Collections.emptyMap()); - - assertThat(content) - .contains("Sehr geehrte/r Antragsteller/in") - .contains("im Folgenden erhalten Sie Ihren Bescheid.") - .contains("Mit freundlichen Grüßen") - .contains("Ihre Verwaltung"); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java deleted file mode 100644 index 764fc28f4882f0f160b07deef03f080c4c8b975d..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceITCase.java +++ /dev/null @@ -1,79 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import static org.assertj.core.api.Assertions.*; - -import java.io.File; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.ActiveProfiles; - -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.bescheid.BescheidRequestTestFactory; -import de.ozgcloud.bescheid.BescheidTestApplication; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.common.binaryfile.TempFileUtils; -import de.ozgcloud.common.test.ITCase; -import de.ozgcloud.common.test.TestUtils; - -@SpringBootTest(classes = BescheidTestApplication.class) -@ITCase -@ActiveProfiles({ "itcase", "local" }) -class SmartDocumentsBescheidRemoteServiceITCase { - - @Autowired - private SmartDocumentsBescheidRemoteService remoteService; - @MockBean - private OzgCloudCommandService ozgCloudCommandService; - @MockBean - private CommandMapper commandMapper; - - @Disabled("This test request SmartDocuments service") - @Test - void createBescheid() { - var bescheid = remoteService.create(BescheidRequestTestFactory.create(), VorgangTestFactory.create()); - - System.out.println(bescheid.getBescheidFileName()); - System.out.println(bescheid.getBescheidFile().getAbsolutePath()); - assertThat(bescheid.getBescheidFileName()).isNotEmpty(); - } - - @Nested - class TestGetNachrichtenText { - - private static final String NACHRICHTEN_TEXT = "Nachrichtentext"; - private static final String FIELD_TEMPLATE_TEXT = "Nachrichten Field Text"; - - @Test - void shouldGetNachrichtenText() { - var nachrichtenText = remoteService.extractTextFromXmlFile(loadFile("SD_answer.xml")); - - assertThat(nachrichtenText).contains(NACHRICHTEN_TEXT); - } - - @Test - void shouldGetFieldTemplateText() { - var fieldTemplateText = remoteService.extractTextFromXmlFile(loadFile("SD_answer_field_template.xml")); - - assertThat(fieldTemplateText).contains(FIELD_TEMPLATE_TEXT); - } - - @Test - void shouldExpectMissingTextNode() { - File xmlFileWithoutText = TempFileUtils.writeTmpFile(TestUtils.loadFile("SD_answer_without_text.xml")); - - var text = remoteService.extractTextFromXmlFile(xmlFileWithoutText); - - assertThat(text).isEmpty(); - } - - private File loadFile(String fileName) { - return TempFileUtils.writeTmpFile(TestUtils.loadFile(fileName)); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java deleted file mode 100644 index 86bc7f747b0e95edb9f633b95ba93879124f71ca..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsBescheidRemoteServiceTest.java +++ /dev/null @@ -1,248 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.io.File; -import java.util.Optional; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.w3c.dom.Document; -import org.w3c.dom.Text; - -import de.ozgcloud.bescheid.BescheidRequestTestFactory; -import de.ozgcloud.bescheid.BescheidResponseTestFactory; -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsRequest.CustomerData.UserData; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import lombok.SneakyThrows; - -class SmartDocumentsBescheidRemoteServiceTest { - - @Spy - @InjectMocks - private SmartDocumentsBescheidRemoteService service; - - @Mock - private SmartDocumentsProperties properties; - @Mock - private Text xmlText; - @Mock - private File xmlFile; - - @Nested - class TestBuildBescheid { - - @Test - void shouldFillBescheid() { - var bescheid = service.buildBescheid(BescheidRequestTestFactory.create(), SmartDocumentsResponseTestFactory.create()); - - assertThat(bescheid).usingRecursiveComparison().ignoringFields("serviceKonto", "nachrichtSubject", "bescheidFileId", "attachments") - .isEqualTo(BescheidResponseTestFactory.createBuilder().nachrichtText(Optional.empty()).build()); - } - } - - @Nested - class TestCreateRequest { - - @Test - void shouldFillUserData() { - var request = service.createRequest(BescheidRequestTestFactory.create(), VorgangTestFactory.create()); - - assertThat(request.getCustomerData().getUserData()).isNotNull() - .extracting(UserData::getEmail).isEqualTo(UserProfileTestFactory.EMAIL); - } - } - - @Nested - class TestGetNachrichtText { - - @Test - void shouldCallGetXMLFile() { - var response = SmartDocumentsResponseTestFactory.create(); - - service.getNachrichtText(response); - - verify(service).getXMLFile(response); - } - - @Test - void shouldCallExtractText() { - doReturn(Optional.of(xmlFile)).when(service).getXMLFile(any()); - - service.getNachrichtText(SmartDocumentsResponseTestFactory.create()); - - verify(service).extractTextFromXmlFile(xmlFile); - } - } - - @Nested - class TestExtractTextFromXmlFileSuccessfully { - - private static final String NACHRICHT_TEXT = "NachrichtText"; - - @Mock - private Document document; - - @SneakyThrows - @BeforeEach - void init() { - doReturn(Optional.of(document)).when(service).parseXml(any()); - } - - @SneakyThrows - @Test - void shouldCallParseXml() { - service.extractTextFromXmlFile(xmlFile); - - verify(service).parseXml(xmlFile); - } - - @Test - void shouldCallGetNachrichtenText() { - doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any()); - - service.extractTextFromXmlFile(xmlFile); - - verify(service).getNachrichtenText(document); - } - - @Test - void shouldReturnNachrichtenText() { - doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any()); - when(xmlText.getTextContent()).thenReturn(NACHRICHT_TEXT); - - var text = service.extractTextFromXmlFile(xmlFile); - - assertThat(text).contains(NACHRICHT_TEXT); - } - - @Test - void shouldNotCallGetFieldTemplateText() { - doReturn(Optional.of(xmlText)).when(service).getNachrichtenText(any()); - - service.extractTextFromXmlFile(xmlFile); - - verify(service, never()).getFieldTemplateText(document); - } - - @Test - void shouldCallGetFieldTemplateText() { - doReturn(Optional.empty()).when(service).getNachrichtenText(any()); - doReturn(Optional.of(xmlText)).when(service).getFieldTemplateText(any()); - - service.extractTextFromXmlFile(xmlFile); - - verify(service).getFieldTemplateText(document); - } - - @Test - void shouldReturnFieldTemplateText() { - doReturn(Optional.empty()).when(service).getNachrichtenText(any()); - doReturn(Optional.of(xmlText)).when(service).getFieldTemplateText(any()); - when(xmlText.getTextContent()).thenReturn(NACHRICHT_TEXT); - - var text = service.extractTextFromXmlFile(xmlFile); - - assertThat(text).contains(NACHRICHT_TEXT); - } - } - - @Nested - class TestExtractTextFormXmlFileFails { - - @Mock - private Document document; - - @SneakyThrows - @Test - void shouldHandleMissingXmlDocument() { - doReturn(Optional.empty()).when(service).parseXml(any()); - - var text = service.extractTextFromXmlFile(xmlFile); - - assertThat(text).isEmpty(); - } - - @Test - @SneakyThrows - void shouldExpectMissingTextNode() { - doReturn(Optional.of(document)).when(service).parseXml(any()); - doReturn(Optional.empty()).when(service).getFieldTemplateText(any()); - - var text = service.extractTextFromXmlFile(xmlFile); - - assertThat(text).isEmpty(); - } - } - - @Nested - class TestGetNachrichtenText { - - @Mock - private Text text; - @Mock - private Document document; - - @BeforeEach - void init() { - doReturn(Optional.of(text)).when(service).evaluateXPath(any(), any()); - } - - @Test - void shouldCallEvaluatePath() { - getNachrichtenText(); - - verify(service).evaluateXPath(document, SmartDocumentsBescheidRemoteService.NACHRICHTEN_TEXT_EXPRESSION); - } - - @Test - void shouldReturnText() { - var result = getNachrichtenText(); - - assertThat(result).contains(text); - } - - private Optional<Text> getNachrichtenText() { - return service.getNachrichtenText(document); - } - } - - @Nested - class TestGetFieldTemplateText { - - @Mock - private Text text; - @Mock - private Document document; - - @BeforeEach - void init() { - doReturn(Optional.of(text)).when(service).evaluateXPath(any(), any()); - } - - @Test - void shouldCallEvaluatePath() { - getFieldTemplateText(); - - verify(service).evaluateXPath(document, SmartDocumentsBescheidRemoteService.FIELD_TEMPLATE_EXPRESSION); - } - - @Test - void shouldReturnText() { - var result = getFieldTemplateText(); - - assertThat(result).contains(text); - } - - private Optional<Text> getFieldTemplateText() { - return service.getFieldTemplateText(document); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java deleted file mode 100644 index 32a0b3ac98768e565da86a25437605fa7c37cd60..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/smartdocuments/SmartDocumentsResponseTestFactory.java +++ /dev/null @@ -1,28 +0,0 @@ -package de.ozgcloud.bescheid.smartdocuments; - -import java.util.List; - -import de.ozgcloud.bescheid.BescheidResponseTestFactory; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentDocument; -import de.ozgcloud.bescheid.smartdocuments.SmartDocumentsBescheidRemoteService.SmartDocumentsResponse.SmartDocumentFile; - -public class SmartDocumentsResponseTestFactory { - - static final String OUTPUT_FORMAT = "PDF"; - - static SmartDocumentsResponse create() { - return createBuilder().build(); - } - - static SmartDocumentsResponse.SmartDocumentsResponseBuilder createBuilder() { - return SmartDocumentsResponse.builder() - .file(List.of(SmartDocumentFile.builder() - .filename(BescheidResponseTestFactory.BESCHEID_FILE_NAME) - .outputFormat(OUTPUT_FORMAT) - .document(SmartDocumentDocument.builder() - .data(BescheidResponseTestFactory.BESCHEID_FILE) - .build()) - .build())); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapperTest.java deleted file mode 100644 index 6f64a48933ed0351295ef3415111f149ca3f6c7d..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/BescheidVorgangMapperTest.java +++ /dev/null @@ -1,38 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; - -class BescheidVorgangMapperTest { - - @InjectMocks - private BescheidVorgangMapperImpl mapper; - - @Nested - class TestMapVorgang { - - @Test - void shouldMapEingang() { - var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create()); - - assertThat(result.getEingang()).isNotNull(); - } - - @Test - void shouldMapVorgangId() { - var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create()); - - assertThat(result.getId()).isEqualTo(VorgangTestFactory.ID); - } - - @Test - void shouldMapVersion() { - var result = mapper.mapVorgang(GrpcVorgangWithEingangTestFactory.create()); - - assertThat(result.getVersion()).isEqualTo(VorgangTestFactory.VERSION); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializerTest.java deleted file mode 100644 index d647a90200e8c47fd8a08465fa5fa2048ad35de5..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/FormDataEntrySerializerTest.java +++ /dev/null @@ -1,72 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import static org.assertj.core.api.Assertions.*; - -import org.junit.jupiter.api.Test; - -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -import de.ozgcloud.bescheid.vorgang.FormDataEntry.FormField; -import de.ozgcloud.bescheid.vorgang.FormDataEntry.SubForm; -import de.ozgcloud.bescheid.vorgang.Vorgang.Eingang; -import lombok.SneakyThrows; - -class FormDataEntrySerializerTest { - - private ObjectMapper mapper = new ObjectMapper(); - - @Test - void schouldSerializeFormDataWithSingleField() throws JsonProcessingException { - var eingang = Eingang.builder() - .formData(FormField.builder().name("name").value("Thea").build()) - .build(); - - var json = mapper.writeValueAsString(eingang); - - assertThat(json).contains("\"formData\":{\"name\":\"Thea\"}"); - } - - @Test - @SneakyThrows - void sohludSerializeFormDataWithSubForm() { - var eingang = Eingang.builder() - .formData(SubForm.builder().name("address") - .entry(FormField.builder().name("name").value("Thea").build()) - .build()) - .build(); - - var json = mapper.writeValueAsString(eingang); - - assertThat(json).contains("\"formData\":{\"address\":{\"name\":\"Thea\"}}"); - } - - @Test - @SneakyThrows - void shouldSerializeFormDataWithSubSubForm() { - var eingang = Eingang.builder() - .formData(SubForm.builder().name("address") - .entry(SubForm.builder().name("person") - .entry(FormField.builder().name("name").value("Thea").build()) - .build()) - .build()) - .build(); - - var json = mapper.writeValueAsString(eingang); - - assertThat(json).contains("\"formData\":{\"address\":{\"person\":{\"name\":\"Thea\"}}}"); - } - - @Test - @SneakyThrows - void shouldSerializeFormWithTwoFields() { - var eingang = Eingang.builder() - .formData(FormField.builder().name("firstname").value("Thea").build()) - .formData(FormField.builder().name("lastname").value("Test").build()) - .build(); - - var json = mapper.writeValueAsString(eingang); - - assertThat(json).contains("\"formData\":{\"firstname\":\"Thea\",\"lastname\":\"Test\"}"); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java deleted file mode 100644 index 8c9dfc0daf02960be0d45ecb6ddd9a515552353c..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcEingangTestFactory.java +++ /dev/null @@ -1,14 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import de.ozgcloud.vorgang.vorgang.GrpcEingang; - -public class GrpcEingangTestFactory { - - static GrpcEingang create() { - return createBuilder().build(); - } - - static GrpcEingang.Builder createBuilder() { - return GrpcEingang.newBuilder(); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java deleted file mode 100644 index 63c8a880f63c6d9ceffc9f2a8a5028cce949ed34..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/GrpcVorgangWithEingangTestFactory.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import static de.ozgcloud.bescheid.vorgang.VorgangTestFactory.*; - -import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangResponse; -import de.ozgcloud.vorgang.vorgang.GrpcVorgangWithEingang; - -class GrpcVorgangWithEingangTestFactory { - - static GrpcVorgangWithEingang create() { - return createBuilder().build(); - } - - static GrpcVorgangWithEingang.Builder createBuilder() { - return GrpcVorgangWithEingang.newBuilder() - .setId(ID.toString()) - .setVersion(VERSION) - .setEingang(GrpcEingangTestFactory.create()); - } - - static GrpcFindVorgangWithEingangResponse createResponse() { - return GrpcFindVorgangWithEingangResponse.newBuilder() - .setVorgangWithEingang(create()) - .build(); - } - -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java index 5d01a8b7573c16643a61e602ff06bc94aa0cd155..8543f3cccb05ecdd58bbaf72323f09768ea8487f 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/PostfachAddressTestFactory.java @@ -26,7 +26,8 @@ package de.ozgcloud.bescheid.vorgang; import java.util.Map; import java.util.UUID; -import de.ozgcloud.bescheid.vorgang.Vorgang.PostfachAddress.PostfachAddressBuilder; +import de.ozgcloud.document.bescheid.vorgang.Vorgang; +import de.ozgcloud.document.bescheid.vorgang.Vorgang.PostfachAddress.PostfachAddressBuilder; public class PostfachAddressTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java index 2a30ada99a63098c255b97822a151a02558fd950..6cbdc9b13cf227ade4565d8445c6644c817335a4 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/ServiceKontoTestFactory.java @@ -1,6 +1,6 @@ package de.ozgcloud.bescheid.vorgang; -import de.ozgcloud.bescheid.vorgang.Vorgang.ServiceKonto; +import de.ozgcloud.document.bescheid.vorgang.Vorgang.ServiceKonto; public class ServiceKontoTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java deleted file mode 100644 index 823dc761a8c5efcab9930fafde166d518d79b9ef..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangRemoteServiceTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.vorgang.vorgang.GrpcFindVorgangWithEingangRequest; -import de.ozgcloud.vorgang.vorgang.VorgangServiceGrpc.VorgangServiceBlockingStub; - -class VorgangRemoteServiceTest { - - @Spy - @InjectMocks - private VorgangRemoteService service; - - @Mock - private VorgangServiceBlockingStub serviceStub; - @Mock - private BescheidVorgangMapper mapper; - - @Nested - class TestGetById { - @Captor - private ArgumentCaptor<GrpcFindVorgangWithEingangRequest> requestCaptor; - - @BeforeEach - void prepareGrpc() { - when(serviceStub.withInterceptors(any())).thenReturn(serviceStub); - when(serviceStub.findVorgangWithEingang(any())).thenReturn(GrpcVorgangWithEingangTestFactory.createResponse()); - - } - - @BeforeEach - void init() { - when(mapper.mapVorgang(any())).thenReturn(VorgangTestFactory.create()); - } - - @Test - void shouldCallStubWithId() { - service.getById(VorgangTestFactory.ID); - - verify(serviceStub).findVorgangWithEingang(requestCaptor.capture()); - assertThat(requestCaptor.getValue()).extracting(GrpcFindVorgangWithEingangRequest::getId).isEqualTo(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldCallMapper() { - service.getById(VorgangTestFactory.ID); - - verify(mapper).mapVorgang(any()); - } - - @Test - void shouldReturnVorgang() { - var vorgang = service.getById(VorgangTestFactory.ID); - - assertThat(vorgang).usingRecursiveComparison().isEqualTo(VorgangTestFactory.create()); - } - - } - -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java deleted file mode 100644 index cc93692c7831628dd87ada5bf0cf21f2250b5bb4..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangServiceTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package de.ozgcloud.bescheid.vorgang; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -class VorgangServiceTest { - - @Spy - @InjectMocks - private VorgangService service; - - @Mock - private VorgangRemoteService remoteService; - - @Nested - class TestGetById { - - private final Vorgang vorgang = VorgangTestFactory.create(); - - @BeforeEach - void init() { - when(remoteService.getById(any())).thenReturn(vorgang); - } - - @Test - void shouldCallRemoteService() { - service.getById(VorgangTestFactory.ID); - - verify(remoteService).getById(VorgangTestFactory.ID); - } - - @Test - void shouldReturnResult() { - var result = service.getById(VorgangTestFactory.ID); - - assertThat(result).isEqualTo(vorgang); - } - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java index 000bc28d0aea983e85485a76638fbb0e33727ba2..bcef17e937da2ba1ef8ce848448a2658ff549d8a 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/bescheid/vorgang/VorgangTestFactory.java @@ -2,6 +2,9 @@ package de.ozgcloud.bescheid.vorgang; import java.util.UUID; +import de.ozgcloud.document.bescheid.vorgang.Vorgang; +import de.ozgcloud.document.bescheid.vorgang.VorgangId; + public class VorgangTestFactory { public static final String ID_STR = UUID.randomUUID().toString(); diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java deleted file mode 100644 index 25998524cc118900d7f705f2ff8c7268e2007b7b..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemMapperTest.java +++ /dev/null @@ -1,108 +0,0 @@ -/* - * 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.common.attached_item; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Map; - -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.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.bescheid.SentInfoMapper; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.document.DocumentService; -import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper; - -class AttachedItemMapperTest { - - @Spy - @InjectMocks - private AttachedItemMapper mapper = Mappers.getMapper(AttachedItemMapper.class); - - @Mock - private GrpcObjectMapper grpcObjectMapper; - @Mock - private SentInfoMapper sentInfoMapper; - - @Nested - class TestMapFromVorgangAttachedItem { - - @BeforeEach - void init() { - when(grpcObjectMapper.mapFromGrpc(any())).thenReturn(AttachedItemTestFactory.createDocumentItem()); - } - - @Test - void shouldMapFromVorgangAttachedItem() { - var grpcVorgangAttachedItem = GrpcVorgangAttachedItemTestFactory.createBuilder().setItemName(DocumentService.DOCUMENT_ITEM_NAME).build(); - - var result = mapper.mapFromVorgangAttachedItem(grpcVorgangAttachedItem); - - assertThat(result).usingRecursiveComparison().isEqualTo(AttachedItemTestFactory.createDocument()); - } - } - - @Nested - class TestAsMap { - - @Test - void shouldSetVorgangId() { - var result = mapper.toMap(AttachedItemTestFactory.createBescheid()); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_VORGANG_ID, CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetClient() { - var result = mapper.toMap(AttachedItemTestFactory.createBescheid()); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_CLIENT, AttachedItemTestFactory.CLIENT); - } - - @Test - void shouldSetItemName() { - var result = mapper.toMap(AttachedItemTestFactory.createBescheid()); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_ITEM_NAME, AttachedItemService.BESCHEID_ITEM_NAME); - } - - @Test - void shouldSetItem() { - var item = Map.<String, Object>of("key", "value"); - var attachedItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().item(item).build(); - - var result = mapper.toMap(attachedItem); - - assertThat(result).containsEntry(AttachedItem.PROPERTY_ITEM, item); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java deleted file mode 100644 index aaa9b15a805e2c989b97f0d77577c2499ec18a56..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemServiceTest.java +++ /dev/null @@ -1,928 +0,0 @@ -/* - * 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.common.attached_item; - -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Optional; - -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.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.apilib.common.command.OzgCloudCommand; -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.apilib.common.datatypes.GenericId; -import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; -import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.BescheidMapper; -import de.ozgcloud.bescheid.BescheidTestFactory; -import de.ozgcloud.bescheid.vorgang.VorgangId; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.errorhandling.TechnicalException; -import de.ozgcloud.document.Document; -import de.ozgcloud.document.DocumentTestFactory; -import io.grpc.StatusRuntimeException; - -class AttachedItemServiceTest { - - @Spy - @InjectMocks - private AttachedItemService service; - @Mock - private AttachedItemMapper mapper; - @Mock - private VorgangAttachedItemRemoteService remoteService; - - @Mock - private OzgCloudCommandService commandService; - @Mock - private CommandMapper commandMapper; - @Mock - private BescheidMapper bescheidMapper; - - @Nested - class TestFindBescheidItem { - - @Test - void shouldCallGetBescheidDraft() { - service.findBescheidItem(VorgangTestFactory.ID); - - verify(remoteService).findBescheidDraft(VorgangTestFactory.ID); - } - - @Test - void shouldReturnBescheidItem() { - var expected = AttachedItemTestFactory.createBescheid(); - when(remoteService.findBescheidDraft(any(VorgangId.class))).thenReturn(Optional.of(expected)); - - var actual = service.findBescheidItem(VorgangTestFactory.ID); - - assertThat(actual).contains(expected); - } - } - - @Nested - class TestCreateBescheidDraft { - - private static final String CREATED_ATTACHED_ITEM_ID = "attached-item-id"; - private static final Bescheid BESCHEID = BescheidTestFactory.create(); - - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); - - @Mock - private AttachedItem updatedBescheidItem; - - @Test - void shouldCallGetBescheidDraft() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createAttachedItem(any()); - - service.createBescheidDraft(BESCHEID); - - verify(remoteService).findBescheidDraft(VorgangTestFactory.ID); - } - - @Test - void shouldCallMergeBescheidDrafts() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).overrideAttachedItem(any()); - when(remoteService.findBescheidDraft(any(VorgangId.class))).thenReturn(Optional.of(bescheidItem)); - - service.createBescheidDraft(BESCHEID); - - verify(service).mergeBescheidDrafts(bescheidItem, BESCHEID); - } - - @Test - void shouldCallOverrideAttachedItem() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).overrideAttachedItem(any()); - when(remoteService.findBescheidDraft(any(VorgangId.class))).thenReturn(Optional.of(bescheidItem)); - doReturn(updatedBescheidItem).when(service).mergeBescheidDrafts(any(), any()); - - service.createBescheidDraft(BESCHEID); - - verify(service).overrideAttachedItem(updatedBescheidItem); - } - - @Test - void shouldCallCreateBescheidDraft() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createAttachedItem(any()); - - service.createBescheidDraft(BESCHEID); - - verify(service).createBescheidDraft(BESCHEID); - } - - } - - @Nested - class TestCreateAttachedItem { - - private static final Bescheid BESCHEID = BescheidTestFactory.create(); - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @Mock - private OzgCloudCommand createAttachedItemCommand; - @Mock - private OzgCloudCommand finishedOzgCloudCommand; - - @BeforeEach - void init() { - when(commandService.createAndWaitUntilDone(any())).thenReturn(finishedOzgCloudCommand); - when(finishedOzgCloudCommand.getCreatedResource()).thenReturn(AttachedItemTestFactory.ID); - when(bescheidMapper.mapFromBescheid(any())).thenReturn(BESCHEID_ITEM); - } - - @Test - void shouldCallMapFromBescheid() { - createAttachedItem(); - - verify(bescheidMapper).mapFromBescheid(BESCHEID); - } - - @Test - void shouldCallBuildCreateAttachedItemCommand() { - doReturn(createAttachedItemCommand).when(service).buildCreateAttachedItemCommand(any()); - - createAttachedItem(); - - verify(service).buildCreateAttachedItemCommand(BESCHEID_ITEM); - } - - @Test - void shouldCallCommandService() { - doReturn(createAttachedItemCommand).when(service).buildCreateAttachedItemCommand(any()); - - createAttachedItem(); - - verify(commandService).createAndWaitUntilDone(createAttachedItemCommand); - } - - @Test - void shouldReturnCreatedResource() { - var result = createAttachedItem(); - - assertThat(result).isEqualTo(AttachedItemTestFactory.ID); - } - - private String createAttachedItem() { - return service.createAttachedItem(BESCHEID); - } - } - - @Nested - class TestBuildCreateAttachedItemCommand { - - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @Test - void shouldCallVorgangIdMapper() { - service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetVorgangId() { - var expectedVorgangId = OzgCloudVorgangId.from(CommandTestFactory.VORGANG_ID); - when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId); - - var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - assertThat(result.getVorgangId()).isEqualTo(expectedVorgangId); - } - - @Test - void shouldCallRelationIdMapper() { - service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetRelationId() { - var expectedRelationId = "relationId"; - when(commandMapper.mapRelationId(any())).thenReturn(GenericId.from(expectedRelationId)); - - var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - assertThat(result.getRelationId()).hasToString(expectedRelationId); - } - - @Test - void shouldSetOrder() { - var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - assertThat(result.getOrder()).isEqualTo(AttachedItemService.CREATE_ATTACHED_ITEM_ORDER); - } - - @Test - void shouldCallAttachedItemMapper() { - service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - verify(mapper).toMap(BESCHEID_ITEM); - } - - @Test - void shouldSetBodyObject() { - var itemMap = Map.<String, Object>of("key", "value"); - when(mapper.toMap(any())).thenReturn(itemMap); - - var result = service.buildCreateAttachedItemCommand(BESCHEID_ITEM); - - assertThat(result.getBodyObject()).containsAllEntriesOf(itemMap); - } - } - - @Nested - class TestUpdateBescheidDraft { - - @Mock - private OzgCloudCommand updateAttachedItemCommand; - - private final Command command = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID).build(); - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); - private final Optional<Document> document = Optional.of(DocumentTestFactory.create()); - - @BeforeEach - void init() { - when(remoteService.getItem(any())).thenReturn(bescheidItem); - } - - @Test - void shouldCallGetBescheid() { - doUpdateBescheidDraft(); - - verify(remoteService, times(2)).getItem(AttachedItemTestFactory.ID); - } - - @Test - void shouldCallValidateBescheidStatus() { - doUpdateBescheidDraft(); - - verify(service).validateBescheidStatus(bescheidItem); - } - - @Test - void shouldCallBuildUpdateBescheidItemMap() { - doUpdateBescheidDraft(); - - verify(service).buildBescheidItemAsMap(command, document); - } - - @Test - void shouldCallBuildAttachedItemAsMap() { - var itemMap = Map.<String, Object>of("key", "value"); - doReturn(itemMap).when(service).buildBescheidItemAsMap(any(), any()); - - doUpdateBescheidDraft(); - - verify(service).buildAttachedItemAsMap(command, itemMap); - } - - @Test - void shouldCallBuildUpdateAttachedItemCommand() { - var expectedBodyObject = Map.<String, Object>of("key", "value"); - doReturn(expectedBodyObject).when(service).buildAttachedItemAsMap(any(), any()); - - doUpdateBescheidDraft(); - - verify(service).buildPatchAttachedItemCommand(bescheidItem, expectedBodyObject); - } - - @Test - void shouldCallCommandService() { - doReturn(updateAttachedItemCommand).when(service).buildPatchAttachedItemCommand(any(), any()); - - doUpdateBescheidDraft(); - - verify(commandService).createAndWaitUntilDone(updateAttachedItemCommand); - } - - @Test - void shouldThrowExceptionWhenNotFound() { - when(remoteService.getItem(any())).thenThrow(StatusRuntimeException.class); - - assertThrows(StatusRuntimeException.class, this::doUpdateBescheidDraft); - } - - private void doUpdateBescheidDraft() { - service.updateBescheidDraft(command, document); - } - } - - @DisplayName("Build bescheid item") - @Nested - class TestBuildBescheidItemAsMap { - - private final Optional<Document> document = Optional.of(DocumentTestFactory.create()); - private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - private final AttachedItem bescheidAttachedItem = AttachedItemTestFactory.createBescheid(); - - @BeforeEach - void mock() { - doReturn(bescheidAttachedItem).when(service).getItem(any()); - } - - @Test - void shouldBuildItemMapWithExistingBescheidFields() { - service.buildBescheidItemAsMap(command, document); - - verify(service).buildItemMapWithExistingBescheidFields(command); - } - - @Test - void shouldGetItem() { - service.buildBescheidItemAsMap(command, document); - - verify(service).getItem(CommandTestFactory.RELATION_ID); - } - - @Test - void shouldCallGetNewNachrichtText() { - service.buildBescheidItemAsMap(command, document); - - verify(service).getNewNachrichtText(bescheidAttachedItem, document); - } - - @Test - void shouldOverrideIfNewNachrichtText() { - doReturn(Optional.of(DocumentTestFactory.NACHRICHT_TEXT)).when(service).getNewNachrichtText(any(), any()); - - var bescheidItem = service.buildBescheidItemAsMap(command, document); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, DocumentTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldKeepNachrichtTextIfNotNew() { - doReturn(Optional.empty()).when(service).getNewNachrichtText(any(), any()); - - var bescheidItem = service.buildBescheidItemAsMap(command, document); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); - } - } - - @DisplayName("Get new nachrichtText") - @Nested - class TestGetNewNachrichtText { - - private final AttachedItem bescheidItem = AttachedItemTestFactory.createBescheid(); - - @DisplayName("with filled new document") - @Nested - class TestFilledDocument { - - private final Document document = DocumentTestFactory.create(); - private final Optional<Document> documentOpt = Optional.of(document); - - @Test - void shouldCheckIfIsDifferentDocument() { - service.getNewNachrichtText(bescheidItem, documentOpt); - - verify(service).isDifferentDocument(document, bescheidItem); - } - - @DisplayName("and different documentId") - @Nested - class TestAndDifferentDocumentId { - - @BeforeEach - void mock() { - doReturn(true).when(service).isDifferentDocument(any(), any()); - } - - @Test - void shouldReturnNachrichtTextFromDocument() { - var nachrichtText = service.getNewNachrichtText(bescheidItem, documentOpt); - - assertThat(nachrichtText).hasValue(DocumentTestFactory.NACHRICHT_TEXT); - } - } - - @DisplayName("and same documentId") - @Nested - class TestAndSameDocumentId { - - @BeforeEach - void mock() { - doReturn(false).when(service).isDifferentDocument(any(), any()); - } - - @Test - void shouldReturnNachrichtTextFromDocument() { - var nachrichtText = service.getNewNachrichtText(bescheidItem, documentOpt); - - assertThat(nachrichtText).isEmpty(); - } - } - } - - @DisplayName("with empty document") - @Nested - class TestWithEmptyDocument { - - @Test - void shouldReturnEmpty() { - var nachrichtText = service.getNewNachrichtText(bescheidItem, Optional.empty()); - - assertThat(nachrichtText).isEmpty(); - } - } - } - - @Nested - class TestBuildAttachedItemAsMap { - - private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - @Test - void shouldSetVorgangId() { - var map = service.buildAttachedItemAsMap(command, Map.of()); - - assertThat(map).containsEntry(AttachedItem.PROPERTY_VORGANG_ID, command.getVorgangId()); - } - - @Test - void shouldSetClient() { - var map = service.buildAttachedItemAsMap(command, Map.of()); - - assertThat(map).containsEntry(AttachedItem.PROPERTY_CLIENT, BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - } - - @Test - void shouldSetItemName() { - var map = service.buildAttachedItemAsMap(command, Map.of()); - - assertThat(map).containsEntry(AttachedItem.PROPERTY_ITEM_NAME, AttachedItemService.BESCHEID_ITEM_NAME); - } - - @Test - void shouldSetItem() { - var expectedMap = Map.<String, Object>of("key", "value"); - - var map = service.buildAttachedItemAsMap(command, expectedMap); - - assertThat(map).containsEntry(AttachedItem.PROPERTY_ITEM, expectedMap); - } - } - - @Nested - class TestOverrideAttachedItem { - - private static final String CREATED_RESOURCE = "created-resource"; - - @Mock - private OzgCloudCommand updateItemCommand; - - @BeforeEach - void init() { - when(commandService.createAndWaitUntilDone(any())).thenReturn(updateItemCommand); - when(updateItemCommand.getCreatedResource()).thenReturn(CREATED_RESOURCE); - } - - @Test - void shouldCallBuildUpdateAttachedItemCommand() { - var bodyObject = Map.<String, Object>of("key", "value"); - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().item(bodyObject).build(); - - service.overrideAttachedItem(bescheidItem); - - verify(service).buildPatchAttachedItemCommand(bescheidItem, bodyObject); - } - - @Test - void shouldCallCommandService() { - doReturn(updateItemCommand).when(service).buildPatchAttachedItemCommand(any(), any()); - - service.overrideAttachedItem(AttachedItemTestFactory.createBescheid()); - - verify(commandService).createAndWaitUntilDone(updateItemCommand); - } - - @Test - void shouldReturnCreatedResource() { - var result = service.overrideAttachedItem(AttachedItemTestFactory.createBescheid()); - - assertThat(result).isEqualTo(CREATED_RESOURCE); - } - } - - @DisplayName("Build map with all bescheid fields") - @Nested - class TestBuildMapWithAllBescheidFields { - - private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - @Test - void shouldHaveSetBescheidenAm() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR); - } - - @Test - void shouldHaveSetBewilligt() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BEWILLIGT, BescheidTestFactory.BEWILLIGT); - } - - @Test - void shouldHaveSetBescheidDocument() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID); - } - - @Test - void shouldHaveSetSendBy() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name()); - } - - @Test - void shouldHaveSetNachrichtText() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldHaveSetNachrichtSubject() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); - } - - @Test - void shouldHaveSetAttachments() { - var bescheidItem = service.buildItemMapWithAllBescheidFields(command); - - assertThat(bescheidItem).containsEntry(Bescheid.FIELD_ATTACHMENTS, - List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR)); - } - } - - @Nested - class TestAddValueFromMapIfExists { - - private static final String KEY = "key"; - - @Test - void shouldAddValue() { - var targetMap = new HashMap<String, Object>(); - var expectedValue = "value"; - Map<String, Object> sourceMap = Map.of(KEY, expectedValue); - - service.addValueFromMapIfExists(sourceMap, KEY, targetMap); - - assertThat(targetMap).containsEntry(KEY, expectedValue); - } - - @Test - void shouldNotAddValueIfKeyNotExists() { - var targetMap = new HashMap<String, Object>(); - var expectedValue = "value"; - Map<String, Object> sourceMap = Map.of(KEY, expectedValue); - - service.addValueFromMapIfExists(sourceMap, "notExists", targetMap); - - assertThat(targetMap).isEmpty(); - } - - @Test - void shouldAddNullValues() { - var targetMap = new HashMap<String, Object>(); - Map<String, Object> sourceMap = Collections.singletonMap(KEY, null); - - service.addValueFromMapIfExists(sourceMap, KEY, targetMap); - - assertThat(targetMap).containsEntry(KEY, null); - } - } - - @Nested - class TestBuildBescheidMap { - - private final Command command = CommandTestFactory.createBuilder().bodyObject(AttachedItemTestFactory.createBescheidItem()).build(); - - @Test - void shouldSetStatus() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name()); - } - - @Test - void shouldSetBeschiedenAm() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, BescheidTestFactory.BESCHIEDEN_AM_STR); - } - - @Test - void shouldSetBewilligt() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BEWILLIGT, true); - } - - @Test - void shouldSetBescheidDocument() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_BESCHEID_DOCUMENT, DocumentTestFactory.ID); - } - - @Test - void shouldSetSendBy() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_SEND_BY, BescheidTestFactory.SEND_BY.name()); - } - - @Test - void shouldSetNachrichtText() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldSetNachrichtSubject() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_NACHRICHT_SUBJECT, BescheidTestFactory.NACHRICHT_SUBJECT); - } - - @Test - void shouldSetAttachments() { - var bescheidMap = service.buildItemMapWithExistingBescheidFields(command); - - assertThat(bescheidMap).containsEntry(Bescheid.FIELD_ATTACHMENTS, - List.of(BescheidTestFactory.ATTACHMENT_STR, BescheidTestFactory.ATTACHMENT_STR)); - } - } - - @Nested - class TestBuildUpdateAttachedItemCommand { - - @Test - void shouldCallVorgangIdMapper() { - service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetVorgangId() { - var expectedVorgangId = OzgCloudVorgangId.from(CommandTestFactory.VORGANG_ID); - when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId); - - var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - assertThat(result.getVorgangId()).isEqualTo(expectedVorgangId); - } - - @Test - void shouldCallRelationIdMapper() { - service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - verify(commandMapper).mapRelationId(AttachedItemTestFactory.ID); - } - - @Test - void shouldSetRelationId() { - var expectedId = GenericId.from("relationId"); - when(commandMapper.mapRelationId(any())).thenReturn(expectedId); - - var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - assertThat(result.getRelationId()).isEqualTo(expectedId); - } - - @Test - void shouldSetRelationVersion() { - var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - assertThat(result.getRelationVersion()).isEqualTo(AttachedItemTestFactory.VERSION); - } - - @Test - void shouldSetOrder() { - var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), Map.of()); - - assertThat(result.getOrder()).isEqualTo(AttachedItemService.PATCH_ATTACHED_ITEM); - } - - @Test - void shouldSetBodyObject() { - var bodyObject = Map.<String, Object>of("key", "value"); - - var result = service.buildPatchAttachedItemCommand(AttachedItemTestFactory.createBescheid(), bodyObject); - - assertThat(result.getBodyObject()).containsAllEntriesOf(bodyObject); - } - - } - - @Nested - class TestDeleteBescheidDraft { - - @Mock - private OzgCloudCommand deleteItemOzgCloudCommand; - - private final Command command = CommandTestFactory.createBuilder().relationId(AttachedItemTestFactory.ID).build(); - - @Test - void shouldCallGetBescheid() { - when(remoteService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid()); - - deleteBescheidDraft(); - - verify(remoteService).getItem(AttachedItemTestFactory.ID); - } - - @Test - void shouldCallCommandService() { - doReturn(deleteItemOzgCloudCommand).when(service).buildDeleteItemCommand(any(), any()); - when(remoteService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid()); - - deleteBescheidDraft(); - - verify(commandService).createAndWaitUntilDone(deleteItemOzgCloudCommand); - } - - @Test - void shouldThrowExceptionIfBescheidNotFound() { - when(remoteService.getItem(any())).thenThrow(StatusRuntimeException.class); - - assertThrows(StatusRuntimeException.class, this::deleteBescheidDraft); - } - - private void deleteBescheidDraft() { - service.deleteBescheidDraft(command); - } - - @Nested - class TestBuildDeleteItemCommand { - - @Test - void shouldCallCommandMapperWithVorgangId() { - service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetVorgangId() { - var expectedVorgangId = OzgCloudVorgangId.from(CommandTestFactory.VORGANG_ID); - when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId); - - var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - assertThat(ozgCloudCommand.getVorgangId()).isEqualTo(expectedVorgangId); - } - - @Test - void shouldCallCommandMapperWithRelationId() { - service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - verify(commandMapper).mapRelationId(AttachedItemTestFactory.ID); - } - - @Test - void shouldSetRelationId() { - var expectedId = GenericId.from(AttachedItemTestFactory.ID); - when(commandMapper.mapRelationId(any())).thenReturn(expectedId); - - var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - assertThat(ozgCloudCommand.getRelationId()).isEqualTo(expectedId); - } - - @Test - void shouldSetRelationVersion() { - var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - assertThat(ozgCloudCommand.getRelationVersion()).isEqualTo(AttachedItemTestFactory.VERSION); - } - - @Test - void shouldSetOrder() { - var ozgCloudCommand = service.buildDeleteItemCommand(command, AttachedItemTestFactory.createBescheid()); - - assertThat(ozgCloudCommand.getOrder()).isEqualTo(AttachedItemService.DELETE_ATTACHED_ITEM); - } - } - } - - @Nested - class TestValidateBescheid { - - @Test - void shouldFilterDraftStatus() { - assertDoesNotThrow(() -> service.validateBescheidStatus(AttachedItemTestFactory.createBescheid())); - } - - @Test - void shouldThrowExceptionIfBescheidIsNotDraft() { - var bescheidItem = AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, "otherStatus") - .build(); - - assertThrows(TechnicalException.class, () -> service.validateBescheidStatus(bescheidItem)); - } - - } - - @Nested - class TestGetItem { - - @Test - void shouldCallRemoteService() { - service.getItem(AttachedItemTestFactory.ID); - - verify(service).getItem(AttachedItemTestFactory.ID); - } - - @Test - void shouldReturnValue() { - var expectedItem = AttachedItemTestFactory.createDocument(); - doReturn(expectedItem).when(remoteService).getItem(any()); - - var result = service.getItem(AttachedItemTestFactory.ID); - - assertThat(result).isEqualTo(expectedItem); - } - } - - @Nested - class TestBuildItemMap { - - @Test - void shouldSetStatus() { - var result = service.buildItemMap(Bescheid.Status.DRAFT); - - assertThat(result).containsEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name()); - } - } - - @Nested - class TestFindAllBescheid { - - @Test - void shouldCallRemoteService() { - service.findAllBescheid(VorgangTestFactory.ID); - - verify(remoteService).findAllBescheid(VorgangTestFactory.ID); - } - - @Test - void shouldReturnResult() { - var expectedBescheidItem = AttachedItemTestFactory.createBescheid(); - when(remoteService.findAllBescheid(any(VorgangId.class))).thenReturn(Collections.singletonList(expectedBescheidItem)); - - var result = service.findAllBescheid(VorgangTestFactory.ID); - - assertThat(result).containsExactly(expectedBescheidItem); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java index 9b3ac12ebfa3c1f1385bedaab9d8383c25c750a8..1af82ad13421912cc88260d356d24a5eb3e1acbb 100644 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java +++ b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/AttachedItemTestFactory.java @@ -30,18 +30,20 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -import de.ozgcloud.bescheid.Bescheid; import de.ozgcloud.bescheid.BescheidTestFactory; -import de.ozgcloud.bescheid.SentInfo; import de.ozgcloud.bescheid.SentInfoTestFactory; -import de.ozgcloud.bescheid.common.user.UserProfileTestFactory; import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItem.AttachedItemBuilder; import de.ozgcloud.common.binaryfile.FileId; import de.ozgcloud.document.Document; import de.ozgcloud.document.DocumentService; import de.ozgcloud.document.DocumentTestFactory; +import de.ozgcloud.document.bescheid.Bescheid; +import de.ozgcloud.document.bescheid.SentInfo; +import de.ozgcloud.document.bescheid.common.user.UserProfileTestFactory; +import de.ozgcloud.document.common.attached_item.AttachedItem; +import de.ozgcloud.document.common.attached_item.AttachedItem.AttachedItemBuilder; +import de.ozgcloud.document.common.attached_item.AttachedItemService; public class AttachedItemTestFactory { diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java deleted file mode 100644 index 6a1ebaafcff9eb040990d3d2809fd1cc7ba8194a..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcFindVorgangAttachedItemResponseTestFactory.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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.common.attached_item; - -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemResponse; - -public class GrpcFindVorgangAttachedItemResponseTestFactory { - - public static GrpcFindVorgangAttachedItemResponse create() { - return createBuilder().build(); - } - - public static GrpcFindVorgangAttachedItemResponse.Builder createBuilder() { - return GrpcFindVorgangAttachedItemResponse.newBuilder() - .addVorgangAttachedItems(GrpcVorgangAttachedItemTestFactory.create()); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java deleted file mode 100644 index daa37d39f9417cb153ae0d83361be572634698e2..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/GrpcVorgangAttachedItemTestFactory.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2022 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.common.attached_item; - -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.vorgang.common.GrpcObject; -import de.ozgcloud.vorgang.common.GrpcProperty; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; - -public class GrpcVorgangAttachedItemTestFactory { - - public static final String PROPERTY_NAME = "propertyName"; - public static final String PROPERTY_NAME_VALUE = "propertyNameValue"; - public static final GrpcObject OBJECT = GrpcObject.newBuilder() - .addProperty(GrpcProperty.newBuilder().setName(PROPERTY_NAME).addValue(PROPERTY_NAME_VALUE)).build(); - - static GrpcVorgangAttachedItem create() { - return createBuilder().build(); - } - - static GrpcVorgangAttachedItem.Builder createBuilder() { - return GrpcVorgangAttachedItem.newBuilder() - .setId(AttachedItemTestFactory.ID) - .setVersion(AttachedItemTestFactory.VERSION) - .setVorgangId(CommandTestFactory.VORGANG_ID) - .setClient(AttachedItemTestFactory.CLIENT) - .setItemName(AttachedItemService.BESCHEID_ITEM_NAME) - .setItem(OBJECT); - } -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java deleted file mode 100644 index 104ace168b6b7486c39adf39df9657a825b8d577..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/common/attached_item/VorgangAttachedItemRemoteServiceTest.java +++ /dev/null @@ -1,490 +0,0 @@ -/* - * - * 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.common.attached_item; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Collections; -import java.util.List; -import java.util.Optional; -import java.util.stream.Stream; - -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.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.vorgang.VorgangTestFactory; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.vorgang.common.GrpcObject; -import de.ozgcloud.vorgang.common.GrpcProperty; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemRequest; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcFindVorgangAttachedItemResponse; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItem; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemRequest; -import de.ozgcloud.vorgang.vorgangAttachedItem.GrpcVorgangAttachedItemResponse; -import de.ozgcloud.vorgang.vorgangAttachedItem.VorgangAttachedItemServiceGrpc.VorgangAttachedItemServiceBlockingStub; -import io.grpc.ClientInterceptor; - -class VorgangAttachedItemRemoteServiceTest { - - @Spy - @InjectMocks - private VorgangAttachedItemRemoteService service; - - @Mock - private VorgangAttachedItemServiceBlockingStub serviceStub; - @Mock - private ClientInterceptor bescheidCallContextInterceptor; - @Mock - private AttachedItemMapper attachedItemMapper; - - @Nested - class TestFindBescheidDraft { - - @Mock - private GrpcFindVorgangAttachedItemRequest request; - - @Nested - class TestFindByVorgangId { - - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @BeforeEach - void init() { - doReturn(request).when(service).buildFindRequest(any()); - doReturn(Optional.of(BESCHEID_ITEM)).when(service).findBescheidDraft(any(GrpcFindVorgangAttachedItemRequest.class)); - } - - @Test - void shouldCallCreateFindRequestBuilder() { - service.findBescheidDraft(VorgangTestFactory.ID); - - verify(service).buildFindRequest(VorgangTestFactory.ID_STR); - } - - @Test - void shouldCallGetBescheidDraft() { - service.findBescheidDraft(VorgangTestFactory.ID); - - verify(service).findBescheidDraft(request); - } - - @Test - void shouldReturnResult() { - var result = service.findBescheidDraft(VorgangTestFactory.ID); - - assertThat(result).contains(BESCHEID_ITEM); - } - } - - @Nested - @DisplayName("by grpc request") - class TestByGrpcRequest { - - private static final AttachedItem BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @Mock - private GrpcFindVorgangAttachedItemResponse response; - - @BeforeEach - void init() { - } - - @Test - void shouldCallFindAllBescheid() { - doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - - service.findBescheidDraft(request); - - verify(service).findAllBescheid(request); - } - - @Test - void shouldCallHasStatusDraft() { - doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - - service.findBescheidDraft(request); - - verify(service).hasStatusDraft(BESCHEID_ITEM); - } - - @Test - void shouldFilterDraftItems() { - doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - doReturn(true).when(service).hasStatusDraft(any()); - - var result = service.findBescheidDraft(request); - - assertThat(result).contains(BESCHEID_ITEM); - } - - @Test - void shouldReturnEmptyWhenNotFound() { - doReturn(Stream.empty()).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - - var result = service.findBescheidDraft(request); - - assertThat(result).isEmpty(); - } - - @Test - void shouldReturnEmptyWhenNotDraft() { - doReturn(Stream.of(BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - doReturn(false).when(service).hasStatusDraft(any()); - - var result = service.findBescheidDraft(request); - - assertThat(result).isEmpty(); - } - - } - - } - - @Nested - class TestFindAllBescheid { - - private static final AttachedItem RESULT_BESCHEID_ITEM = AttachedItemTestFactory.createBescheid(); - - @Mock - private GrpcFindVorgangAttachedItemRequest request; - - @BeforeEach - void init() { - doReturn(Stream.of(RESULT_BESCHEID_ITEM)).when(service).findAllBescheid(any(GrpcFindVorgangAttachedItemRequest.class)); - } - - @Test - void shouldCallBuildFindRequest() { - service.findAllBescheid(VorgangTestFactory.ID); - - verify(service).buildFindRequest(VorgangTestFactory.ID.toString()); - } - - @Test - void shouldCallFindAllBescheid() { - doReturn(request).when(service).buildFindRequest(any()); - - service.findAllBescheid(VorgangTestFactory.ID); - - verify(service).findAllBescheid(request); - } - - @Test - void shouldReturnResult() { - var result = service.findAllBescheid(VorgangTestFactory.ID); - - assertThat(result).containsExactly(RESULT_BESCHEID_ITEM); - } - } - - @Nested - class TestBuildFindRequest { - - @Test - void shouldBuildRequest() { - var request = buildFindRequest(); - - assertThat(request.getVorgangId()).isEqualTo(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetItemName() { - var request = buildFindRequest(); - - assertThat(request.getItemName()).isEqualTo(AttachedItemService.BESCHEID_ITEM_NAME); - } - - @Test - void shouldSetClient() { - var request = buildFindRequest(); - - assertThat(request.getClient()).isEqualTo(BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - } - - private GrpcFindVorgangAttachedItemRequest buildFindRequest() { - return service.buildFindRequest(CommandTestFactory.VORGANG_ID); - } - } - - @Nested - class TestFindAllBescheidWithGrpcRequest { - - @Mock - private GrpcFindVorgangAttachedItemRequest request; - @Mock - private GrpcFindVorgangAttachedItemResponse response; - @Mock - private GrpcVorgangAttachedItem grpcVorgangAttachedItem; - - @BeforeEach - void init() { - doReturn(serviceStub).when(service).getServiceStub(); - when(serviceStub.find(any())).thenReturn(response); - } - - @Test - void shouldCallGetServiceStub() { - service.findAllBescheid(request); - - verify(service).getServiceStub(); - } - - @Test - void shouldCallMapper() { - when(response.getVorgangAttachedItemsList()).thenReturn(Collections.singletonList(grpcVorgangAttachedItem)); - - service.findAllBescheid(request).toList(); - - verify(attachedItemMapper).mapFromVorgangAttachedItem(grpcVorgangAttachedItem); - } - - @Test - void shouldReturnSortedResult() { - var beschiedenAmFirst = "2021-01-01"; - var beschiedenAmLast = "2024-01-01"; - createItems(beschiedenAmFirst, beschiedenAmLast); - - var result = service.findAllBescheid(request).toList(); - - assertThat(result).hasSize(2); - assertThat(result.get(0).getItem()).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAmLast); - assertThat(result.get(1).getItem()).containsEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAmFirst); - } - - private void createItems(String beschiedenAmFirst, String beschiedenAmLast) { - var itemBeschiedenFirst = createGrpcAttachedItem(beschiedenAmLast); - when(attachedItemMapper.mapFromVorgangAttachedItem(itemBeschiedenFirst)).thenReturn(createAttachedItem(beschiedenAmLast)); - var itemBeschiedenLast = createGrpcAttachedItem(beschiedenAmFirst); - when(attachedItemMapper.mapFromVorgangAttachedItem(itemBeschiedenLast)).thenReturn(createAttachedItem(beschiedenAmFirst)); - when(response.getVorgangAttachedItemsList()).thenReturn(List.of(itemBeschiedenFirst, itemBeschiedenLast)); - } - - private GrpcVorgangAttachedItem createGrpcAttachedItem(String beschiedenAm) { - return GrpcVorgangAttachedItemTestFactory.createBuilder().clearItem().setItem(GrpcObject.newBuilder().addProperty( - GrpcProperty.newBuilder().setName(Bescheid.FIELD_BESCHIEDEN_AM).addValue(beschiedenAm))).build(); - } - - private AttachedItem createAttachedItem(String beschiedenAm) { - return AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_BESCHIEDEN_AM, beschiedenAm) - .build(); - } - } - - @Nested - class TestHasStatusDraft { - - @Test - void shouldReturnTrueIfDraft() { - var item = AttachedItemTestFactory.createBescheidBuilder().clearItem() - .itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.DRAFT.name()) - .build(); - - var result = service.hasStatusDraft(item); - - assertThat(result).isTrue(); - } - - @Test - void shouldReturnFalseIfNotDraft() { - var item = AttachedItemTestFactory.createBescheidBuilder().clearItem() - .itemEntry(Bescheid.FIELD_STATUS, Bescheid.Status.SENT.name()) - .build(); - - var result = service.hasStatusDraft(item); - - assertThat(result).isFalse(); - } - } - - @Nested - class TestGetBescheid { - - @Mock - private GrpcVorgangAttachedItemRequest grpcVorgangAttachedItemRequest; - @Mock - private GrpcVorgangAttachedItemResponse grpcVorgangAttachedItemResponse; - @Mock - private GrpcVorgangAttachedItem grpcVorgangAttachedItem; - - @BeforeEach - void init() { - when(serviceStub.getById(any())).thenReturn(grpcVorgangAttachedItemResponse); - doReturn(serviceStub).when(service).getServiceStub(); - } - - @Test - void shouldCallGetServiceStab() { - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - - getItem(); - - verify(service).getServiceStub(); - } - - @Test - void shouldCallBuildRequest() { - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - - getItem(); - - verify(service).buildGetByIdRequest(AttachedItemTestFactory.ID); - } - - @Test - void shouldCallGetById() { - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - doReturn(grpcVorgangAttachedItemRequest).when(service).buildGetByIdRequest(any()); - - getItem(); - - verify(serviceStub).getById(grpcVorgangAttachedItemRequest); - } - - @Test - void shouldCallMapper() { - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - - getItem(); - - verify(attachedItemMapper).mapFromVorgangAttachedItem(grpcVorgangAttachedItem); - } - - @Test - void shouldReturnFoundBescheid() { - var expectedBescheid = AttachedItemTestFactory.createBescheid(); - when(attachedItemMapper.mapFromVorgangAttachedItem(any())).thenReturn(expectedBescheid); - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - - var result = getItem(); - - assertThat(result).isEqualTo(expectedBescheid); - } - - private AttachedItem getItem() { - return service.getItem(AttachedItemTestFactory.ID); - } - } - - @Nested - class TestGetItem { - - @Mock - private GrpcVorgangAttachedItemRequest grpcVorgangAttachedItemRequest; - @Mock - private GrpcVorgangAttachedItemResponse grpcVorgangAttachedItemResponse; - @Mock - private GrpcVorgangAttachedItem grpcVorgangAttachedItem; - - @BeforeEach - void init() { - when(serviceStub.getById(any())).thenReturn(grpcVorgangAttachedItemResponse); - doReturn(serviceStub).when(service).getServiceStub(); - } - - @Test - void shouldCallGetServiceStab() { - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - - getItem(); - - verify(service).getServiceStub(); - } - - @Test - void shouldCallBuildRequest() { - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - - getItem(); - - verify(service).buildGetByIdRequest(AttachedItemTestFactory.ID); - } - - @Test - void shouldCallGetById() { - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - doReturn(grpcVorgangAttachedItemRequest).when(service).buildGetByIdRequest(any()); - - getItem(); - - verify(serviceStub).getById(grpcVorgangAttachedItemRequest); - } - - @Test - void shouldCallMapper() { - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - - getItem(); - - verify(attachedItemMapper).mapFromVorgangAttachedItem(grpcVorgangAttachedItem); - } - - @Test - void shouldReturnFoundBescheid() { - var expectedItem = AttachedItemTestFactory.createDocument(); - when(attachedItemMapper.mapFromVorgangAttachedItem(any())).thenReturn(expectedItem); - when(grpcVorgangAttachedItemResponse.getVorgangAttachedItem()).thenReturn(grpcVorgangAttachedItem); - - var result = getItem(); - - assertThat(result).isEqualTo(expectedItem); - } - - private AttachedItem getItem() { - return service.getItem(AttachedItemTestFactory.ID); - } - } - - @Nested - class TestBuildGetByIdRequest { - - @Test - void shouldSetBescheidId() { - var request = service.buildGetByIdRequest(AttachedItemTestFactory.ID); - - assertThat(request.getId()).isEqualTo(AttachedItemTestFactory.ID); - } - } - - @Nested - class TestGetServiceStub { - - @Test - void shouldCallWithInterceptors() { - service.getServiceStub(); - - verify(serviceStub).withInterceptors(bescheidCallContextInterceptor); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerTest.java deleted file mode 100644 index b95890c8ea0e39afabade13339e3790d947137f1..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentEventListenerTest.java +++ /dev/null @@ -1,166 +0,0 @@ -/* - * 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.document; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.security.core.context.SecurityContext; - -import de.ozgcloud.bescheid.common.callcontext.CurrentUserService; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandCreatedEventTestFactory; -import de.ozgcloud.command.CommandFailedEvent; -import de.ozgcloud.command.CommandTestFactory; - -class DocumentEventListenerTest { - - @Spy - @InjectMocks - private DocumentEventListener listener; - - @Mock - private DocumentService documentService; - @Mock - private ApplicationEventPublisher eventPublisher; - @Mock - private CurrentUserService userService; - - @Nested - class TestOnCreateBescheidDocumentFromFile { - - @Captor - private ArgumentCaptor<BescheidDocumentCreatedEvent> documentCreatedEventCaptor; - private Command command = CommandTestFactory.create(); - - @Test - void shouldCallDocumentService() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(documentService).createBescheidDocument(command); - } - - @Test - void shouldPublishCommandFinishedEvent() { - var createdResourceId = "createdResourceId"; - when(documentService.createBescheidDocument(any())).thenReturn(createdResourceId); - - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(eventPublisher).publishEvent(documentCreatedEventCaptor.capture()); - assertThat(documentCreatedEventCaptor.getValue().getCreatedResource()).isEqualTo(createdResourceId); - assertThat(documentCreatedEventCaptor.getValue().getCommand()).isEqualTo(command); - } - - @Test - void shouldNotPublishCommandFailedEvent() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(eventPublisher, never()).publishEvent(any(CommandFailedEvent.class)); - } - - @Nested - class TestHandleException { - - @Captor - private ArgumentCaptor<CommandFailedEvent> commandFailedEventCaptor; - - @BeforeEach - void init() { - doThrow(new RuntimeException("ups")).when(documentService).createBescheidDocument(any()); - } - - @Test - void shouldCallBuildErrorMessage() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(listener).buildErrorMessage(any()); - } - - @Test - void shouldPublishCommandFailedEvent() { - var expectedErrorMessage = "expected error message"; - doReturn(expectedErrorMessage).when(listener).buildErrorMessage(any()); - - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(eventPublisher).publishEvent(commandFailedEventCaptor.capture()); - assertThat(commandFailedEventCaptor.getValue().getSource()).isEqualTo(command.getId()); - assertThat(commandFailedEventCaptor.getValue().getErrorMessage()).isEqualTo(expectedErrorMessage); - } - - @Test - void shouldNotPublishFinishedEvent() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(eventPublisher, never()).publishEvent(any(BescheidDocumentCreatedEvent.class)); - } - } - - @Nested - class HandleSecurityContext { - - @Mock - private SecurityContext secContext; - - @BeforeEach - void init() { - when(userService.startSecurityContext(any())).thenReturn(secContext); - } - - @Test - void shouldStartSecurityContext() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(userService).startSecurityContext(command); - } - - @Test - void shouldResetSecurityContext() { - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(userService).resetSecurityContext(secContext); - } - - @Test - void shouldResetSecurityContextAfterException() { - doThrow(new RuntimeException("ups")).when(documentService).createBescheidDocument(any()); - - listener.onCreateBescheidDocumentFromFile(CommandCreatedEventTestFactory.withCommand(command)); - - verify(userService).resetSecurityContext(secContext); - } - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java deleted file mode 100644 index e2157ed90a4161e3e67bfd1dcc30f0010c5ca390..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentGrpcServiceTest.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * 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.document; - -import static org.assertj.core.api.Assertions.*; -import static org.mockito.Mockito.*; - -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; - -import io.grpc.stub.StreamObserver; - -class DocumentGrpcServiceTest { - - @Spy - @InjectMocks - private DocumentGrpcService service; - - @Mock - private DocumentService documentService; - @Mock - private DocumentMapper documentMapper; - - @Nested - class TestGetDocument { - - private final static GrpcGetDocumentRequest REQUEST = GrpcGetDocumentRequest.newBuilder().setId(DocumentTestFactory.ID).build(); - - @Mock - private GrpcGetDocumentResponse response; - @Mock - private StreamObserver<GrpcGetDocumentResponse> responseObserver; - - @BeforeEach - void init() { - doReturn(response).when(service).buildGetDocumentResponse(any()); - } - - @Test - void shouldCallDocumentService() { - service.getDocument(REQUEST, responseObserver); - - verify(documentService).getDocument(DocumentTestFactory.ID); - } - - @Test - void shouldCallBuildResponse() { - service.getDocument(REQUEST, responseObserver); - - verify(service).buildGetDocumentResponse(any()); - } - - @Test - void shouldCallOnNext() { - service.getDocument(REQUEST, responseObserver); - - verify(responseObserver).onNext(response); - } - - @Test - void shouldCallOnCompleted() { - service.getDocument(REQUEST, responseObserver); - - verify(responseObserver).onCompleted(); - } - } - - @Nested - class TestBuildGetDocumentResponse { - - @Mock - private GrpcDocument grpcDocument; - - @BeforeEach - void init() { - when(documentMapper.toGrpcDocument(any())).thenReturn(grpcDocument); - } - - @Test - void shouldCallDocumentMapper() { - var document = DocumentTestFactory.create(); - - service.buildGetDocumentResponse(document); - - verify(documentMapper).toGrpcDocument(document); - } - - @Test - void shouldSetDocument() { - var result = service.buildGetDocumentResponse(DocumentTestFactory.create()); - - assertThat(result.getDocument()).isEqualTo(grpcDocument); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java deleted file mode 100644 index 50405df503f49f1a8ef42d20921d9cb0dbc62e99..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentMapperTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/* - * 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.document; - -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 org.mapstruct.factory.Mappers; - -import de.ozgcloud.common.attached_item.AttachedItemTestFactory; - -class DocumentMapperTest { - - private DocumentMapper mapper = Mappers.getMapper(DocumentMapper.class); - - @DisplayName("To grpc document") - @Nested - class TestToGrpcDocument { - - @Test - void shouldMapDocument() { - var result = mapper.toGrpcDocument(DocumentTestFactory.create()); - - assertThat(result).usingRecursiveComparison().isEqualTo(GrpcDocumentTestFactory.create()); - } - - @Test - void shouldMapEmptyDocument() { - var result = mapper.toGrpcDocument(Document.builder().build()); - - assertThat(result).isEqualTo(GrpcDocument.newBuilder().build()); - } - } - - @DisplayName("From attached item") - @Nested - class TestFromAttachedItem { - - @Test - void shouldMapId() { - var document = AttachedItemTestFactory.createDocument(); - - var result = mapper.fromAttachedItem(document); - - assertThat(result.getId()).isEqualTo(AttachedItemTestFactory.ID); - } - - @Test - void shouldMapType() { - var document = AttachedItemTestFactory.createDocument(); - - var result = mapper.fromAttachedItem(document); - - assertThat(result.getType()).isEqualTo(DocumentService.DOCUMENT_TYPE); - } - - @Test - void shouldMapFileId() { - var document = AttachedItemTestFactory.createDocument(); - - var result = mapper.fromAttachedItem(document); - - assertThat(result.getFileId()).isEqualTo(DocumentTestFactory.DOCUMENT_FILE); - } - - @Test - void shouldMapNachrichtText() { - var document = AttachedItemTestFactory.createDocument(); - - var result = mapper.fromAttachedItem(document); - - assertThat(result.getNachrichtText()).isEqualTo(DocumentTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldMapNachrichtSubject() { - var document = AttachedItemTestFactory.createDocument(); - - var result = mapper.fromAttachedItem(document); - - assertThat(result.getNachrichtSubject()).isEqualTo(DocumentTestFactory.NACHRICHT_SUBJECT); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java deleted file mode 100644 index 9a059e860e5fd527fdc18b6e236f5363ce7311e4..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentServiceTest.java +++ /dev/null @@ -1,452 +0,0 @@ -/* - * 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.document; - -import static org.assertj.core.api.Assertions.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.*; -import static org.mockito.Mockito.*; - -import java.util.Map; -import java.util.Optional; - -import org.apache.commons.lang3.StringUtils; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Nested; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.Spy; -import org.springframework.web.server.ResponseStatusException; - -import de.ozgcloud.apilib.common.command.OzgCloudCommand; -import de.ozgcloud.apilib.common.command.OzgCloudCommandService; -import de.ozgcloud.apilib.common.command.grpc.CommandMapper; -import de.ozgcloud.apilib.common.datatypes.GenericId; -import de.ozgcloud.apilib.vorgang.OzgCloudVorgangId; -import de.ozgcloud.bescheid.Bescheid; -import de.ozgcloud.bescheid.BescheidCallContextAttachingInterceptor; -import de.ozgcloud.bescheid.BescheidTestFactory; -import de.ozgcloud.bescheid.BescheidResponse; -import de.ozgcloud.bescheid.BescheidResponseTestFactory; -import de.ozgcloud.command.Command; -import de.ozgcloud.command.CommandTestFactory; -import de.ozgcloud.common.attached_item.AttachedItem; -import de.ozgcloud.common.attached_item.AttachedItemService; -import de.ozgcloud.common.attached_item.AttachedItemTestFactory; -import de.ozgcloud.common.binaryfile.FileId; -import de.ozgcloud.common.errorhandling.TechnicalException; - -class DocumentServiceTest { - - private static final String FILE_ID = "file-id"; - private static final String RELATION_ID = "relation-id"; - - @Spy - @InjectMocks - private DocumentService service; - - @Mock - private OzgCloudCommandService commandService; - @Mock - private CommandMapper commandMapper; - @Mock - private AttachedItemService attachedItemService; - @Mock - private DocumentMapper documentMapper; - - private final Command command = CommandTestFactory.createBuilder().relationId(RELATION_ID).build(); - - @Nested - class TestCreateBescheidDocument { - - private static final String CREATED_ATTACHED_ITEM_ID = "document-id"; - - @Mock - private OzgCloudCommand ozgCommand; - - @Nested - class TestWithCommand { - - private final Command command = CommandTestFactory.createBuilder().relationId(RELATION_ID) - .bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID)).build(); - - @BeforeEach - void init() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createBescheidDocument(any(), anyMap()); - } - - @Test - void shouldCallBuildItemMap() { - service.createBescheidDocument(command); - - verify(service).buildItemMap(command); - } - - @Test - void shouldCallCreateBescheidDocument() { - var itemMap = Map.of("key", (Object) "value"); - doReturn(itemMap).when(service).buildItemMap(any(Command.class)); - - service.createBescheidDocument(command); - - verify(service).createBescheidDocument(command, itemMap); - } - - @Test - void shouldReturnDocumentId() { - String result = service.createBescheidDocument(command); - - assertThat(result).isEqualTo(CREATED_ATTACHED_ITEM_ID); - } - } - - @Nested - class TestWithBescheid { - - private final BescheidResponse bescheid = BescheidResponseTestFactory.create() - .withBescheidFileId(FileId.from(DocumentTestFactory.ID)); - - @BeforeEach - void init() { - doReturn(CREATED_ATTACHED_ITEM_ID).when(service).createBescheidDocument(any(), anyMap()); - } - - @Test - void shouldCallBuildItemMap() { - service.createBescheidDocument(command, bescheid); - - verify(service).buildItemMap(bescheid); - } - - @Test - void shouldCallCreateBescheidDocument() { - var itemMap = Map.of("key", (Object) "value"); - doReturn(itemMap).when(service).buildItemMap(any(BescheidResponse.class)); - - service.createBescheidDocument(command, bescheid); - - verify(service).createBescheidDocument(command, itemMap); - } - - @Test - void shouldReturnDocumentId() { - String result = service.createBescheidDocument(command, bescheid); - - assertThat(result).isEqualTo(CREATED_ATTACHED_ITEM_ID); - } - } - - @Nested - class TestWithCommandAndItemMap { - - private static final Map<String, Object> BODY_OBJECT = Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID); - - @BeforeEach - void init() { - when(commandService.createAndWaitUntilDone(any())).thenReturn(ozgCommand); - doNothing().when(service).validateBescheidItem(any()); - } - - @Test - void shouldCallValidateBescheidItem() { - service.createBescheidDocument(command, BODY_OBJECT); - - verify(service).validateBescheidItem(RELATION_ID); - } - - @Test - void shouldCallCommandService() { - doReturn(ozgCommand).when(service).buildCreateDocumentOzgCommand(any(), anyMap()); - - service.createBescheidDocument(command, BODY_OBJECT); - - verify(commandService).createAndWaitUntilDone(ozgCommand); - } - - @Test - void shouldReturnDocumentId() { - when(ozgCommand.getCreatedResource()).thenReturn(CREATED_ATTACHED_ITEM_ID); - - String documentId = service.createBescheidDocument(command, BODY_OBJECT); - - assertThat(documentId).isEqualTo(CREATED_ATTACHED_ITEM_ID); - } - } - } - - @Nested - class TestValidateBescheidItem { - - @Test - void shouldCallGetBescheidItem() { - when(attachedItemService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid()); - - validateBescheidItem(); - - verify(attachedItemService).getItem(AttachedItemTestFactory.ID); - } - - @Test - void shouldThrowExceptionWhenNoBescheidDraft() { - when(attachedItemService.getItem(any())).thenThrow(ResponseStatusException.class); - - assertThrows(ResponseStatusException.class, this::validateBescheidItem); - } - - @Test - void shouldNotThrowExceptionIfNotDraft() { - when(attachedItemService.getItem(any())).thenReturn( - AttachedItemTestFactory.createBescheidBuilder().clearItem().itemEntry(Bescheid.FIELD_STATUS, "not-draft").build()); - - assertThrows(TechnicalException.class, this::validateBescheidItem); - } - - @Test - void shouldValidateBescheidItem() { - when(attachedItemService.getItem(any())).thenReturn(AttachedItemTestFactory.createBescheid()); - - assertDoesNotThrow(this::validateBescheidItem); - } - - void validateBescheidItem() { - service.validateBescheidItem(AttachedItemTestFactory.ID); - } - } - - @Nested - class TestBuildCreateDocumentOzgCommand { - - private static final Map<String, Object> BODY_OBJECT = Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID); - - @Test - void shouldSetOrder() { - var ozgCommand = service.buildCreateDocumentOzgCommand(command, BODY_OBJECT); - - assertThat(ozgCommand.getOrder()).isEqualTo(DocumentService.CREATE_ATTACHED_ITEM_ORDER); - } - - @Test - void shouldCallVorgangIdMapper() { - service.buildCreateDocumentOzgCommand(command, BODY_OBJECT); - - verify(commandMapper).toOzgCloudVorgangId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetVorgangId() { - var expectedVorgangId = OzgCloudVorgangId.from("vorgang-id"); - when(commandMapper.toOzgCloudVorgangId(any())).thenReturn(expectedVorgangId); - - var ozgCommand = buildCreateDocumentOzgCommand(); - - assertThat(ozgCommand.getVorgangId()).isEqualTo(expectedVorgangId); - } - - @Test - void shouldCallRelationIdMapper() { - buildCreateDocumentOzgCommand(); - - verify(commandMapper).mapRelationId(CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetRelationId() { - var expectedRelationId = GenericId.from("relation-id"); - when(commandMapper.mapRelationId(any())).thenReturn(expectedRelationId); - - var ozgCommand = buildCreateDocumentOzgCommand(); - - assertThat(ozgCommand.getRelationId()).isEqualTo(expectedRelationId); - } - - @Test - void shouldSetBodyObject() { - var ozgCommand = buildCreateDocumentOzgCommand(); - - assertThat(ozgCommand.getBodyObject()).isEqualTo(BODY_OBJECT); - } - - private OzgCloudCommand buildCreateDocumentOzgCommand() { - return service.buildCreateDocumentOzgCommand(command, BODY_OBJECT); - } - } - - @Nested - class TestBuildAttachedItem { - - private static final Map<String, Object> ITEM_MAP = Map.of("key", "value"); - - @Test - void shouldSetVorgangId() { - var attachedItem = buildAttachedItem(); - - assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_VORGANG_ID, CommandTestFactory.VORGANG_ID); - } - - @Test - void shouldSetClient() { - var attachedItem = buildAttachedItem(); - - assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_CLIENT, - BescheidCallContextAttachingInterceptor.BESCHEID_MANAGER_CLIENT_NAME); - } - - @Test - void shouldSetItemName() { - var attachedItem = buildAttachedItem(); - - assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_ITEM_NAME, DocumentService.DOCUMENT_ITEM_NAME); - } - - @Test - void shouldSetItem() { - var attachedItem = buildAttachedItem(); - - assertThat(attachedItem).containsEntry(AttachedItem.PROPERTY_ITEM, ITEM_MAP); - } - - private Map<String, Object> buildAttachedItem() { - return service.buildAttachedItem(command, ITEM_MAP); - } - } - - @Nested - class TestBuildItemMap { - - @Nested - class TestBuildFromCommand { - - private Command command = CommandTestFactory.createBuilder().relationId(RELATION_ID) - .bodyObject(Map.of(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID)).build(); - - @Test - void shouldDetDocumentType() { - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE); - } - - @Test - void shouldSetDocumentFile() { - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, FILE_ID); - } - - @Test - void shouldThrowExceptionIfDocumentFileIsMissing() { - command = CommandTestFactory.createBuilder().bodyObject(Map.of()).build(); - - assertThrows(TechnicalException.class, () -> service.buildItemMap(command)); - } - - private Map<String, Object> buildItemMap() { - return service.buildItemMap(command); - } - } - - @Nested - class TestBuildFromBescheid { - - private BescheidResponse bescheid = BescheidResponseTestFactory.create() - .withBescheidFileId(FileId.from(DocumentTestFactory.ID)); - - @Test - void shouldDetDocumentType() { - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_TYPE, DocumentService.DOCUMENT_TYPE); - } - - @Test - void shouldSetDocumentFile() { - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_DOCUMENT_FILE, DocumentTestFactory.ID); - } - - @Test - void shouldSetNachrichtText() { - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_NACHRICHT_TEXT, BescheidTestFactory.NACHRICHT_TEXT); - } - - @Test - void shouldSetEmptyNachrichtText() { - bescheid = BescheidResponseTestFactory.createBuilder() - .bescheidFileId(FileId.from(DocumentTestFactory.ID)) - .nachrichtText(Optional.empty()).build(); - - var itemMap = buildItemMap(); - - assertThat(itemMap).containsEntry(DocumentService.FIELD_NACHRICHT_TEXT, StringUtils.EMPTY); - } - - @Test - void shouldThrowExceptionIfFileIdMissing() { - bescheid = BescheidResponseTestFactory.createBuilder().bescheidFileId(null).build(); - - assertThrows(TechnicalException.class, () -> service.buildItemMap(bescheid)); - - } - - private Map<String, Object> buildItemMap() { - return service.buildItemMap(bescheid); - } - } - } - - @Nested - class TestGetDocument { - - @Test - void shouldCallAttachedItemService() { - service.getDocument(AttachedItemTestFactory.ID); - - verify(attachedItemService).getItem(AttachedItemTestFactory.ID); - } - - @Test - void shouldCallDocumentMapper() { - var expectedItem = AttachedItemTestFactory.createDocument(); - when(attachedItemService.getItem(any())).thenReturn(expectedItem); - - service.getDocument(AttachedItemTestFactory.ID); - - verify(documentMapper).fromAttachedItem(expectedItem); - } - - @Test - void shouldReturnDocument() { - var expectedDocument = DocumentTestFactory.create(); - when(documentMapper.fromAttachedItem(any())).thenReturn(expectedDocument); - - Document document = service.getDocument(AttachedItemTestFactory.ID); - - assertThat(document).isEqualTo(expectedDocument); - } - } -} \ No newline at end of file diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestApplication.java b/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestApplication.java deleted file mode 100644 index 17cd3a9c6e7af0044f5417041e992cc3e38adb0e..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/DocumentTestApplication.java +++ /dev/null @@ -1,8 +0,0 @@ -package de.ozgcloud.document; - -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class DocumentTestApplication { - -} diff --git a/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java b/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java deleted file mode 100644 index 5c56530f7b13a986c3cd6fd0914bfc9201d152b7..0000000000000000000000000000000000000000 --- a/bescheid-manager/src/test/java/de/ozgcloud/document/GrpcDocumentTestFactory.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.document; - -public class GrpcDocumentTestFactory { - - public static GrpcDocument create() { - return createBuilder().build(); - } - - public static GrpcDocument.Builder createBuilder() { - return GrpcDocument.newBuilder() - .setId(DocumentTestFactory.ID) - .setType(DocumentTestFactory.TYPE) - .setFileId(DocumentTestFactory.DOCUMENT_FILE) - .setNachrichtSubject(DocumentTestFactory.NACHRICHT_SUBJECT) - .setNachrichtText(DocumentTestFactory.NACHRICHT_TEXT); - } -} diff --git a/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto b/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto index 3c6990c88bbc2b9194a1927b3347dc12902fe867..5cccab4c813af190aaf8f3429704c9a4e0c189d4 100644 --- a/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto +++ b/vorgang-manager-interface/src/main/protobuf/bescheid.model.proto @@ -30,22 +30,27 @@ option java_package = "de.ozgcloud.bescheid"; option java_outer_classname = "BescheidModelProto"; message GrpcGetBescheidDraftRequest { + option deprecated = true; string vorgangId = 1; } message GrpcGetBescheidDraftResponse { + option deprecated = true; GrpcBescheid bescheid = 1; } message GrpcGetAllBescheidRequest { + option deprecated = true; string vorgangId = 1; } message GrpcGetAllBescheidResponse { + option deprecated = true; repeated GrpcBescheid bescheid = 1; } message GrpcBescheid { + option deprecated = true; string beschiedenAm = 1; bool bewilligt = 2; string bescheidDocument = 3; @@ -60,26 +65,33 @@ message GrpcBescheid { } message GrpcSentInfo { + option deprecated = true; string sentBy = 1; string sentAt = 2; } -message GrpcBescheidManagerConfigRequest {} +message GrpcBescheidManagerConfigRequest { + option deprecated = true; +} message GrpcBescheidManagerConfigResponse { + option deprecated = true; string version = 1; string javaVersion = 2; GrpcBescheidManagerFeatures features = 3; } message GrpcBescheidManagerFeatures { + option deprecated = true; bool canCreateBescheidDocument = 1; } message GrpcGetBescheidRequest { + option deprecated = true; string id = 1; -} +} message GrpcGetBescheidResponse { + option deprecated = true; GrpcBescheid bescheid = 1; } \ No newline at end of file diff --git a/vorgang-manager-interface/src/main/protobuf/bescheid.proto b/vorgang-manager-interface/src/main/protobuf/bescheid.proto index e99d06390e5aab694b512cac8cd4edd8b5a72f2f..651753870794b89cc0e13b8fcc1b719c0eccf957 100644 --- a/vorgang-manager-interface/src/main/protobuf/bescheid.proto +++ b/vorgang-manager-interface/src/main/protobuf/bescheid.proto @@ -33,14 +33,18 @@ option java_outer_classname = "BescheidProto"; service BescheidService { rpc getBescheidDraft(GrpcGetBescheidDraftRequest) returns (GrpcGetBescheidDraftResponse) { + option deprecated = true; } rpc getAll(GrpcGetAllBescheidRequest) returns (GrpcGetAllBescheidResponse) { + option deprecated = true; } rpc getConfig(GrpcBescheidManagerConfigRequest) returns (GrpcBescheidManagerConfigResponse) { + option deprecated = true; } - + rpc getBescheid(GrpcGetBescheidRequest) returns (GrpcGetBescheidResponse) { + option deprecated = true; } } \ No newline at end of file diff --git a/vorgang-manager-interface/src/main/protobuf/document.model.proto b/vorgang-manager-interface/src/main/protobuf/document.model.proto deleted file mode 100644 index ff0025a2197b3ba328547cd595f741ea95852310..0000000000000000000000000000000000000000 --- a/vorgang-manager-interface/src/main/protobuf/document.model.proto +++ /dev/null @@ -1,46 +0,0 @@ -/* - * 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. - */ - syntax = "proto3"; - - package de.ozgcloud.document; - - option java_multiple_files = true; - option java_package = "de.ozgcloud.document"; - option java_outer_classname = "DocumentModelProto"; - -message GrpcGetDocumentRequest { - string id = 1; -} - -message GrpcGetDocumentResponse { - GrpcDocument document = 1; -} - -message GrpcDocument { - string id = 1; - string type = 2; - string fileId = 3; - string nachrichtSubject = 4; - string nachrichtText = 5; -} \ No newline at end of file diff --git a/vorgang-manager-interface/src/main/protobuf/document.proto b/vorgang-manager-interface/src/main/protobuf/document.proto deleted file mode 100644 index c2a903373b229e3461932fa15e50706a9e5b41af..0000000000000000000000000000000000000000 --- a/vorgang-manager-interface/src/main/protobuf/document.proto +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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. - */ -syntax = "proto3"; - -package de.ozgcloud.document; - -import "document.model.proto"; - -option java_multiple_files = true; -option java_package = "de.ozgcloud.document"; -option java_outer_classname = "DocumentProto"; - -service DocumentService { - rpc GetDocument(GrpcGetDocumentRequest) returns (GrpcGetDocumentResponse) {} -} \ No newline at end of file diff --git a/vorgang-manager-server/pom.xml b/vorgang-manager-server/pom.xml index 83502549b29c99a6e0fb61484d5a3a91f13d6911..115f3752120a42855fe6fade78fba0e1c6267d0c 100644 --- a/vorgang-manager-server/pom.xml +++ b/vorgang-manager-server/pom.xml @@ -54,6 +54,7 @@ <user-manager-interface.version>2.9.0</user-manager-interface.version> <bescheid-manager.version>1.20.0-SNAPSHOT</bescheid-manager.version> + <document-manager.version>1.0.0-PR-1-SNAPSHOT</document-manager.version> <processor-manager.version>0.4.1</processor-manager.version> <nachrichten-manager.version>2.13.0-SNAPSHOT</nachrichten-manager.version> <ozgcloud-starter.version>0.12.0</ozgcloud-starter.version> @@ -91,6 +92,17 @@ <version>${nachrichten-manager.version}</version> </dependency> + <dependency> + <groupId>de.ozgcloud.document</groupId> + <artifactId>document-manager-server</artifactId> + <version>${document-manager.version}</version> + </dependency> + <dependency> + <groupId>de.ozgcloud.document</groupId> + <artifactId>document-manager-interface</artifactId> + <version>${document-manager.version}</version> + </dependency> + <dependency> <groupId>de.ozgcloud.vorgang</groupId> <artifactId>vorgang-manager-interface</artifactId> @@ -454,4 +466,4 @@ </snapshotRepository> </distributionManagement> -</project> +</project> \ No newline at end of file