blob: 5e8614f96268e97d9764ac1d0ffa6cc2b9c75570 [file] [log] [blame]
Matthias Andreas Benkardff358942020-11-03 06:16:17 +01001package eu.mulk.mulkcms2.benki.newsletter;
2
Matthias Andreas Benkarde3bc3ee2023-08-06 16:21:11 +02003import static jakarta.ws.rs.core.MediaType.TEXT_HTML;
Matthias Andreas Benkardff358942020-11-03 06:16:17 +01004
5import io.quarkus.mailer.MailTemplate.MailTemplateInstance;
Matthias Andreas Benkard49b01512021-07-05 06:45:54 +02006import io.quarkus.qute.CheckedTemplate;
Matthias Andreas Benkardff358942020-11-03 06:16:17 +01007import io.quarkus.qute.TemplateInstance;
Matthias Andreas Benkard37dce402023-09-06 13:51:43 +02008import io.smallrye.common.annotation.Blocking;
Matthias Andreas Benkarde3bc3ee2023-08-06 16:21:11 +02009import jakarta.transaction.Transactional;
10import jakarta.ws.rs.FormParam;
11import jakarta.ws.rs.GET;
12import jakarta.ws.rs.POST;
13import jakarta.ws.rs.Path;
14import jakarta.ws.rs.Produces;
15import jakarta.ws.rs.QueryParam;
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010016import java.util.concurrent.CompletableFuture;
17import java.util.concurrent.CompletionStage;
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010018
19@Path("/newsletter")
20@Produces(TEXT_HTML)
Matthias Andreas Benkard37dce402023-09-06 13:51:43 +020021@Blocking
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010022public class NewsletterResource {
23
24 @CheckedTemplate
25 static class Templates {
26 public static native MailTemplateInstance registrationMail(String registrationKey);
27
28 public static native TemplateInstance index();
29
30 public static native TemplateInstance completeRegistration();
31
32 public static native TemplateInstance registered();
33 }
34
35 @GET
36 public TemplateInstance getIndex() {
37 return Templates.index();
38 }
39
40 @POST
41 @Path("register")
42 @Transactional
Matthias Andreas Benkard4db08542020-12-17 18:10:51 +010043 public CompletionStage<String> register(@FormParam("email") String email) {
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010044 var existingSubscription =
45 NewsletterSubscription.<NewsletterSubscription>find("email = ?1", email)
46 .singleResultOptional();
47 if (existingSubscription.isPresent()) {
48 // If a subscription already exists, act as if we had created it. This provides better
49 // privacy to users than an error message does.
Matthias Andreas Benkard4db08542020-12-17 18:10:51 +010050 return CompletableFuture.completedStage(Templates.completeRegistration().render());
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010051 }
52
53 var subscription = new NewsletterSubscription();
54 subscription.email = email;
55 subscription.persist();
56
57 var mailText = Templates.registrationMail(subscription.registrationKey);
58 var sendJob = mailText.subject("MulkCMS newsletter registration").to(email).send();
Matthias Andreas Benkard4db08542020-12-17 18:10:51 +010059 var page = Templates.completeRegistration().render();
Matthias Andreas Benkarda50ac8d2021-06-28 19:58:36 +020060 return sendJob.onItem().transform(x -> page).subscribeAsCompletionStage();
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010061 }
62
63 @GET
64 @Path("finish-registration")
65 @Transactional
66 public TemplateInstance finishRegistration(@QueryParam("key") String registrationKey) {
67 NewsletterSubscription.<NewsletterSubscription>find("registrationKey = ?1", registrationKey)
68 .singleResultOptional()
Matthias Andreas Benkard46749032020-12-17 18:15:32 +010069 .ifPresent(s -> s.registrationKey = null);
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010070
71 return Templates.registered();
72 }
73}