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

OZG-532 OZG-583 fill redirect mail body

parent ce78290b
No related branches found
No related tags found
No related merge requests found
Showing
with 342 additions and 42 deletions
......@@ -72,18 +72,22 @@
<groupId>com.thedeanda</groupId>
<artifactId>lorem</artifactId>
<version>${lorem.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.github.javafaker</groupId>
<artifactId>javafaker</artifactId>
<version>${faker.version}</version>
</dependency>
<!-- tools -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
<!-- Dev -->
<dependency>
......
......@@ -18,10 +18,8 @@ public class CreateCommandRequest {
@NotNull
private String relationId;
@NotNull
private Order order;
@NotNull
private Long relationVersion;
......
package de.itvsh.ozg.pluto.common.errorhandling;
public class TechnicalException extends RuntimeException {
private static final long serialVersionUID = 1L;
public TechnicalException(String message, Throwable cause) {
super(message, cause);
}
}
package de.itvsh.ozg.pluto.common.mail;
import javax.servlet.ServletContext;
import org.springframework.context.annotation.Bean;
import freemarker.template.Configuration;
import freemarker.template.TemplateExceptionHandler;
@org.springframework.context.annotation.Configuration
public class FreemarkerConfiguration {
@Bean
public Configuration mailFreemarkerConfiguration(ServletContext servletContext) {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_31);
cfg.setClassForTemplateLoading(getClass(), "/");
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
cfg.setLogTemplateExceptions(false);
cfg.setWrapUncheckedExceptions(true);
return cfg;
}
}
package de.itvsh.ozg.pluto.common.mail;
import java.util.Collection;
import lombok.Builder;
import lombok.Getter;
import lombok.Singular;
@Getter
@Builder
public class MailSendRequest {
private String fromAddress;
@Singular
private Collection<String> toAddresses;
private String body;
private String requestReference;
}
package de.itvsh.ozg.pluto.vorgang;
import org.mapstruct.Mapper;
@Mapper
interface VorgangMapper {
}
package de.itvsh.ozg.pluto.vorgang.redirect;
import lombok.Builder;
import lombok.Getter;
@Getter
@Builder
public class RedirectRequest {
private String email;
private String password;
}
package de.itvsh.ozg.pluto.vorgang.redirect;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.HashMap;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import de.itvsh.ozg.pluto.common.errorhandling.TechnicalException;
import de.itvsh.ozg.pluto.common.mail.MailSendRequest;
import de.itvsh.ozg.pluto.vorgang.Vorgang;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
@Service
public class RedirectService {
static final String MAIL_TEMPLATE = "mail/text/redirect.ftlh";
static final String FIELD_ANTRAGS_NAME = "antragsName";
static final String FIELD_EINGANGS_KENNZEICHEN = "eingangsKennzeichen";
@Autowired
private Configuration freemarkerCfg;
@Value("${pluto.redirect.mail-from}")
private String mailFrom;
MailSendRequest createRedirectMail(Vorgang vorgang, RedirectRequest request) {
// FIXME set command id
// TODO add attachments
return MailSendRequest.builder()
.fromAddress(mailFrom)
.toAddress(request.getEmail())
.body(fillMailTemplate(vorgang))
.build();
}
String fillMailTemplate(Vorgang vorgang) {
return fillTemplate(MAIL_TEMPLATE, buildValues(vorgang));
}
Map<String, Object> buildValues(Vorgang vorgang) {
var map = new HashMap<String, Object>();
map.put(FIELD_ANTRAGS_NAME, vorgang.getEingangs().get(0).getHeader().getFormName());
map.put(FIELD_EINGANGS_KENNZEICHEN, vorgang.getEingangs().get(0).getHeader().getRequestId());
return map;
}
private String fillTemplate(String templateName, Object dataModel) {
try (var outStream = new ByteArrayOutputStream(); var writer = new OutputStreamWriter(outStream)) {
getTemplate(templateName).process(dataModel, writer);
return new String(outStream.toByteArray());
} catch (IOException | TemplateException e) {
throw new TechnicalException("Error filling mail template", e);
}
}
Template getTemplate(String templateName) {
try {
return freemarkerCfg.getTemplate(templateName);
} catch (IOException e) {
throw new TechnicalException("Error loading mail template", e);
}
}
}
Sehr geehrte Damen und Herren,
anliegend übersende ich Ihnen zuständigkeitshalber einen Antrag ${antragsName} mit der Bitte um weitere Veranlassung.
Das Aktenzeichen lautet: ${eingangsKennzeichen}
Sollten noch Unterlagen oder Dokumente benötigt werden, teilen Sie mir das bitte kurz mit.
Für die Eingangsbestätigung bestätigen Sie bitte entweder die angeforderte Lesebestätigung oder antworten Sie kurz und formlos auf diese E-Mail.
Den Abschluss des Verfahrens bitten wir gesondert mitzuteilen. Wieder ist eine erneute Antwort auf diese E-Mail mit dem Hinweis "Verfahren abgeschlossen" ausreichend.
Mit freundlichen Grüßen
Antragsmanagement
[cid:${CONTENT_ID_1}]
einheitlicher ansprechpartner schleswig-holstein
im
[cid:${CONTENT_ID_2}]
IT Verbund Schleswig-Holstein
Anstalt öffentlichen Rechts
Reventlouallee 6
24105 Kiel
Telefon: +49 (0)431 988-8650
mailto: info@ea-sh.de
www.ea-sh.de
\ No newline at end of file
......@@ -10,7 +10,7 @@ public class EingangHeaderTestFactory {
public static final String CREATED_AT_STR = "2021-01-10T10:30:00Z";
public static final ZonedDateTime CREATED_AT = ZonedDateTime.parse(CREATED_AT_STR);
private static final String REQUEST_ID = UUID.randomUUID().toString();
public static final String REQUEST_ID = UUID.randomUUID().toString();
private static final String FORM_ID = UUID.randomUUID().toString();
public static final String FORM_NAME = LoremIpsum.getInstance().getWords(10);
private static final String SENDER = LoremIpsum.getInstance().getWords(2);
......
package de.itvsh.ozg.pluto.vorgang.redirect;
class RedirectRequestTestFactory {
static final String E_MAIL = "ich@hier.de";
static final String PASSWORD = "geheim";
public static RedirectRequest create() {
return createBuilder().build();
}
public static RedirectRequest.RedirectRequestBuilder createBuilder() {
return RedirectRequest.builder()
.email(E_MAIL)
.password(PASSWORD);
}
}
package de.itvsh.ozg.pluto.vorgang.redirect;
import static org.assertj.core.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class RedirectServiceITCase {
@Autowired
private RedirectService service;
@Test
void getRedirectTemplate() {
var template = service.getTemplate(RedirectService.MAIL_TEMPLATE);
assertThat(template).isNotNull();
}
}
package de.itvsh.ozg.pluto.vorgang.redirect;
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.mockito.InjectMocks;
import org.mockito.Spy;
import org.springframework.test.util.ReflectionTestUtils;
import de.itvsh.ozg.pluto.vorgang.EingangHeaderTestFactory;
import de.itvsh.ozg.pluto.vorgang.Vorgang;
import de.itvsh.ozg.pluto.vorgang.VorgangTestFactory;
class RedirectServiceTest {
@Spy
@InjectMocks
private RedirectService service;
@Nested
class TestFillingTemplate {
@Nested
class TestBuildValues {
private Vorgang vorgang = VorgangTestFactory.create();
@Test
void shouldCreateMap() {
var map = service.buildValues(vorgang);
assertThat(map).isNotNull().isInstanceOf(Map.class);
}
@Test
void shouldFillAntragsName() {
var map = service.buildValues(vorgang);
assertThat(map.get(RedirectService.FIELD_ANTRAGS_NAME)).isNotNull().isEqualTo(EingangHeaderTestFactory.FORM_NAME);
}
@Test
void shouldFillEingangsKennzeichen() {
var map = service.buildValues(vorgang);
assertThat(map.get(RedirectService.FIELD_EINGANGS_KENNZEICHEN)).isNotNull().isEqualTo(EingangHeaderTestFactory.REQUEST_ID);
}
}
}
@Nested
class TestCreateRedirectMail {
private static final String MAIL_FROM = "FROM ME WITH L";
private static final String BODY = "FILLED BODY";
private Vorgang vorgang = VorgangTestFactory.create();
private RedirectRequest request = RedirectRequestTestFactory.create();
@BeforeEach
void initTest() {
ReflectionTestUtils.setField(service, "mailFrom", MAIL_FROM);
doReturn(BODY).when(service).fillMailTemplate(any());
}
@Test
void shouldSetFromAddress() {
var mailSendRequest = service.createRedirectMail(vorgang, request);
assertThat(mailSendRequest.getFromAddress()).isEqualTo(MAIL_FROM);
}
@Test
void shouldSetToAddress() {
var mailSendRequest = service.createRedirectMail(vorgang, request);
assertThat(mailSendRequest.getToAddresses()).containsExactly(RedirectRequestTestFactory.E_MAIL);
}
@Test
void shouldSetBody() {
var mailSendRequest = service.createRedirectMail(vorgang, request);
verify(service).fillMailTemplate(vorgang);
assertThat(mailSendRequest.getBody()).isEqualTo(BODY);
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment