blob: cceddb12730ea2f4ff9d65622512deed87a4e393 [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 Benkarde3bc3ee2023-08-06 16:21:11 +02008import jakarta.transaction.Transactional;
9import jakarta.ws.rs.FormParam;
10import jakarta.ws.rs.GET;
11import jakarta.ws.rs.POST;
12import jakarta.ws.rs.Path;
13import jakarta.ws.rs.Produces;
14import jakarta.ws.rs.QueryParam;
Matthias Andreas Benkardff358942020-11-03 06:16:17 +010015import java.util.concurrent.CompletableFuture;
16import java.util.concurrent.CompletionStage;
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();
Matthias Andreas Benkarda50ac8d2021-06-28 19:58:36 +020058 return sendJob.onItem().transform(x -> page).subscribeAsCompletionStage();
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}