diff --git a/build.gradle b/build.gradle index d0366e2..f5d70ca 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'war' apply plugin: 'application' group = 'de.jottyfan.camporganizer' -version = '0.2.4' +version = '0.2.5' sourceCompatibility = 17 mainClassName = "de.jottyfan.camporganizer.Main" diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java index 3433f6c..69aeaab 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminController.java @@ -1,12 +1,22 @@ package de.jottyfan.camporganizer.module.admin; import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.validation.BindingResult; +import org.springframework.validation.ObjectError; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; import de.jottyfan.camporganizer.module.camplist.CommonController; +import de.jottyfan.camporganizer.module.mail.MailBean; /** * @@ -16,6 +26,37 @@ import de.jottyfan.camporganizer.module.camplist.CommonController; @Controller public class AdminController extends CommonController { + private static final Logger LOGGER = LogManager.getLogger(AdminController.class); + + @Autowired + private AdminService service; + + @Value("${spring.mail.username}") + private String from; + + @GetMapping("/admin/mail") + public String getMail(Model model, HttpServletRequest request) { + super.setupSession(model, request); + MailBean mailBean = new MailBean(); + mailBean.setFrom(from); + mailBean.getTo().add(getCurrentEmail(request)); + model.addAttribute("bean", mailBean); + return "/admin/mail"; + } + + @PostMapping("/admin/mail/send") + public String sendMail(@Valid @ModelAttribute("bean") MailBean bean, final BindingResult bindingResult, Model model, + HttpServletRequest request) { + super.setupSession(model, request); + if (bindingResult.hasErrors()) { + for (ObjectError error : bindingResult.getAllErrors()) + LOGGER.error("error {}: {}", error.getCode(), error.getDefaultMessage()); + return "/admin/mail"; + } + service.sendMail(bean); + return "redirect:/admin"; + } + @GetMapping("/admin") public String getMain(Model model, HttpServletRequest request) { super.setupSession(model, request); diff --git a/src/main/java/de/jottyfan/camporganizer/module/admin/AdminService.java b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminService.java new file mode 100644 index 0000000..194be24 --- /dev/null +++ b/src/main/java/de/jottyfan/camporganizer/module/admin/AdminService.java @@ -0,0 +1,26 @@ +package de.jottyfan.camporganizer.module.admin; + +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import de.jottyfan.camporganizer.module.mail.MailBean; +import de.jottyfan.camporganizer.module.mail.MailRepository; + +/** + * + * @author jotty + * + */ +@Service +public class AdminService { + + @Autowired + private MailRepository mailRepository; + + public void sendMail(@Valid MailBean bean) { + mailRepository.sendMail(bean); + } + +} diff --git a/src/main/java/de/jottyfan/camporganizer/module/camplist/CommonController.java b/src/main/java/de/jottyfan/camporganizer/module/camplist/CommonController.java index 2cd7222..5d0c739 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/camplist/CommonController.java +++ b/src/main/java/de/jottyfan/camporganizer/module/camplist/CommonController.java @@ -24,6 +24,18 @@ public abstract class CommonController { return ksc == null ? null : ksc.getIdToken().getPreferredUsername(); } + /** + * try to get th currnt keycloak email + * + * @param request the request + * @return the email or null + */ + public String getCurrentEmail(HttpServletRequest request) { + KeycloakSecurityContext ksc = (KeycloakSecurityContext) request + .getAttribute(KeycloakSecurityContext.class.getName()); + return ksc == null ? null : ksc.getIdToken().getEmail(); + } + /** * setup the session for the template * diff --git a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonGateway.java b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonGateway.java index f4ea97d..2df3001 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonGateway.java +++ b/src/main/java/de/jottyfan/camporganizer/module/confirmation/person/impl/PersonGateway.java @@ -12,9 +12,7 @@ import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -38,6 +36,7 @@ import de.jottyfan.camporganizer.db.jooq.tables.records.TCampRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TPersonRecord; import de.jottyfan.camporganizer.db.jooq.tables.records.TRssRecord; import de.jottyfan.camporganizer.module.camplist.LambdaResultWrapper; +import de.jottyfan.camporganizer.module.mail.MailBean; import de.jottyfan.camporganizer.module.mail.MailRepository; /** @@ -251,11 +250,13 @@ public class PersonGateway { } } if (sendMail) { - Set to = new HashSet<>(); - to.add(email); - to.add(bean.getEmail()); try { - mailRepository.sendMail(to, subject, buf.toString()); // no matter if the sending works + MailBean mailBean = new MailBean(); + mailBean.getTo().add(email); + mailBean.getTo().add(bean.getEmail()); + mailBean.setSubject(subject); + mailBean.setMessage(buf.toString()); + mailRepository.sendMail(mailBean); // no matter if the sending works } catch (Exception e) { LOGGER.error(e.getMessage(), e); } diff --git a/src/main/java/de/jottyfan/camporganizer/module/mail/MailBean.java b/src/main/java/de/jottyfan/camporganizer/module/mail/MailBean.java new file mode 100644 index 0000000..f8b2a3a --- /dev/null +++ b/src/main/java/de/jottyfan/camporganizer/module/mail/MailBean.java @@ -0,0 +1,94 @@ +package de.jottyfan.camporganizer.module.mail; + +import java.io.Serializable; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotEmpty; + +/** + * + * @author jotty + * + */ +public class MailBean implements Serializable { + private static final long serialVersionUID = 1L; + + @NotEmpty + private final Set to; + + @NotBlank + private String from; + private String subject; + private String message; + + public MailBean() { + this.to = new HashSet<>(); + } + + public String getTos() { + StringBuilder buf = new StringBuilder(); + boolean first = true; + for (String s : to) { + buf.append(first ? "" : ";").append(s); + first = false; + } + return buf.toString(); + } + + public void setTos(String tos) { + this.to.clear(); + this.to.addAll(List.of(tos.split(";"))); + } + + /** + * @return the from + */ + public String getFrom() { + return from; + } + + /** + * @param from the from to set + */ + public void setFrom(String from) { + this.from = from; + } + + /** + * @return the subject + */ + public String getSubject() { + return subject; + } + + /** + * @param subject the subject to set + */ + public void setSubject(String subject) { + this.subject = subject; + } + + /** + * @return the message + */ + public String getMessage() { + return message; + } + + /** + * @param message the message to set + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * @return the to + */ + public Set getTo() { + return to; + } +} diff --git a/src/main/java/de/jottyfan/camporganizer/module/mail/MailRepository.java b/src/main/java/de/jottyfan/camporganizer/module/mail/MailRepository.java index 39f7140..e6f23d9 100644 --- a/src/main/java/de/jottyfan/camporganizer/module/mail/MailRepository.java +++ b/src/main/java/de/jottyfan/camporganizer/module/mail/MailRepository.java @@ -30,6 +30,16 @@ public class MailRepository { @Value("${spring.mail.username}") private String username; + /** + * Send an email with the message to the recipient. If email is blank, do + * nothing + * + * @param bean the mail + */ + public void sendMail(MailBean bean) { + sendMail(bean.getTo(), bean.getSubject(), bean.getMessage()); + } + /** * Send an email with the message to the recipient. If email is blank, do * nothing @@ -38,7 +48,7 @@ public class MailRepository { * @param subject the subject * @param message the message */ - public void sendMail(Set to, String subject, String message) { + private void sendMail(Set to, String subject, String message) { if (to != null && to.size() > 0) { if (username != null && !username.isBlank()) { try { diff --git a/src/main/resources/templates/admin/mail.html b/src/main/resources/templates/admin/mail.html new file mode 100644 index 0000000..4d9fcba --- /dev/null +++ b/src/main/resources/templates/admin/mail.html @@ -0,0 +1,57 @@ + + + +Camp Organizer Confirmation + + + + + + + + +
+
+
+
+ eine Test-E-Mail verschicken +
+
+
+
+
Absender
+
+ +
+ [[${error}]]
+
Empfänger
+
+ +
+ [[${error}]]
+
Betreff
+
+ +
+ [[${error}]]
+
Nachricht
+
+ +
+ [[${error}]]
+
+
+
+ +
+
+
+
+ + \ No newline at end of file diff --git a/src/main/resources/templates/admin/main.html b/src/main/resources/templates/admin/main.html index f2c090e..928b56a 100644 --- a/src/main/resources/templates/admin/main.html +++ b/src/main/resources/templates/admin/main.html @@ -12,6 +12,9 @@ +