From 6d7c536a7eb85015ccd03783b90b7b40ebc156f5 Mon Sep 17 00:00:00 2001 From: soufiane Date: Mon, 24 Nov 2025 11:38:08 +0100 Subject: [PATCH] feat: add contact form email functionality MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add SMTP configuration in all .env files - Create sendContactEmail function in email service - Add contact controller with form validation - Create contact API route (POST /api/contact) - Register contact route in main index.js - Emails sent to thetiptopgr3@gmail.com 🤖 Generated with Claude Code Co-Authored-By: Claude --- .env | 6 +++ .env.dev | 7 +++ .env.preprod | 7 +++ .env.production | 7 +++ index.js | 2 + src/controllers/contact.controller.js | 55 +++++++++++++++++++++ src/routes/contact.routes.js | 12 +++++ src/services/email.service.js | 70 +++++++++++++++++++++++++++ 8 files changed, 166 insertions(+) create mode 100644 src/controllers/contact.controller.js create mode 100644 src/routes/contact.routes.js diff --git a/.env b/.env index c14982d2..1b963649 100755 --- a/.env +++ b/.env @@ -14,3 +14,9 @@ FACEBOOK_APP_SECRET=e6889f4339d140c218f1df177149893f JWT_SECRET=thetiptopsecret SESSION_SECRET=thetiptopsessionsecret +# Email Configuration (SMTP) +SMTP_HOST=smtp.gmail.com +SMTP_PORT=587 +SMTP_USER=thetiptopgr3@gmail.com +SMTP_PASS=Dsp@2025 +EMAIL_FROM=thetiptopgr3@gmail.com diff --git a/.env.dev b/.env.dev index 288ad2f4..f7181dd2 100644 --- a/.env.dev +++ b/.env.dev @@ -20,3 +20,10 @@ GOOGLE_CLIENT_ID=546665126481-itnlvt22hjn6t0bbgua0aj55h6dpplsk.apps.googleuserco GOOGLE_CLIENT_SECRET=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 FACEBOOK_APP_ID=836681122652445 FACEBOOK_APP_SECRET=e6889f4339d140c218f1df177149893f + +# Email Configuration (SMTP) +SMTP_HOST=smtp.gmail.com +SMTP_PORT=587 +SMTP_USER=thetiptopgr3@gmail.com +SMTP_PASS=Dsp@2025 +EMAIL_FROM=thetiptopgr3@gmail.com diff --git a/.env.preprod b/.env.preprod index 67943ee6..259e1f5d 100644 --- a/.env.preprod +++ b/.env.preprod @@ -20,3 +20,10 @@ GOOGLE_CLIENT_ID=546665126481-itnlvt22hjn6t0bbgua0aj55h6dpplsk.apps.googleuserco GOOGLE_CLIENT_SECRET=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 FACEBOOK_APP_ID=836681122652445 FACEBOOK_APP_SECRET=e6889f4339d140c218f1df177149893f + +# Email Configuration (SMTP) +SMTP_HOST=smtp.gmail.com +SMTP_PORT=587 +SMTP_USER=thetiptopgr3@gmail.com +SMTP_PASS=Dsp@2025 +EMAIL_FROM=thetiptopgr3@gmail.com diff --git a/.env.production b/.env.production index 17ecde8b..5819a3f2 100644 --- a/.env.production +++ b/.env.production @@ -20,3 +20,10 @@ GOOGLE_CLIENT_ID=546665126481-itnlvt22hjn6t0bbgua0aj55h6dpplsk.apps.googleuserco GOOGLE_CLIENT_SECRET=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 FACEBOOK_APP_ID=836681122652445 FACEBOOK_APP_SECRET=e6889f4339d140c218f1df177149893f + +# Email Configuration (SMTP) +SMTP_HOST=smtp.gmail.com +SMTP_PORT=587 +SMTP_USER=thetiptopgr3@gmail.com +SMTP_PASS=Dsp@2025 +EMAIL_FROM=thetiptopgr3@gmail.com diff --git a/index.js b/index.js index 41c6a210..0de5f80f 100644 --- a/index.js +++ b/index.js @@ -15,6 +15,7 @@ import employeeRoutes from "./src/routes/employee.routes.js"; import adminRoutes from "./src/routes/admin.routes.js"; import drawRoutes from "./src/routes/draw.routes.js"; import newsletterRoutes from "./src/routes/newsletter.routes.js"; +import contactRoutes from "./src/routes/contact.routes.js"; const app = express(); @@ -91,6 +92,7 @@ app.use("/api/employee", employeeRoutes); app.use("/api/admin", adminRoutes); app.use("/api/draw", drawRoutes); app.use("/api/newsletter", newsletterRoutes); +app.use("/api/contact", contactRoutes); // Error handler (doit être après les routes) app.use(errorHandler); diff --git a/src/controllers/contact.controller.js b/src/controllers/contact.controller.js new file mode 100644 index 00000000..c963f773 --- /dev/null +++ b/src/controllers/contact.controller.js @@ -0,0 +1,55 @@ +/** + * Contrôleur pour gérer les messages de contact + */ +import { sendContactEmail } from '../services/email.service.js'; + +/** + * POST /api/contact + * Envoi d'un message depuis le formulaire de contact + */ +export const submitContactForm = async (req, res) => { + try { + const { fullName, email, subject, message } = req.body; + + // Validation simple + if (!fullName || !email || !subject || !message) { + return res.status(400).json({ + success: false, + message: 'Tous les champs sont requis' + }); + } + + // Validation email + const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailRegex.test(email)) { + return res.status(400).json({ + success: false, + message: 'Adresse email invalide' + }); + } + + // Envoyer l'email + await sendContactEmail({ + fullName, + email, + subject, + message + }); + + res.status(200).json({ + success: true, + message: 'Votre message a été envoyé avec succès. Nous vous répondrons dans les plus brefs délais.' + }); + + } catch (error) { + console.error('Erreur lors de l\'envoi du message de contact:', error); + res.status(500).json({ + success: false, + message: 'Une erreur est survenue lors de l\'envoi de votre message. Veuillez réessayer.' + }); + } +}; + +export default { + submitContactForm +}; diff --git a/src/routes/contact.routes.js b/src/routes/contact.routes.js new file mode 100644 index 00000000..e5314725 --- /dev/null +++ b/src/routes/contact.routes.js @@ -0,0 +1,12 @@ +/** + * Routes pour le formulaire de contact + */ +import { Router } from 'express'; +import * as contactController from '../controllers/contact.controller.js'; + +const router = Router(); + +// Route publique - Envoi du formulaire de contact +router.post('/', contactController.submitContactForm); + +export default router; diff --git a/src/services/email.service.js b/src/services/email.service.js index 2f804035..c201c7df 100644 --- a/src/services/email.service.js +++ b/src/services/email.service.js @@ -248,8 +248,78 @@ export const sendPrizeWinEmail = async (email, prizeName, firstName) => { }); }; +/** + * Envoie un email depuis le formulaire de contact + */ +export const sendContactEmail = async ({ fullName, email, subject, message }) => { + const html = ` + + + + + + +
+
+

📬 Nouveau message de contact

+
+
+

Formulaire de contact

+ +
+ De: ${fullName}
+ Email: ${email}
+ Sujet: ${subject} +
+ +
+ Message:
+

${message}

+
+ +

+ Pour répondre à ce message, envoyez un email à: ${email} +

+
+ +
+ + + `; + + const text = ` + Nouveau message de contact + + De: ${fullName} + Email: ${email} + Sujet: ${subject} + + Message: + ${message} + + Pour répondre, envoyez un email à: ${email} + `; + + return sendEmail({ + to: process.env.EMAIL_FROM || 'thetiptopgr3@gmail.com', + subject: `[Contact] ${subject}`, + html, + text, + }); +}; + export default { sendVerificationEmail, sendResetPasswordEmail, sendPrizeWinEmail, + sendContactEmail, };