Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 1 | package eu.mulk.mulkcms2.benki.newsletter; |
| 2 | |
Matthias Andreas Benkard | e3bc3ee | 2023-08-06 16:21:11 +0200 | [diff] [blame] | 3 | import static jakarta.ws.rs.core.MediaType.TEXT_HTML; |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 4 | |
| 5 | import io.quarkus.mailer.MailTemplate.MailTemplateInstance; |
Matthias Andreas Benkard | 49b0151 | 2021-07-05 06:45:54 +0200 | [diff] [blame] | 6 | import io.quarkus.qute.CheckedTemplate; |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 7 | import io.quarkus.qute.TemplateInstance; |
Matthias Andreas Benkard | e3bc3ee | 2023-08-06 16:21:11 +0200 | [diff] [blame] | 8 | import jakarta.transaction.Transactional; |
| 9 | import jakarta.ws.rs.FormParam; |
| 10 | import jakarta.ws.rs.GET; |
| 11 | import jakarta.ws.rs.POST; |
| 12 | import jakarta.ws.rs.Path; |
| 13 | import jakarta.ws.rs.Produces; |
| 14 | import jakarta.ws.rs.QueryParam; |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 15 | import java.util.concurrent.CompletableFuture; |
| 16 | import java.util.concurrent.CompletionStage; |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 17 | |
| 18 | @Path("/newsletter") |
| 19 | @Produces(TEXT_HTML) |
| 20 | public 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 Benkard | 4db0854 | 2020-12-17 18:10:51 +0100 | [diff] [blame] | 41 | public CompletionStage<String> register(@FormParam("email") String email) { |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 42 | 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 Benkard | 4db0854 | 2020-12-17 18:10:51 +0100 | [diff] [blame] | 48 | return CompletableFuture.completedStage(Templates.completeRegistration().render()); |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 49 | } |
| 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 Benkard | 4db0854 | 2020-12-17 18:10:51 +0100 | [diff] [blame] | 57 | var page = Templates.completeRegistration().render(); |
Matthias Andreas Benkard | a50ac8d | 2021-06-28 19:58:36 +0200 | [diff] [blame] | 58 | return sendJob.onItem().transform(x -> page).subscribeAsCompletionStage(); |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 59 | } |
| 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 Benkard | 4674903 | 2020-12-17 18:15:32 +0100 | [diff] [blame] | 67 | .ifPresent(s -> s.registrationKey = null); |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 68 | |
| 69 | return Templates.registered(); |
| 70 | } |
| 71 | } |