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 | 37dce40 | 2023-09-06 13:51:43 +0200 | [diff] [blame^] | 8 | import io.smallrye.common.annotation.Blocking; |
Matthias Andreas Benkard | e3bc3ee | 2023-08-06 16:21:11 +0200 | [diff] [blame] | 9 | import jakarta.transaction.Transactional; |
| 10 | import jakarta.ws.rs.FormParam; |
| 11 | import jakarta.ws.rs.GET; |
| 12 | import jakarta.ws.rs.POST; |
| 13 | import jakarta.ws.rs.Path; |
| 14 | import jakarta.ws.rs.Produces; |
| 15 | import jakarta.ws.rs.QueryParam; |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 16 | import java.util.concurrent.CompletableFuture; |
| 17 | import java.util.concurrent.CompletionStage; |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 18 | |
| 19 | @Path("/newsletter") |
| 20 | @Produces(TEXT_HTML) |
Matthias Andreas Benkard | 37dce40 | 2023-09-06 13:51:43 +0200 | [diff] [blame^] | 21 | @Blocking |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 22 | public 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 Benkard | 4db0854 | 2020-12-17 18:10:51 +0100 | [diff] [blame] | 43 | public CompletionStage<String> register(@FormParam("email") String email) { |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 44 | 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 Benkard | 4db0854 | 2020-12-17 18:10:51 +0100 | [diff] [blame] | 50 | return CompletableFuture.completedStage(Templates.completeRegistration().render()); |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 51 | } |
| 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 Benkard | 4db0854 | 2020-12-17 18:10:51 +0100 | [diff] [blame] | 59 | var page = Templates.completeRegistration().render(); |
Matthias Andreas Benkard | a50ac8d | 2021-06-28 19:58:36 +0200 | [diff] [blame] | 60 | return sendJob.onItem().transform(x -> page).subscribeAsCompletionStage(); |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 61 | } |
| 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 Benkard | 4674903 | 2020-12-17 18:15:32 +0100 | [diff] [blame] | 69 | .ifPresent(s -> s.registrationKey = null); |
Matthias Andreas Benkard | ff35894 | 2020-11-03 06:16:17 +0100 | [diff] [blame] | 70 | |
| 71 | return Templates.registered(); |
| 72 | } |
| 73 | } |