the-tip-top-backend/src/services/newsletter.service.js
soufiane 4759ce99e7 feat: add newsletter subscription feature
- Add newsletter database table migration
- Create newsletter controller with subscribe/unsubscribe endpoints
- Add newsletter routes and validation
- Implement newsletter service with email validation
- Add setup documentation and migration scripts
- Include test page for newsletter functionality

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 00:07:44 +01:00

132 lines
4.2 KiB
JavaScript

/**
* Service Newsletter
*/
import nodemailer from 'nodemailer';
import dotenv from 'dotenv';
dotenv.config();
// Configuration du transporteur email (réutilise la config du service email)
const createTransporter = () => {
if (process.env.NODE_ENV === 'development' && !process.env.SMTP_HOST) {
console.log('⚠️ Mode développement: Les emails seront affichés dans la console');
return null;
}
return nodemailer.createTransport({
host: process.env.SMTP_HOST,
port: parseInt(process.env.SMTP_PORT) || 587,
secure: process.env.SMTP_PORT === '465',
auth: {
user: process.env.SMTP_USER,
pass: process.env.SMTP_PASS,
},
});
};
const transporter = createTransporter();
/**
* Fonction générique pour envoyer un email
*/
const sendEmail = async ({ to, subject, html, text }) => {
try {
if (!transporter) {
console.log('📧 Email qui aurait été envoyé:');
console.log('To:', to);
console.log('Subject:', subject);
console.log('Content:', text || html);
return { success: true, mode: 'dev' };
}
const mailOptions = {
from: process.env.EMAIL_FROM || 'noreply@thetiptop.fr',
to,
subject,
text,
html,
};
const info = await transporter.sendMail(mailOptions);
console.log('✅ Email envoyé:', info.messageId);
return { success: true, messageId: info.messageId };
} catch (error) {
console.error('❌ Erreur envoi email:', error);
throw new Error('Erreur lors de l\'envoi de l\'email');
}
};
/**
* Envoie un email de confirmation d'abonnement à la newsletter
*/
export const sendNewsletterConfirmationEmail = async (email) => {
const unsubscribeUrl = `${process.env.FRONTEND_URL || 'http://localhost:3000'}/newsletter/unsubscribe?email=${encodeURIComponent(email)}`;
const html = `
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial, sans-serif; line-height: 1.6; color: #333; }
.container { max-width: 600px; margin: 0 auto; padding: 20px; }
.header { background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); color: white; padding: 30px; text-align: center; border-radius: 10px 10px 0 0; }
.content { background: #f9f9f9; padding: 30px; border-radius: 0 0 10px 10px; }
.footer { text-align: center; margin-top: 20px; color: #666; font-size: 12px; }
.unsubscribe { margin-top: 30px; padding-top: 20px; border-top: 1px solid #ddd; }
.unsubscribe a { color: #999; text-decoration: none; }
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>🍵 Bienvenue dans notre newsletter!</h1>
</div>
<div class="content">
<h2>Merci de votre abonnement</h2>
<p>Nous sommes ravis de vous compter parmi nos abonnés !</p>
<p>Vous recevrez désormais nos dernières actualités, offres exclusives et nouveautés directement dans votre boîte mail.</p>
<p>Restez connecté avec Thé Tip Top pour découvrir :</p>
<ul>
<li>🍵 Nos nouveaux thés et infusions</li>
<li>🎁 Des offres spéciales réservées aux abonnés</li>
<li>📰 Les actualités de nos boutiques</li>
<li>🎉 Les résultats de nos jeux-concours</li>
</ul>
<div class="unsubscribe">
<p style="font-size: 12px; color: #999;">
Vous ne souhaitez plus recevoir nos emails ? <a href="${unsubscribeUrl}">Se désabonner</a>
</p>
</div>
</div>
<div class="footer">
<p>© 2025 Thé Tip Top - Tous droits réservés</p>
</div>
</div>
</body>
</html>
`;
const text = `
Bienvenue dans notre newsletter!
Nous sommes ravis de vous compter parmi nos abonnés !
Vous recevrez désormais nos dernières actualités, offres exclusives et nouveautés directement dans votre boîte mail.
Pour vous désabonner: ${unsubscribeUrl}
© 2025 Thé Tip Top - Tous droits réservés
`;
return sendEmail({
to: email,
subject: '🍵 Bienvenue dans la newsletter Thé Tip Top',
html,
text,
});
};
export default {
sendNewsletterConfirmationEmail,
};