diff --git a/pom.xml b/pom.xml index cf94101..10cbb47 100644 --- a/pom.xml +++ b/pom.xml @@ -134,6 +134,11 @@ fop 2.6 + + + io.quarkus + quarkus-mailer + diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java index 30c300a..abf831e 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java @@ -12,6 +12,8 @@ import fr.titionfire.ffsaf.utils.SequenceType; import fr.titionfire.ffsaf.utils.Utils; import io.quarkus.hibernate.reactive.panache.Panache; import io.quarkus.hibernate.reactive.panache.common.WithSession; +import io.quarkus.mailer.Mail; +import io.quarkus.mailer.reactive.ReactiveMailer; import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.unchecked.Unchecked; import jakarta.enterprise.context.ApplicationScoped; @@ -47,6 +49,9 @@ public class AffiliationService { @Inject LicenceRepository licenceRepository; + @Inject + ReactiveMailer reactiveMailer; + @ConfigProperty(name = "upload_dir") String media; @@ -279,7 +284,22 @@ public class AffiliationService { ) .chain(() -> repository.persist(new AffiliationModel(null, club, model.getSaison()))) .map(c -> club)); - }); + }) + .call(club -> reactiveMailer.send( + Mail.withText(form.getM1_email(), + "FFSAF - Acceptation de votre demande d'affiliation", + String.format( + """ + Bonjour, + + Votre demande d'affiliation pour le club %s a été acceptée. + Le numéro d'affiliation de votre club est le %d. + + Cordialement, + L'équipe de la FFSAF + """, club.getName(), club.getNo_affiliation()) + ).setFrom("no-reply@ffsaf.fr").setReplyTo("contact@ffsaf.fr").addTo(form.getM2_email(), form.getM3_email()) + )); } private Uni acceptOld(AffiliationRequestSaveForm form, AffiliationRequestModel model, ClubModel club) { diff --git a/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java index d6ef94b..641f28f 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java @@ -4,6 +4,8 @@ import fr.titionfire.ffsaf.data.model.ClubModel; import fr.titionfire.ffsaf.data.model.MembreModel; import fr.titionfire.ffsaf.rest.exception.DInternalError; import fr.titionfire.ffsaf.utils.*; +import io.quarkus.mailer.Mail; +import io.quarkus.mailer.reactive.ReactiveMailer; import io.quarkus.runtime.annotations.RegisterForReflection; import io.smallrye.mutiny.Uni; import io.smallrye.mutiny.unchecked.Unchecked; @@ -45,6 +47,9 @@ public class KeycloakService { @ConfigProperty(name = "email.enabled") boolean enabled_email; + @Inject + ReactiveMailer reactiveMailer; + @Inject Vertx vertx; @@ -115,13 +120,36 @@ public class KeycloakService { return vertx.getOrCreateContext().executeBlocking(() -> { UserResource user = keycloak.realm(realm).users().get(userId); UserRepresentation user2 = user.toRepresentation(); + String oldEmail = user2.getEmail(); if (email.equals(user2.getEmail())) return ""; user2.setEmail(email); user2.setRequiredActions(List.of(RequiredAction.VERIFY_EMAIL.name())); user.update(user2); - return ""; - }); + if (enabled_email) + user.sendVerifyEmail(); + return oldEmail; + }).call(oldEmail -> oldEmail == null || !enabled_email ? Uni.createFrom().item("") : + reactiveMailer.send( + Mail.withText(oldEmail, + "FFSAF - Changement de votre adresse email", + String.format( + """ + Bonjour, + + Suite à la modification de votre adresse email fournie lors de votre (ré)inscription à la FFSAF, + vous allez recevoir dans les prochaines minutes un email de vérification de votre nouvelle adresse sur celle-ci. + + Ancienne adresse email : %s + Nouvelle adresse email : %s + + Si vous n'avez pas demandé cette modification, veuillez contacter le support à l'adresse support@ffsaf.fr. + + Cordialement, + L'équipe de la FFSAF + """, oldEmail, email) + ).setFrom("no-reply@ffsaf.fr").setReplyTo("support@ffsaf.fr") + )); } public Uni setAutoRoleMembre(String id, RoleAsso role, GradeArbitrage gradeArbitrage) { @@ -226,6 +254,29 @@ public class KeycloakService { return null; }) : Uni.createFrom().nullItem()) .invoke(user -> membreModel.setUserId(user.getId())) + .call(user -> enabled_email ? reactiveMailer.send( + Mail.withText(user.getEmail(), + "FFSAF - Creation de votre compte sur l'intranet", + String.format( + """ + Bonjour, + + Suite à votre première inscription à la Fédération Française de Soft Armored Fighting (FFSAF), votre compte pour accéder à l'intranet a été créé. + Ce compte vous permettra de consulter vos informations, de vous inscrire aux compétitions et de consulter vos résultats. + + Vous allez recevoir dans les prochaines minutes un email vous demandant de vérifier votre email et de définir un mot de passe. + + L'intranet est accessible à l'adresse suivante : https://intra.ffsaf.fr + Votre nom d'utilisateur est : %s + + Si vous n'avez pas demandé cette inscription, veuillez contacter le support à l'adresse support@ffsaf.fr. + (Pas de panique, nous ne vous enverrons pas de message autre que ce concernant votre compte) + + Cordialement, + L'équipe de la FFSAF + """, user.getUsername()) + ).setFrom("no-reply@ffsaf.fr").setReplyTo("support@ffsaf.fr") + ) : Uni.createFrom().nullItem()) .call(user -> membreService.setUserId(membreModel.getId(), user.getId())) .call(user -> setClubGroupMembre(membreModel, membreModel.getClub())); }