From ccf287f48257a1f613e4b32c5de5c1daffc8da26 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Tue, 21 Jan 2025 11:34:48 +0100 Subject: [PATCH 1/3] feat(add): send check email on change --- .../fr/titionfire/ffsaf/domain/service/KeycloakService.java | 2 ++ 1 file changed, 2 insertions(+) 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..39f46e9 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java @@ -120,6 +120,8 @@ public class KeycloakService { user2.setEmail(email); user2.setRequiredActions(List.of(RequiredAction.VERIFY_EMAIL.name())); user.update(user2); + if (enabled_email) + user.sendVerifyEmail(); return ""; }); } -- 2.49.0 From 24effa1f7848c91d1a88c4cbe67fcf01b54cdf67 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Tue, 21 Jan 2025 15:10:14 +0100 Subject: [PATCH 2/3] feat(mail): add account notification mail --- pom.xml | 5 ++ .../ffsaf/domain/service/KeycloakService.java | 53 ++++++++++++++++++- 2 files changed, 56 insertions(+), 2 deletions(-) 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/KeycloakService.java b/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java index 39f46e9..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,6 +120,7 @@ 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); @@ -122,8 +128,28 @@ public class KeycloakService { user.update(user2); if (enabled_email) user.sendVerifyEmail(); - return ""; - }); + 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) { @@ -228,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())); } -- 2.49.0 From c344299cdb7ba011d0759862c219d961ea6eb7a9 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Tue, 21 Jan 2025 20:35:39 +0100 Subject: [PATCH 3/3] feat(mail): add affiliation accept message --- .../domain/service/AffiliationService.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) 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) { -- 2.49.0