diff --git a/src/controllers/auth.controller.js b/src/controllers/auth.controller.js index 76279524..73d9aed5 100644 --- a/src/controllers/auth.controller.js +++ b/src/controllers/auth.controller.js @@ -5,10 +5,7 @@ import bcrypt from 'bcrypt'; import { pool } from '../../db.js'; import { AppError, asyncHandler } from '../middleware/errorHandler.js'; import { generateToken, generateJWT, getTokenExpiry, isExpired } from '../utils/helpers.js'; -import { - sendVerificationEmail, - sendResetPasswordEmail, -} from '../services/email.service.js'; +import { sendResetPasswordEmail, sendWelcomeEmail } from '../services/email.service.js'; /** * Inscription d'un nouvel utilisateur @@ -27,30 +24,27 @@ export const register = asyncHandler(async (req, res, next) => { // Hasher le mot de passe const hashedPassword = await bcrypt.hash(password, 10); - // Générer un token de vérification - const verificationToken = generateToken(); - - // Créer l'utilisateur + // Créer l'utilisateur (vérifié directement, sans vérification email) const result = await pool.query( - `INSERT INTO users (email, password, first_name, last_name, phone, address, city, postal_code, verification_token) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9) + `INSERT INTO users (email, password, first_name, last_name, phone, address, city, postal_code, is_verified) + VALUES ($1, $2, $3, $4, $5, $6, $7, $8, TRUE) RETURNING id, email, first_name, last_name, role, created_at`, - [email, hashedPassword, firstName, lastName, phone, address, city, postalCode, verificationToken] + [email, hashedPassword, firstName, lastName, phone, address, city, postalCode] ); const user = result.rows[0]; - // Envoyer l'email de vérification + // Envoyer l'email de bienvenue try { - await sendVerificationEmail(email, verificationToken); + await sendWelcomeEmail(email, firstName); } catch (error) { - console.error('Erreur envoi email:', error); + console.error('Erreur envoi email de bienvenue:', error); // On ne bloque pas l'inscription si l'email échoue } res.status(201).json({ success: true, - message: 'Inscription réussie. Veuillez vérifier votre email pour activer votre compte.', + message: 'Inscription réussie.', user: { id: user.id, email: user.email, diff --git a/src/controllers/draw.controller.js b/src/controllers/draw.controller.js index 0ee370c8..0691bb0e 100644 --- a/src/controllers/draw.controller.js +++ b/src/controllers/draw.controller.js @@ -3,6 +3,7 @@ */ import { pool } from '../../db.js'; import { AppError, asyncHandler } from '../middleware/errorHandler.js'; +import { sendDrawWinnerEmail } from '../services/email.service.js'; /** * Récupérer la liste des participants éligibles @@ -179,6 +180,14 @@ export const conductDraw = asyncHandler(async (req, res) => { console.log(` Participants éligibles: ${eligibleParticipants.length}`); console.log(` Total participants: ${totalParticipants}`); + // Envoyer l'email de notification au gagnant + try { + await sendDrawWinnerEmail(winner.email, winner.first_name, prizeName || 'Un an de thé d\'une valeur de 360€'); + console.log(` 📧 Email de notification envoyé à ${winner.email}`); + } catch (error) { + console.error('Erreur envoi email au gagnant:', error); + } + res.json({ success: true, message: 'Tirage au sort effectué avec succès!', diff --git a/src/controllers/user.controller.js b/src/controllers/user.controller.js index a975b5c9..d50416a2 100644 --- a/src/controllers/user.controller.js +++ b/src/controllers/user.controller.js @@ -4,6 +4,7 @@ import bcrypt from 'bcrypt'; import { pool } from '../../db.js'; import { AppError, asyncHandler } from '../middleware/errorHandler.js'; +import { sendAccountDeletedEmail } from '../services/email.service.js'; /** * Récupérer le profil de l'utilisateur connecté @@ -167,9 +168,23 @@ export const changePassword = asyncHandler(async (req, res, next) => { export const deleteAccount = asyncHandler(async (req, res) => { const userId = req.user.id; + // Récupérer les infos de l'utilisateur avant suppression + const userResult = await pool.query( + 'SELECT email, first_name FROM users WHERE id = $1', + [userId] + ); + const user = userResult.rows[0]; + // Supprimer l'utilisateur (les tickets seront supprimés en cascade) await pool.query('DELETE FROM users WHERE id = $1', [userId]); + // Envoyer l'email de confirmation de suppression + try { + await sendAccountDeletedEmail(user.email, user.first_name); + } catch (error) { + console.error('Erreur envoi email de suppression:', error); + } + res.json({ success: true, message: 'Compte supprimé avec succès', diff --git a/src/services/email.service.js b/src/services/email.service.js index 1e912ab9..a9edf9ed 100644 --- a/src/services/email.service.js +++ b/src/services/email.service.js @@ -320,9 +320,235 @@ export const sendContactEmail = async ({ fullName, email, subject, message }) => }); }; +/** + * Envoie un email de bienvenue à l'inscription + */ +export const sendWelcomeEmail = async (email, firstName) => { + const loginUrl = `${process.env.FRONTEND_URL || 'http://localhost:3000'}/login`; + + const html = ` + + + + + + +
+
+

🍵 Bienvenue chez Thé Tip Top!

+
+
+

Bonjour ${firstName}!

+

Nous sommes ravis de vous accueillir dans notre jeu-concours Thé Tip Top!

+ +
+
🎟️ Participez au jeu - Entrez vos codes tickets pour tenter de gagner
+
🎁 Gagnez des lots - 100% des tickets sont gagnants!
+
🏆 Gros lot - Tentez de remporter un an de thé d'une valeur de 360€
+
+ +

Vous pouvez dès maintenant participer au jeu en vous connectant à votre compte:

+ +
+ Accéder à mon compte +
+ +

+ Bonne chance et merci de votre participation! +

+
+ +
+ + + `; + + const text = ` + Bienvenue chez Thé Tip Top! + + Bonjour ${firstName}! + + Nous sommes ravis de vous accueillir dans notre jeu-concours Thé Tip Top! + + - Participez au jeu en entrant vos codes tickets + - 100% des tickets sont gagnants! + - Tentez de remporter le gros lot: un an de thé d'une valeur de 360€ + + Connectez-vous pour participer: ${loginUrl} + + Bonne chance! + `; + + return sendEmail({ + to: email, + subject: '🍵 Bienvenue au jeu-concours Thé Tip Top!', + html, + text, + }); +}; + +/** + * Envoie un email de confirmation de suppression de compte + */ +export const sendAccountDeletedEmail = async (email, firstName) => { + const html = ` + + + + + + +
+
+

👋 Au revoir ${firstName}!

+
+
+

Votre compte a été supprimé

+

Nous vous confirmons que votre compte Thé Tip Top a bien été supprimé.

+ +

Toutes vos données personnelles ont été effacées de notre système conformément à la réglementation RGPD.

+ +

Nous espérons vous revoir bientôt parmi nous!

+ +

+ Si vous n'êtes pas à l'origine de cette demande, veuillez nous contacter immédiatement. +

+
+ +
+ + + `; + + const text = ` + Au revoir ${firstName}! + + Votre compte a été supprimé. + + Nous vous confirmons que votre compte Thé Tip Top a bien été supprimé. + Toutes vos données personnelles ont été effacées de notre système. + + Nous espérons vous revoir bientôt parmi nous! + + Si vous n'êtes pas à l'origine de cette demande, veuillez nous contacter immédiatement. + `; + + return sendEmail({ + to: email, + subject: '👋 Confirmation de suppression de compte - Thé Tip Top', + html, + text, + }); +}; + +/** + * Envoie un email au gagnant du tirage au sort + */ +export const sendDrawWinnerEmail = async (email, firstName, prizeName) => { + const html = ` + + + + + + +
+
+

🎊 FÉLICITATIONS ${firstName.toUpperCase()}! 🎊

+

Vous êtes le GRAND GAGNANT du tirage au sort!

+
+
+
🎉🎈🎁🏆🎈🎉
+ +
+

Vous avez remporté:

+

🏆 ${prizeName} 🏆

+

D'une valeur de 360€!

+
+ +

Vous avez été sélectionné parmi tous les participants au jeu-concours Thé Tip Top pour remporter notre gros lot!

+ +

Pour récupérer votre gain:

+ + +

+ Merci d'avoir participé au jeu-concours Thé Tip Top!
+ Toute l'équipe vous félicite chaleureusement! 🍵 +

+
+ +
+ + + `; + + const text = ` + 🎊 FÉLICITATIONS ${firstName.toUpperCase()}! 🎊 + + Vous êtes le GRAND GAGNANT du tirage au sort Thé Tip Top! + + Vous avez remporté: ${prizeName} + D'une valeur de 360€! + + Vous avez été sélectionné parmi tous les participants pour remporter notre gros lot! + + Pour récupérer votre gain: + - Nous vous contacterons très prochainement + - Veuillez vous munir d'une pièce d'identité + - Vous pouvez également nous contacter directement + + Merci d'avoir participé au jeu-concours Thé Tip Top! + Toute l'équipe vous félicite chaleureusement! + `; + + return sendEmail({ + to: email, + subject: '🎊 FÉLICITATIONS! Vous êtes le GRAND GAGNANT du tirage Thé Tip Top!', + html, + text, + }); +}; + export default { sendVerificationEmail, sendResetPasswordEmail, sendPrizeWinEmail, sendContactEmail, + sendWelcomeEmail, + sendAccountDeletedEmail, + sendDrawWinnerEmail, };