summaryrefslogtreecommitdiff
path: root/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterUnsubscriber.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterUnsubscriber.java')
-rw-r--r--src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterUnsubscriber.java63
1 files changed, 63 insertions, 0 deletions
diff --git a/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterUnsubscriber.java b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterUnsubscriber.java
new file mode 100644
index 0000000..0a67ff6
--- /dev/null
+++ b/src/main/java/eu/mulk/mulkcms2/benki/newsletter/NewsletterUnsubscriber.java
@@ -0,0 +1,63 @@
+package eu.mulk.mulkcms2.benki.newsletter;
+
+import io.quarkus.mailer.MailTemplate.MailTemplateInstance;
+import io.quarkus.qute.api.CheckedTemplate;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import javax.enterprise.context.Dependent;
+import javax.mail.internet.InternetAddress;
+import javax.transaction.Transactional;
+import org.apache.camel.Exchange;
+import org.apache.camel.Processor;
+import org.apache.camel.component.mail.MailMessage;
+import org.jboss.logging.Logger;
+
+@Dependent
+public class NewsletterUnsubscriber implements Processor {
+
+ private static final Logger log = Logger.getLogger(NewsletterUnsubscriber.class);
+
+ @CheckedTemplate
+ static class Templates {
+ public static native MailTemplateInstance unsubscribedMail();
+ }
+
+ @Override
+ @Transactional
+ public void process(Exchange exchange) throws Exception {
+ var message = exchange.getMessage(MailMessage.class);
+ var mail = message.getMessage();
+
+ for (var sender : mail.getFrom()) {
+ if (!(sender instanceof InternetAddress)) {
+ log.warnf("Tried to unsubscribe, but not an InternetAddress: %s", sender);
+ continue;
+ }
+
+ var address = ((InternetAddress) sender).getAddress();
+ var subscription =
+ NewsletterSubscription.<NewsletterSubscription>find("email = ?1", address)
+ .singleResultOptional();
+ subscription.ifPresentOrElse(
+ s -> {
+ try {
+ var sendJob =
+ Templates.unsubscribedMail()
+ .subject("Unsubscribed from MulkCMS newsletter")
+ .to(address)
+ .send();
+ sendJob.toCompletableFuture().get(60, TimeUnit.SECONDS);
+
+ s.delete();
+
+ log.infof("Unsubscribed: %s (#%d)", s.email, s.id);
+ } catch (InterruptedException | ExecutionException | TimeoutException e) {
+ throw new RuntimeException(e);
+ }
+ },
+ () ->
+ log.warnf("Tried to unsubscribe, but no subscription found: %s", sender.toString()));
+ }
+ }
+}