Skip to content
Snippets Groups Projects
Commit 4c82b26c authored by OZGCloud's avatar OZGCloud
Browse files

OZG-5645 outsource notification-manager

parent 30b92b8b
No related branches found
No related tags found
No related merge requests found
Showing
with 0 additions and 1066 deletions
#
# 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.
#
lombok.log.fieldName=LOG
lombok.log.slf4j.flagUsage = ERROR
lombok.log.log4j.flagUsage = ERROR
lombok.data.flagUsage = ERROR
lombok.nonNull.exceptionType = IllegalArgumentException
lombok.addLombokGeneratedAnnotation = true
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<!--
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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>de.ozgcloud.common</groupId>
<artifactId>ozgcloud-common-parent</artifactId>
<version>4.0.1</version>
<relativePath/>
</parent>
<groupId>de.ozgcloud.notification</groupId>
<artifactId>notification-manager</artifactId>
<version>2.7.0-SNAPSHOT</version>
<name>OZG-Cloud Notification Manager</name>
<properties>
<user-manager-interface.version>2.0.0</user-manager-interface.version>
<ozgcloud.license.version>1.6.0</ozgcloud.license.version>
</properties>
<dependencies>
<dependency>
<groupId>de.ozgcloud.vorgang</groupId>
<artifactId>vorgang-manager-interface</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>de.ozgcloud.vorgang</groupId>
<artifactId>vorgang-manager-utils</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>de.ozgcloud.command</groupId>
<artifactId>command-manager</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>de.ozgcloud.user</groupId>
<artifactId>user-manager-interface</artifactId>
<version>${user-manager-interface.version}</version>
<exclusions>
<exclusion>
<groupId>io.grpc</groupId>
<artifactId>grpc-core</artifactId>
</exclusion>
<exclusion>
<groupId>org.jboss.slf4j</groupId>
<artifactId>slf4j-jboss-logmanager</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
</dependency>
<dependency>
<groupId>net.devh</groupId>
<artifactId>grpc-client-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<!-- tools -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</dependency>
<!-- Test -->
<dependency>
<groupId>de.ozgcloud.vorgang</groupId>
<artifactId>vorgang-manager-utils</artifactId>
<version>${project.version}</version>
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.mycila</groupId>
<artifactId>license-maven-plugin</artifactId>
<configuration>
<mapping>
<config>SCRIPT_STYLE</config>
</mapping>
<licenseSets>
<licenseSet>
<header>license/eupl_v1_2_de/header.txt</header>
<excludes>
<exclude>**/README</exclude>
<exclude>src/test/resources/**</exclude>
<exclude>src/main/resources/**</exclude>
</excludes>
</licenseSet>
</licenseSets>
</configuration>
<dependencies>
<dependency>
<groupId>de.ozgcloud.common</groupId>
<artifactId>ozgcloud-common-license</artifactId>
<version>${ozgcloud.license.version}</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
/*
* 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.notification;
import static de.ozgcloud.common.grpc.GrpcUtil.*;
import java.util.UUID;
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;
public class NotificationManagerCallContextAttachingInterceptor implements ClientInterceptor {
static final String KEY_USER_ID = "USER_ID-bin";
static final String KEY_CLIENT_NAME = "CLIENT_NAME-bin";
static final String KEY_REQUEST_ID = "REQUEST_ID-bin";
public static final String NOTIFICATION_MANAGER_CLIENT_NAME = "OzgCloud_NotificationManager";
static final String NOTIFICATION_MANAGER_SENDER_USER_ID = "system-notification_manager-new_vorgang";
// <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();
metadata.put(createKeyOf(KEY_USER_ID), NOTIFICATION_MANAGER_SENDER_USER_ID.getBytes());
metadata.put(createKeyOf(KEY_CLIENT_NAME), NOTIFICATION_MANAGER_CLIENT_NAME.getBytes());
metadata.put(createKeyOf(KEY_REQUEST_ID), generateRequestId().getBytes());
return metadata;
}
// TODO OZG-1974 requestId zentraler erzeugen
private String generateRequestId() {
return UUID.randomUUID().toString();
}
}
}
/*
* 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.notification.antragsteller;
import java.util.Objects;
import java.util.Optional;
import java.util.function.Predicate;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;
import de.ozgcloud.command.VorgangCreatedEvent;
import de.ozgcloud.notification.postfach.PostfachService;
import de.ozgcloud.notification.vorgang.Vorgang;
import de.ozgcloud.notification.vorgang.VorgangId;
import de.ozgcloud.notification.vorgang.VorgangService;
import lombok.extern.log4j.Log4j2;
@Component
@Log4j2
public class AntragstellerNotificationEventListener {
static final String FS_FORMENGINE_NAME = "FormSolutions";
static final String POSTFACH_NOT_CONFIGURED_MESSAGE = "Postfach is not configured. Antragsteller notifications will not be sent.";
private static final Predicate<Vorgang> EXISTS_POSTFACH_ID = vorgang -> StringUtils.isNoneBlank(vorgang.getPostfachId());
private static final Predicate<Vorgang> EXISTS_POSTFACH_ADDRESS = vorgang -> Objects.nonNull(vorgang.getPostfachAddress());
private static final Predicate<Vorgang> IS_FORMSOLUTIONS_FORM_ENGINE = vorgang -> StringUtils.equals(vorgang.getFormEngineName(),
FS_FORMENGINE_NAME);
private static final Predicate<Vorgang> SHOULD_SEND_NOTIFICATION = vorgang -> //
(EXISTS_POSTFACH_ID.test(vorgang) || EXISTS_POSTFACH_ADDRESS.test(vorgang)) && IS_FORMSOLUTIONS_FORM_ENGINE.test(vorgang);
@Autowired
private AntragstellerNotificationService service;
@Autowired
private VorgangService vorgangService;
@Autowired
private PostfachService postfachService;
private Optional<Boolean> isPostfachConfigured = Optional.empty();
@EventListener
public void onVorgangCreated(VorgangCreatedEvent event) {
if (isPostfachConfigured()) {
sendIfRequired(vorgangService.getVorgang(VorgangId.from(event.getSource())));
} else {
LOG.debug(POSTFACH_NOT_CONFIGURED_MESSAGE);
}
}
boolean isPostfachConfigured() {
return isPostfachConfigured.orElseGet(this::fetchIsPostfachConfigured);
}
synchronized boolean fetchIsPostfachConfigured() {
return isPostfachConfigured.orElseGet(() -> {
var isConfigured = postfachService.isPostfachConfigured();
if (!isConfigured) {
LOG.warn(POSTFACH_NOT_CONFIGURED_MESSAGE);
}
isPostfachConfigured = Optional.of(isConfigured);
return isConfigured;
});
}
private void sendIfRequired(Vorgang vorgang) {
if (SHOULD_SEND_NOTIFICATION.test(vorgang)) {
service.sendNotification(vorgang);
}
}
}
/*
* 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.notification.antragsteller;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Objects;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.ozgcloud.common.errorhandling.TechnicalException;
import de.ozgcloud.notification.command.CommandService;
import de.ozgcloud.notification.postfach.PostfachNachricht;
import de.ozgcloud.notification.vorgang.Vorgang;
@Service
class AntragstellerNotificationService {
private static final String TEMPLATE_FILE = "antragsteller.notificationTemplate.txt";
private static final String SUBJECT_TEMPLATE = "Eingangsbestätigung %s";
private static final String TIMEZONE = "Europe/Berlin";
private static final String DATETIME_FORMAT = "dd.MM.yyyy HH:mm:ss";
@Autowired
private CommandService commandService;
public void sendNotification(Vorgang vorgang) {
commandService.createSendPostfachNachrichtCommand(buildPostfachNachricht(vorgang));
}
PostfachNachricht buildPostfachNachricht(Vorgang vorgang) {
return PostfachNachricht.builder()
.vorgangId(vorgang.getId())
.postfachId(vorgang.getPostfachId())
.postfachAddress(vorgang.getPostfachAddress())
.mailBody(formatMessage(vorgang))
.subject(formatSubject(vorgang))
.build();
}
String formatMessage(Vorgang vorgang) {
return String.format(loadTemplate(),
vorgang.getCreatedAt().withZoneSameInstant(ZoneId.of(TIMEZONE)).format(DateTimeFormatter.ofPattern(DATETIME_FORMAT)),
vorgang.getVorgangNummer());
}
private String loadTemplate() {
var templateInStream = AntragstellerNotificationService.class.getClassLoader().getResourceAsStream(TEMPLATE_FILE);
if (Objects.isNull(templateInStream)) {
throw new TechnicalException("Cannot find template file " + TEMPLATE_FILE);
}
try {
return IOUtils.toString(templateInStream, StandardCharsets.UTF_8);
} catch (IOException e) {
throw new TechnicalException("Error reading template file", e);
}
}
String formatSubject(Vorgang vorgang) {
return String.format(SUBJECT_TEMPLATE, vorgang.getVorgangName());
}
}
/*
* 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.notification.command;
import java.util.Map;
import de.ozgcloud.notification.vorgang.VorgangId;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
class Command {
enum CommandOrder {
SEND_POSTFACH_NACHRICHT
}
private VorgangId vorgangId;
private String relationId;
private CommandOrder order;
private Map<String, Object> body;
}
/*
* 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.notification.command;
public interface CommandBody {
}
/*
* 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.notification.command;
import java.util.Optional;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import de.ozgcloud.notification.vorgang.VorgangId;
import de.ozgcloud.vorgang.common.grpc.GrpcObjectMapper;
import de.ozgcloud.vorgang.grpc.command.GrpcCreateCommandRequest;
@Mapper(uses = GrpcObjectMapper.class)
interface CommandMapper {
@Mapping(target = "mergeFrom", ignore = true)
@Mapping(target = "clearField", ignore = true)
@Mapping(target = "clearOneof", ignore = true)
@Mapping(target = "mergeBodyObj", ignore = true)
@Mapping(target = "mergeCallContext", ignore = true)
@Mapping(target = "mergeRedirectRequest", ignore = true)
@Mapping(target = "mergeUnknownFields", ignore = true)
@Mapping(target = "removeBody", ignore = true)
@Mapping(target = "callContext", ignore = true)
@Mapping(target = "orderStringBytes", ignore = true)
@Mapping(target = "order", ignore = true)
@Mapping(target = "orderValue", ignore = true)
@Mapping(target = "redirectRequest", ignore = true)
@Mapping(target = "relationIdBytes", ignore = true)
@Mapping(target = "relationVersion", ignore = true)
@Mapping(target = "unknownFields", ignore = true)
@Mapping(target = "vorgangIdBytes", ignore = true)
@Mapping(target = "allFields", ignore = true)
@Mapping(target = "bodyBuilderList", ignore = true)
@Mapping(target = "bodyList", ignore = true)
@Mapping(target = "bodyOrBuilderList", ignore = true)
@Mapping(target = "bodyObj", source = "body")
@Mapping(target = "orderString", source = "order")
GrpcCreateCommandRequest toGrpcRequest(Command command);
default String toString(VorgangId vorgangId) {
return Optional.ofNullable(vorgangId)
.map(VorgangId::toString)
.orElse(null);
}
}
/*
* 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.notification.command;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.ozgcloud.vorgang.grpc.command.CommandServiceGrpc.CommandServiceBlockingStub;
import de.ozgcloud.notification.NotificationManagerCallContextAttachingInterceptor;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service
class CommandRemoteService {
@GrpcClient("pluto")
private CommandServiceBlockingStub stub;
@Autowired
private CommandMapper mapper;
public void createCommand(Command command) {
stub.withInterceptors(new NotificationManagerCallContextAttachingInterceptor()).createCommand(mapper.toGrpcRequest(command));
}
}
/*
* 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.notification.command;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.function.Predicate;
import org.apache.commons.beanutils.BeanMap;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.ozgcloud.notification.command.Command.CommandOrder;
import de.ozgcloud.notification.postfach.PostfachAddress;
import de.ozgcloud.notification.postfach.PostfachAddressIdentifier;
import de.ozgcloud.notification.postfach.PostfachNachricht;
import de.ozgcloud.notification.postfach.StringBasedIdentifier;
@Service("notificationCommandService")
public class CommandService {
private static final Predicate<Entry<Object, Object>> IS_NOT_CLASS_KEY = entry -> !StringUtils.equals(entry.getKey().toString(), "class");
@Autowired
private CommandRemoteService commandRemoteService;
public void createSendPostfachNachrichtCommand(PostfachNachricht nachricht) {
commandRemoteService.createCommand(buildCommand(nachricht));
}
Command buildCommand(PostfachNachricht nachricht) {
return Command.builder()
.vorgangId(nachricht.getVorgangId())
.relationId(nachricht.getVorgangId().toString())
.order(CommandOrder.SEND_POSTFACH_NACHRICHT)
.body(toMap(nachricht))
.build();
}
Map<String, Object> toMap(PostfachNachricht nachricht) {
var result = new HashMap<String, Object>();
new BeanMap(nachricht).entrySet().stream()
.filter(entry -> Objects.nonNull(entry.getValue()))
.filter(IS_NOT_CLASS_KEY)
.forEach(entry -> result.put(entry.getKey().toString(), getValue(entry.getValue())));
return Collections.unmodifiableMap(result);
}
private Object getValue(Object value) {
if (value instanceof PostfachAddress postfachAddress) {
return buildPostfachAddressMap(postfachAddress);
}
return value;
}
private Map<String, Object> buildPostfachAddressMap(PostfachAddress postfachAddress){
return Map.of(PostfachAddress.TYPE_FIELD, postfachAddress.getType(),
PostfachAddress.VERSION_FIELD, postfachAddress.getVersion(),
PostfachAddress.IDENTIFIER_FIELD, buildPostfachAddressIdentifierMap(postfachAddress.getIdentifier()));
}
private Map<String, Object> buildPostfachAddressIdentifierMap(PostfachAddressIdentifier identifier){
return Map.of(StringBasedIdentifier.POSTFACH_ID_FIELD, ((StringBasedIdentifier) identifier).getPostfachId());
}
}
\ No newline at end of file
/*
* 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.notification.email;
import de.ozgcloud.nachrichten.email.GrpcRecipient;
import de.ozgcloud.notification.user.Recipient;
import org.mapstruct.Mapper;
@Mapper
interface EmailRecipientMapper {
GrpcRecipient toGrpc(Recipient recipient);
}
/*
* 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.notification.email;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import de.ozgcloud.nachrichten.email.EmailServiceGrpc.EmailServiceBlockingStub;
import de.ozgcloud.nachrichten.email.GrpcRecipient;
import de.ozgcloud.nachrichten.email.GrpcSendEmailRequest;
import de.ozgcloud.notification.NotificationManagerCallContextAttachingInterceptor;
import lombok.NonNull;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service
public class EmailRemoteService {
@GrpcClient("email")
private EmailServiceBlockingStub emailServiceStub;
@Autowired
private EmailRecipientMapper recipientMapper;
public void sendEmail(@NonNull UserEmail email) {
var grpcEmailRecipients = email.recipients().stream().map(recipientMapper::toGrpc).toList();
emailServiceStub.withInterceptors(new NotificationManagerCallContextAttachingInterceptor())
.sendEmail(buildRequest(grpcEmailRecipients, email.subject(), email.body()));
}
private GrpcSendEmailRequest buildRequest(List<GrpcRecipient> grpcRecipients, String subject, String body) {
return GrpcSendEmailRequest.newBuilder().addAllRecipients(grpcRecipients).setSubject(subject).setBody(body).build();
}
}
/*
* 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.notification.email;
import de.ozgcloud.notification.user.Recipient;
import lombok.Builder;
import lombok.Singular;
import java.util.List;
@Builder
public record UserEmail(@Singular List<Recipient> recipients, String subject, String body) {
}
package de.ozgcloud.notification.postfach;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class PostfachAddress {
public static final String VERSION_FIELD = "version";
public static final String TYPE_FIELD = "type";
public static final String IDENTIFIER_FIELD = "identifier";
private String version;
private int type;
private PostfachAddressIdentifier identifier;
}
\ No newline at end of file
package de.ozgcloud.notification.postfach;
public interface PostfachAddressIdentifier {
}
/*
* 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.notification.postfach;
import de.ozgcloud.notification.command.CommandBody;
import de.ozgcloud.notification.vorgang.VorgangId;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class PostfachNachricht implements CommandBody {
static final String FIELD_VORGANG_ID = "vorgangId";
static final String FIELD_POSTFACH_ID = "postfachId";
public static final String FIELD_POSTFACH_ADDRESS = "postfachAddress";
static final String FIELD_SUBJECT = "subject";
static final String FIELD_MESSAGE = "mailBody";
static final String FIELD_REPLY_OPTION = "replyOption";
static final String DEFAULT_REPLY_OPTION = "FORBIDDEN";
private VorgangId vorgangId;
private String postfachId;
private PostfachAddress postfachAddress;
private String subject;
private String mailBody;
public String getReplyOption() {
return DEFAULT_REPLY_OPTION;
}
}
/*
* Copyright (C) 2023 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.notification.postfach;
import org.springframework.stereotype.Service;
import de.ozgcloud.nachrichten.postfach.GrpcIsPostfachConfiguredRequest;
import de.ozgcloud.nachrichten.postfach.PostfachServiceGrpc.PostfachServiceBlockingStub;
import de.ozgcloud.notification.NotificationManagerCallContextAttachingInterceptor;
import net.devh.boot.grpc.client.inject.GrpcClient;
@Service
class PostfachRemoteService {
@GrpcClient("pluto")
private PostfachServiceBlockingStub postfachServiceBlockingStub;
public boolean isPostfachConfigured() {
return getPostfachServiceStub().isPostfachConfigured(buildGrpcRequest()).getIsConfigured();
}
GrpcIsPostfachConfiguredRequest buildGrpcRequest() {
return GrpcIsPostfachConfiguredRequest.newBuilder().build();
}
PostfachServiceBlockingStub getPostfachServiceStub() {
return postfachServiceBlockingStub.withInterceptors(new NotificationManagerCallContextAttachingInterceptor());
}
}
/*
* Copyright (C) 2023 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.notification.postfach;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service("notificationPostfachService")
public class PostfachService {
@Autowired
private PostfachRemoteService postfachRemoteService;
public boolean isPostfachConfigured() {
return postfachRemoteService.isPostfachConfigured();
}
}
package de.ozgcloud.notification.postfach;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class StringBasedIdentifier implements PostfachAddressIdentifier {
public static final String POSTFACH_ID_FIELD = "postfachId";
private String postfachId;
}
\ No newline at end of file
/*
* 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.notification.user;
import lombok.Builder;
@Builder
public record Recipient(String firstName, String lastName, String email) {
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment