import { factories } from "@strapi/strapi"; export default factories.createCoreService( "api::mails.mails", ({ strapi }) => ({ // Notre méthode personnalisée async sendInvitation( emailAddress: string, inviterName: string, choirName: string, inviteToken: string | null, ) { // 1. Définir le lien de redirection selon le type d'utilisateur // S'il y a un token, c'est un nouvel utilisateur. Sinon, c'est un membre existant. const inviteLink = inviteToken ? `https://www.choralsync.com/invite?token=${inviteToken}` : `https://www.choralsync.com/app`; // Lien vers l'app pour accepter l'invitation interne // 2. Récupérer le single-type "mails" avec l'API Document const mailsConfig = await strapi.documents("api::mails.mails").findFirst({ populate: ["onInviteUser"], }); if (!mailsConfig || !mailsConfig.onInviteUser) { throw new Error( "Le template d'email d'invitation n'est pas configuré dans le CMS.", ); } const templateConfig = mailsConfig.onInviteUser[0]; try { // 3. Envoyer l'email via le moteur de template natif await strapi.plugin("email").service("email").sendTemplatedEmail( { to: emailAddress, from: "ChoralSync ", }, { subject: templateConfig.subject, html: templateConfig.message, text: `Bonjour, Vous avez été invité(e) par <%= inviter_name %> à rejoindre <%= choir_name %>. Acceptez l'invitation en cliquant sur ce lien : <%= invite_link %>`, }, { // Variables injectées dans le template (<%= variable %>) inviter_name: inviterName, choir_name: choirName, invite_link: inviteLink, }, ); return { success: true }; } catch (error) { console.error("Erreur lors de l'envoi de l'email :", error); // On throw l'erreur pour que le contrôleur puisse la logger, // mais idéalement sans bloquer la création en base. throw error; } }, }), );