diff --git a/server.js b/server.js index 47b6c08..45bab46 100644 --- a/server.js +++ b/server.js @@ -1,47 +1,52 @@ -// contactRoutes.js +const nodemailer = require('nodemailer'); const express = require('express'); -const router = express.Router(); +const path = require('path'); +const { Pool } = require('pg'); const rateLimit = require('express-rate-limit'); -const { body, validationResult } = require('express-validator'); +require('dotenv').config(); +const app = express(); +const port = process.env.SERVER_PORT || 3000; -// The entire module is now a function that accepts 'contactController' and security middleware as an argument. -module.exports = (contactController, securityMw) => { - - // 🛡️ Configure rate limiting to prevent DDoS and spamming - const apiLimiter = rateLimit({ - windowMs: 15 * 60 * 1000, // 15 minutes - max: 5, - message: "Too many requests from this IP, please try again after 15 minutes." - }); +// Middleware to parse incoming JSON data from the frontend +app.use(express.json()); - // Define the route for form submissions with all middleware - router.post('/submit-form', - apiLimiter, - // The security middleware is now a separate step, - // containing both the honeypot check and hCaptcha verification. - securityMw.formSecurityCheck, - [ - // express-validator: sanitation and validation - body('firstName').trim().escape(), - body('lastName').trim().escape(), - body('email').isEmail().normalizeEmail(), - body('organization').trim().escape(), - body('phone').trim(), - body('message').trim().escape(), - ], - // Middleware to handle the express-validator results - (req, res, next) => { - const errors = validationResult(req); - if (!errors.isEmpty()) { - console.error('Validation failed:', errors.array()); - return res.status(400).json({ success: false, message: 'Invalid form data.' }); - } - next(); - }, - // The controller, which is the final step - contactController.submitForm - ); +// Middleware to serve static files (like index.html, styles.css, script.js) +const STATIC_DIR = process.env.STATIC_DIR || 'public' +app.use(express.static(path.join(__dirname, STATIC_DIR))); - // Return the configured router - return router; -}; \ No newline at end of file +// Database connection pool setup using environment variables for security +const pool = new Pool({ + user: process.env.DB_USER, + host: process.env.DB_HOST, + database: process.env.DB_DATABASE, + password: process.env.DB_PASSWORD, + port: process.env.DB_PORT, +}); + +// Nodemailer transporter setup for sending emails +const transporter = nodemailer.createTransport({ + host: process.env.EMAIL_HOST, + port: process.env.EMAIL_PORT, + secure: false, + requireTLS: true, + auth: { + user: process.env.EMAIL_USER, + pass: process.env.EMAIL_PASS, + }, +}); + +const contactController = require('./controllers/contactController')(pool, transporter); + +// Import the security middleware +const securityMw = require('./middleware/securityMw'); + +// Import contactRoutes and contactController, and pass in securityMw +const contactRoutes = require('./routes/contactRoutes')(contactController, securityMw); + +// Use contactRoutes to connect the modular router to the main app +app.use(contactRoutes); + +// Start the server +app.listen(port, () => { + console.log(`Server listening at http://localhost:${port}`); +}); \ No newline at end of file