blob: 85af008ef812118cdf3d1338d8fadb98c77713bf [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;
11import javax.ws.rs.ClientErrorException;
12import javax.ws.rs.FormParam;
13import javax.ws.rs.GET;
14import javax.ws.rs.POST;
15import javax.ws.rs.Path;
16import javax.ws.rs.Produces;
17import javax.ws.rs.QueryParam;
18import javax.ws.rs.core.Response.Status;
19
20@Path("/newsletter")
21@Produces(TEXT_HTML)
22public 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();
60 return sendJob.thenApply((x) -> page);
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()
69 .ifPresentOrElse(
70 s -> s.registrationKey = null,
71 () -> {
72 throw new ClientErrorException(Status.BAD_REQUEST);
73 });
74
75 return Templates.registered();
76 }
77}