content = Map.of("data", "test");
+ Configuration configuration = new Configuration(Configuration.VERSION_2_3_30);
+ configuration.setClassForTemplateLoading(this.getClass(), "/templates/");
+ when(this.freeMarkerConfigurer.getConfiguration()).thenReturn(configuration);
+
+ final String result = this.emailApi.getBodyFromTemplate(templateName, content);
+
+ assertThat(result.contains("test")).isTrue();
+ }
+
+ @Test
+ void testGetEmailBodyFromTemplate() {
+ when(this.resourceLoader.getResource(anyString())).thenReturn(this.getResourceForText("This is a test mail", true));
+
+ final String templatePath = "bausteine/mail/email-logo.png";
+ final String result = this.emailApi.getEmailBodyFromTemplate(templatePath, Map.of());
+
+ assertThat(result).isEqualTo("This is a test mail");
+ }
+
+ @Test
+ void testGetEmailBodyFromTemplateWithContent() {
+ when(this.resourceLoader.getResource(anyString())).thenReturn(this.getResourceForText("This is a test mail with content", true));
+
+ final String templatePath = "bausteine/mail/email-logo.png";
+ final String result = this.emailApi.getEmailBodyFromTemplate(templatePath, Map.of("content", "some content"));
+
+ assertThat(result).isEqualTo("This is a test mail with some content");
+ }
+
+ @Test
+ void testGetEmailBodyFromTemplateWithContentAndNewLines() {
+ when(this.resourceLoader.getResource(anyString())).thenReturn(this.getResourceForText("This is a test mail with content", true));
+
+ final String templatePath = "bausteine/mail/email-logo.png";
+ final String result = this.emailApi.getEmailBodyFromTemplate(templatePath, Map.of("content", "some content \n with new line"));
+
+ assertThat(result).isEqualTo("This is a test mail with some content
with new line");
+ }
+
+ @Test
+ void testGetEmailBodyFromTemplateWithContentFailsIfTemplateDoesNotExist() {
+ when(this.resourceLoader.getResource(anyString())).thenReturn(this.getResourceForText("foo bar", false));
+
+ final String templatePath = "some/temlate/that/does/not/exist";
+ assertThatThrownBy(() -> {
+ this.emailApi.getEmailBodyFromTemplate(templatePath, Map.of("content", "some content"));
+ })
+ .isInstanceOf(RuntimeException.class)
+ .hasMessageContaining("Email Template not found: " + templatePath);
+ }
+
+ private Resource getResourceForText(final String text, final boolean resourceExists) {
+ return new Resource() {
+ @Override
+ public boolean exists() {
+ return resourceExists;
+ }
+
+ @Override
+ public URL getURL() throws IOException {
+ return null;
+ }
+
+ @Override
+ public URI getURI() throws IOException {
+ return null;
+ }
+
+ @Override
+ public File getFile() throws IOException {
+ return null;
+ }
+
+ @Override
+ public long contentLength() throws IOException {
+ return 0;
+ }
+
+ @Override
+ public long lastModified() throws IOException {
+ return 0;
+ }
+
+ @Override
+ public Resource createRelative(String relativePath) throws IOException {
+ return null;
+ }
+
+ @Override
+ public String getFilename() {
+ return "test.txt";
+ }
+
+ @Override
+ public String getDescription() {
+ return null;
+ }
+
+ @Override
+ public InputStream getInputStream() throws IOException {
+ return new ByteArrayInputStream(text.getBytes());
+ }
+ };
+ }
+
+}
diff --git a/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-api/src/test/resources/templates/test-template.ftl b/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-api/src/test/resources/templates/test-template.ftl
new file mode 100644
index 00000000..1e47f8a2
--- /dev/null
+++ b/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-api/src/test/resources/templates/test-template.ftl
@@ -0,0 +1,9 @@
+
+
+
+ Titel
+
+
+ Zweck dieser E-Mail ist ein ${data}
+
+
diff --git a/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/pom.xml b/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/pom.xml
new file mode 100644
index 00000000..a4251084
--- /dev/null
+++ b/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/pom.xml
@@ -0,0 +1,29 @@
+
+
+ 4.0.0
+
+ de.muenchen.refarch
+ refarch-email
+ 1.1.0-SNAPSHOT
+
+
+ refarch-email-starter
+
+
+
+ de.muenchen.refarch
+ refarch-email-api
+ ${project.version}
+
+
+ org.springframework.boot
+ spring-boot
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+
+
diff --git a/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/src/main/java/de/muenchen/refarch/email/configuration/EmailAutoConfiguration.java b/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/src/main/java/de/muenchen/refarch/email/configuration/EmailAutoConfiguration.java
new file mode 100644
index 00000000..976b08cd
--- /dev/null
+++ b/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/src/main/java/de/muenchen/refarch/email/configuration/EmailAutoConfiguration.java
@@ -0,0 +1,63 @@
+package de.muenchen.refarch.email.configuration;
+
+import de.muenchen.refarch.email.api.EmailApi;
+import de.muenchen.refarch.email.impl.EmailApiImpl;
+import de.muenchen.refarch.email.properties.CustomMailProperties;
+import jakarta.mail.MessagingException;
+import java.util.Properties;
+import lombok.RequiredArgsConstructor;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.mail.MailProperties;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.core.io.ResourceLoader;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
+
+@RequiredArgsConstructor
+@EnableConfigurationProperties({ MailProperties.class, CustomMailProperties.class })
+public class EmailAutoConfiguration {
+
+ private final MailProperties mailProperties;
+ private final CustomMailProperties customMailProperties;
+
+ /**
+ * Configures the {@link JavaMailSender}
+ *
+ * @return configured JavaMailSender
+ */
+ @Bean
+ @ConditionalOnMissingBean
+ public JavaMailSender getJavaMailSender() throws MessagingException {
+ final JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
+ mailSender.setHost(this.mailProperties.getHost());
+ mailSender.setPort(this.mailProperties.getPort());
+ mailSender.setProtocol(this.mailProperties.getProtocol());
+ mailSender.setUsername(this.mailProperties.getUsername());
+ mailSender.setPassword(this.mailProperties.getPassword());
+
+ final Properties props = mailSender.getJavaMailProperties();
+ props.putAll(this.mailProperties.getProperties());
+ mailSender.setJavaMailProperties(props);
+ mailSender.testConnection();
+ return mailSender;
+ }
+
+ @ConditionalOnMissingBean
+ @Bean
+ public EmailApi emailApi(final ResourceLoader resourceLoader, final JavaMailSender javaMailSender,
+ final FreeMarkerConfigurer freeMarkerConfigurer) {
+ return new EmailApiImpl(javaMailSender, resourceLoader, freeMarkerConfigurer, this.customMailProperties.getFromAddress(),
+ this.customMailProperties.getDefaultReplyToAddress());
+ }
+
+ @Bean
+ @ConditionalOnMissingBean
+ public FreeMarkerConfigurer freemarkerConfig() {
+ FreeMarkerConfigurer freeMarkerConfigurer = new FreeMarkerConfigurer();
+ freeMarkerConfigurer.setTemplateLoaderPath("classpath:templates/");
+ return freeMarkerConfigurer;
+ }
+
+}
diff --git a/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/src/main/java/de/muenchen/refarch/email/properties/CustomMailProperties.java b/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/src/main/java/de/muenchen/refarch/email/properties/CustomMailProperties.java
new file mode 100644
index 00000000..af903421
--- /dev/null
+++ b/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/src/main/java/de/muenchen/refarch/email/properties/CustomMailProperties.java
@@ -0,0 +1,20 @@
+package de.muenchen.refarch.email.properties;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@Data
+@ConfigurationProperties(prefix = "refarch.mail")
+public class CustomMailProperties {
+
+ /**
+ * Sender mail address.
+ */
+ private String fromAddress;
+
+ /**
+ * Default Reply-to mail address, e.g. no-reply@domain
+ */
+ private String defaultReplyToAddress;
+
+}
diff --git a/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
new file mode 100644
index 00000000..e67a5bac
--- /dev/null
+++ b/refarch-integrations/refarch-email-integration/refarch-email/refarch-email-starter/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -0,0 +1 @@
+de.muenchen.refarch.email.configuration.EmailAutoConfiguration
diff --git a/refarch-integrations/refarch-s3-integration/pom.xml b/refarch-integrations/refarch-s3-integration/pom.xml
index 3842928e..a94fa86f 100644
--- a/refarch-integrations/refarch-s3-integration/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/pom.xml
@@ -1,7 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-client-core/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-client-core/pom.xml
index b9540802..0999d145 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-client-core/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-client-core/pom.xml
@@ -1,6 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-core/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-core/pom.xml
index 794be141..b23d2b3e 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-core/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-core/pom.xml
@@ -1,6 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/pom.xml
index 626362c2..62a59c94 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/pom.xml
@@ -1,7 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/refarch-s3-integration-java-client-starter/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/refarch-s3-integration-java-client-starter/pom.xml
index 1c4a5cd8..f8b1c71a 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/refarch-s3-integration-java-client-starter/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/refarch-s3-integration-java-client-starter/pom.xml
@@ -1,7 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/refarch-s3-integration-java-client/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/refarch-s3-integration-java-client/pom.xml
index 8b9d9ef2..ddbb1cec 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/refarch-s3-integration-java-client/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-java/refarch-s3-integration-java-client/pom.xml
@@ -1,6 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/pom.xml
index e3e2b057..745d983a 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/pom.xml
@@ -1,7 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-client-starter/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-client-starter/pom.xml
index e64f703c..9983ae1d 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-client-starter/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-client-starter/pom.xml
@@ -1,7 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-client/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-client/pom.xml
index dd5eb796..03bc4722 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-client/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-client/pom.xml
@@ -1,6 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-core/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-core/pom.xml
index 97f0d0fd..d7e77e38 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-core/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-core/pom.xml
@@ -1,6 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-service/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-service/pom.xml
index ead10a9c..4faf9536 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-service/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-service/pom.xml
@@ -1,7 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-starter/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-starter/pom.xml
index 7c2205e7..78b56ead 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-starter/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-rest/refarch-s3-integration-rest-starter/pom.xml
@@ -1,7 +1,5 @@
-
+
4.0.0
diff --git a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-starter/pom.xml b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-starter/pom.xml
index 8394b713..1820a0eb 100644
--- a/refarch-integrations/refarch-s3-integration/refarch-s3-integration-starter/pom.xml
+++ b/refarch-integrations/refarch-s3-integration/refarch-s3-integration-starter/pom.xml
@@ -1,7 +1,5 @@
-
+
4.0.0
diff --git a/stack/docker-compose-refarch-base.yml b/stack/docker-compose-refarch-base.yml
index 1dbb07d1..617882fa 100644
--- a/stack/docker-compose-refarch-base.yml
+++ b/stack/docker-compose-refarch-base.yml
@@ -98,7 +98,7 @@ services:
refarch-gateway:
container_name: refarch-gateway
- image: ghcr.io/it-at-m/refarch/refarch-gateway:1.0.0@sha256:78af746de560bae737e2ea476bd1759f4dd360ff9f2bb7647b8ed27599ed66ed
+ image: ghcr.io/it-at-m/refarch/refarch-gateway:1.1.0@sha256:a1313ada8f2a5cfc73fe2adb2bd11f0db5717f3a07dc0482b6ad7d00a9509bb1
depends_on:
init-keycloak:
condition: service_completed_successfully