blob: 3786c9c011c8450a659209cada3bd8032318f9f5 [file] [log] [blame]
Matthias Andreas Benkardff358942020-11-03 06:16:17 +01001package eu.mulk.mulkcms2.benki.newsletter;
2
3import static javax.ws.rs.core.MediaType.TEXT_HTML;
4
5import io.quarkus.mailer.MailTemplate.MailTemplateInstance;
6import io.quarkus.qute.TemplateInstance;
7import io.quarkus.qute.api.CheckedTemplate;
8import java.util.concurrent.CompletableFuture;
9import java.util.concurrent.CompletionStage;
10import javax.transaction.Transactional;
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010011import javax.ws.rs.FormParam;
12import javax.ws.rs.GET;
13import javax.ws.rs.POST;
14import javax.ws.rs.Path;
15import javax.ws.rs.Produces;
16import javax.ws.rs.QueryParam;
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010017
18@Path("/newsletter")
19@Produces(TEXT_HTML)
20public class NewsletterResource {
21
22 @CheckedTemplate
23 static class Templates {
24 public static native MailTemplateInstance registrationMail(String registrationKey);
25
26 public static native TemplateInstance index();
27
28 public static native TemplateInstance completeRegistration();
29
30 public static native TemplateInstance registered();
31 }
32
33 @GET
34 public TemplateInstance getIndex() {
35 return Templates.index();
36 }
37
38 @POST
39 @Path("register")
40 @Transactional
Matthias Andreas Benkard4db08542020-12-17 18:10:51 +010041 public CompletionStage<String> register(@FormParam("email") String email) {
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010042 var existingSubscription =
43 NewsletterSubscription.<NewsletterSubscription>find("email = ?1", email)
44 .singleResultOptional();
45 if (existingSubscription.isPresent()) {
46 // If a subscription already exists, act as if we had created it. This provides better
47 // privacy to users than an error message does.
Matthias Andreas Benkard4db08542020-12-17 18:10:51 +010048 return CompletableFuture.completedStage(Templates.completeRegistration().render());
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010049 }
50
51 var subscription = new NewsletterSubscription();
52 subscription.email = email;
53 subscription.persist();
54
55 var mailText = Templates.registrationMail(subscription.registrationKey);
56 var sendJob = mailText.subject("MulkCMS newsletter registration").to(email).send();
Matthias Andreas Benkard4db08542020-12-17 18:10:51 +010057 var page = Templates.completeRegistration().render();
58 return sendJob.thenApply((x) -> page);
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010059 }
60
61 @GET
62 @Path("finish-registration")
63 @Transactional
64 public TemplateInstance finishRegistration(@QueryParam("key") String registrationKey) {
65 NewsletterSubscription.<NewsletterSubscription>find("registrationKey = ?1", registrationKey)
66 .singleResultOptional()
Matthias Andreas Benkard46749032020-12-17 18:15:32 +010067 .ifPresent(s -> s.registrationKey = null);
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010068
69 return Templates.registered();
70 }
71}