From 4856326b29449c35861eaf66aa8c88d6c9385d02 Mon Sep 17 00:00:00 2001 From: Thibaut Valentin Date: Thu, 25 Dec 2025 19:59:47 +0100 Subject: [PATCH] feat: html mail for all public --- .../domain/service/AffiliationService.java | 68 ++++---- .../ffsaf/domain/service/KeycloakService.java | 152 ++++++------------ .../java/fr/titionfire/ffsaf/utils/Utils.java | 73 +++++++++ 3 files changed, 160 insertions(+), 133 deletions(-) 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 c395606..4dfd0ec 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/AffiliationService.java @@ -355,19 +355,25 @@ public class AffiliationService { .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("FFSAF ").setReplyTo("contact@ffsaf.fr") + Mail.withHtml(form.getM1_email(), "FFSAF - Creation de votre compte sur l'intranet", + String.format(Utils.HTML_HEADER, "FFSAF - Creation de votre compte sur l'intranet") + + String.format(""" +

Votre demande d'affiliation pour le club %s a été acceptée.

+

LLe numéro d'affiliation de votre club est le %d.

+ """, + club.getName(), club.getNo_affiliation()) + + Utils.HTML_FOOTER + ) + .setText(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("FFSAF ").setReplyTo("contact@ffsaf.fr") .addTo(form.getM2_email(), form.getM3_email()) )); } @@ -458,21 +464,27 @@ public class AffiliationService { public Uni deleteReqAffiliation(long id, String reason, boolean federationAdmin) { return repositoryRequest.findById(id) .call(aff -> federationAdmin ? reactiveMailer.send( - Mail.withText(aff.getM1_email(), - "FFSAF - Votre demande d'affiliation a été rejetée.", - String.format( - """ - Bonjour, - - Votre demande d'affiliation pour le club %s a été rejetée pour la/les raison(s) suivante(s): - %s - - Si vous rencontrez un problème ou si vous avez des questions, n'hésitez pas à nous contacter à l'adresse contact@ffsaf.fr. - - Cordialement, - L'équipe de la FFSAF - """, aff.getName(), reason) - ).setFrom("FFSAF ").setReplyTo("contact@ffsaf.fr") + Mail.withHtml(aff.getM1_email(), "FFSAF - Votre demande d'affiliation a été rejetée.", + String.format(Utils.HTML_HEADER, "FFSAF - Votre demande d'affiliation a été rejetée.") + + String.format(""" +

Votre demande d'affiliation pour le club %s a été rejetée pour la/les raison(s) suivante(s):
%s

+

Si vous rencontrez un problème ou si vous avez des questions, n'hésitez pas à nous contacter à l'adresse contact@ffsaf.fr.

+ """, + aff.getName(), reason) + + Utils.HTML_FOOTER + ) + .setText(String.format(""" + Bonjour, + + Votre demande d'affiliation pour le club %s a été rejetée pour la/les raison(s) suivante(s): + %s + + Si vous rencontrez un problème ou si vous avez des questions, n'hésitez pas à nous contacter à l'adresse contact@ffsaf.fr. + + Cordialement, + L'équipe de la FFSAF + """, aff.getName(), reason)) + .setFrom("FFSAF ").setReplyTo("contact@ffsaf.fr") .addTo(aff.getM2_email(), aff.getM3_email()) ) : Uni.createFrom().nullItem()) .chain(aff -> Panache.withTransaction(() -> repositoryRequest.delete(aff))) 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 99cce5b..cf23435 100644 --- a/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java +++ b/src/main/java/fr/titionfire/ffsaf/domain/service/KeycloakService.java @@ -156,24 +156,32 @@ public class KeycloakService { 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("FFSAF ").setReplyTo("support@ffsaf.fr") + Mail.withHtml(oldEmail, "FFSAF - Changement de votre adresse email", + String.format(Utils.HTML_HEADER, "FFSAF - Changement de votre adresse email") + + String.format(""" +

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.

+ """, + oldEmail, email) + + Utils.HTML_FOOTER + ) + .setText(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("FFSAF ").setReplyTo("support@ffsaf.fr") ).onFailure().invoke(e -> LOGGER.error("Fail to send email", e))); } @@ -270,93 +278,27 @@ public class KeycloakService { .invoke(user -> membreModel.setUserId(user.getId())) .call(user -> updateRole(user.getId(), List.of("safca_user"), List.of())) .call(user -> enabled_email ? reactiveMailer.send( - Mail.withHtml(user.getEmail(), "FFSAF - Creation de votre compte sur l'intranet", String.format( - """ - - - - - - Création de votre compte intranet FFSAF - - - - -
-
ffsaf -

Fédération France Soft Armored Fighting

-
-
-
-

Bonjour,

-

Suite à votre première inscription %s à la Fédération France Soft Armored Fighting (FFSAF), votre compte intranet a été créé.

-

Ce compte vous permettra de :

-
    -
  • Consulter vos informations personnelles,
  • -
  • Vous inscrire aux compétitions (bientôt disponible),
  • -
  • Consulter les résultats des compétitions.
  • -
-

L’intranet est accessible à l’adresse suivante :

-

Accéder à l'intranet

-

Votre nom d’utilisateur est : %s

-

Pour définir votre mot de passe, rendez-vous sur l’intranet : Connexion > Mot de passe oublié ?

-

Si vous n’avez pas demandé cette inscription, veuillez contacter le support à l’adresse : support@ffsaf.fr.

- -

Cordialement,
L’équipe de la FFSAF

-
- - - - """, - membreModel.getRole() == RoleAsso.MEMBRE ? "par votre club (" + membreModel.getClub() - .getName() + ") " : "", user.getUsername()) + Mail.withHtml(user.getEmail(), "FFSAF - Creation de votre compte sur l'intranet", + String.format(Utils.HTML_HEADER, "Création de votre compte intranet FFSAF") + + String.format( + """ +

Suite à votre première inscription %s à la Fédération France Soft Armored Fighting (FFSAF), votre compte intranet a été créé.

+

Ce compte vous permettra de :

+
    +
  • Consulter vos informations personnelles,
  • +
  • Vous inscrire aux compétitions (bientôt disponible),
  • +
  • Consulter les résultats des compétitions.
  • +
+

L’intranet est accessible à l’adresse suivante :

+

Accéder à l'intranet

+

Votre nom d’utilisateur est : %s

+

Pour définir votre mot de passe, rendez-vous sur l’intranet : Connexion > Mot de passe oublié ?

+

Si vous n’avez pas demandé cette inscription, veuillez contacter le support à l’adresse : support@ffsaf.fr.

+ + """, + membreModel.getRole() == RoleAsso.MEMBRE ? "par votre club (" + membreModel.getClub() + .getName() + ") " : "", user.getUsername()) + + Utils.HTML_FOOTER ) .setText(String.format( """ diff --git a/src/main/java/fr/titionfire/ffsaf/utils/Utils.java b/src/main/java/fr/titionfire/ffsaf/utils/Utils.java index 550c6e8..c3cdd73 100644 --- a/src/main/java/fr/titionfire/ffsaf/utils/Utils.java +++ b/src/main/java/fr/titionfire/ffsaf/utils/Utils.java @@ -21,6 +21,79 @@ import java.util.concurrent.Future; public class Utils { private static final Logger LOGGER = Logger.getLogger(Utils.class); + public static String HTML_HEADER = """ + + + + + + %s + + + + +
+
ffsaf +

Fédération France Soft Armored Fighting

+
+
+
+

Bonjour,

+ """; + public static String HTML_FOOTER = """ +

Cordialement,
L’équipe de la FFSAF

+
+ + + """; + public static int getSaison() { return getSaison(new Date()); }