| package eu.mulk.mulkcms2.benki.newsletter; |
| |
| import static jakarta.ws.rs.core.MediaType.TEXT_HTML; |
| |
| import io.quarkus.mailer.MailTemplate.MailTemplateInstance; |
| import io.quarkus.qute.CheckedTemplate; |
| import io.quarkus.qute.TemplateInstance; |
| import jakarta.transaction.Transactional; |
| import jakarta.ws.rs.FormParam; |
| import jakarta.ws.rs.GET; |
| import jakarta.ws.rs.POST; |
| import jakarta.ws.rs.Path; |
| import jakarta.ws.rs.Produces; |
| import jakarta.ws.rs.QueryParam; |
| import java.util.concurrent.CompletableFuture; |
| import java.util.concurrent.CompletionStage; |
| |
| @Path("/newsletter") |
| @Produces(TEXT_HTML) |
| public class NewsletterResource { |
| |
| @CheckedTemplate |
| static class Templates { |
| public static native MailTemplateInstance registrationMail(String registrationKey); |
| |
| public static native TemplateInstance index(); |
| |
| public static native TemplateInstance completeRegistration(); |
| |
| public static native TemplateInstance registered(); |
| } |
| |
| @GET |
| public TemplateInstance getIndex() { |
| return Templates.index(); |
| } |
| |
| @POST |
| @Path("register") |
| @Transactional |
| public CompletionStage<String> register(@FormParam("email") String email) { |
| var existingSubscription = |
| NewsletterSubscription.<NewsletterSubscription>find("email = ?1", email) |
| .singleResultOptional(); |
| if (existingSubscription.isPresent()) { |
| // If a subscription already exists, act as if we had created it. This provides better |
| // privacy to users than an error message does. |
| return CompletableFuture.completedStage(Templates.completeRegistration().render()); |
| } |
| |
| var subscription = new NewsletterSubscription(); |
| subscription.email = email; |
| subscription.persist(); |
| |
| var mailText = Templates.registrationMail(subscription.registrationKey); |
| var sendJob = mailText.subject("MulkCMS newsletter registration").to(email).send(); |
| var page = Templates.completeRegistration().render(); |
| return sendJob.onItem().transform(x -> page).subscribeAsCompletionStage(); |
| } |
| |
| @GET |
| @Path("finish-registration") |
| @Transactional |
| public TemplateInstance finishRegistration(@QueryParam("key") String registrationKey) { |
| NewsletterSubscription.<NewsletterSubscription>find("registrationKey = ?1", registrationKey) |
| .singleResultOptional() |
| .ifPresent(s -> s.registrationKey = null); |
| |
| return Templates.registered(); |
| } |
| } |