blob: cceddb12730ea2f4ff9d65622512deed87a4e393 [file] [log] [blame]
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();
}
}