const express = require("express"); const cors = require("cors"); const helmet = require("helmet"); const rateLimit = require("express-rate-limit"); require("dotenv").config(); const authRoutes = require("./routes/auth.routes"); const gameRoutes = require("./routes/game.routes"); const employeeRoutes = require("./routes/employee.routes"); const adminRoutes = require("./routes/admin.routes"); const swaggerUi = require("swagger-ui-express"); const swaggerSpec = require("./docs/swagger"); const { passport } = require("./config/passport"); const app = express(); const allowedOrigins = (process.env.FRONTEND_URL || "http://localhost:5173").split(","); // La CSP par défaut de helmet bloque les scripts inline de Swagger UI : // on l'applique partout sauf sur /api-docs, où une CSP dédiée (désactivée) // est posée juste avant de monter Swagger, plus bas. app.use((req, res, next) => { if (req.path.startsWith("/api-docs")) return next(); return helmet()(req, res, next); }); app.use(cors({ origin: allowedOrigins })); app.use(express.json()); // OAuth stateless : initialize() suffit, aucune session n'est ouverte. app.use(passport.initialize()); // Anti-bruteforce sur les routes d'authentification uniquement : 20 // tentatives par IP toutes les 15 minutes, sans limiter le reste de l'API // (participation au jeu, consultation des gains, etc.). const authLimiter = rateLimit({ windowMs: 15 * 60 * 1000, limit: 20, standardHeaders: true, legacyHeaders: false, message: { message: "Trop de tentatives, réessayez dans quelques minutes." }, }); app.use("/api/auth/login", authLimiter); app.use("/api/auth/register", authLimiter); app.use("/api/auth/forgot-password", authLimiter); // routes app.use("/api/auth", authRoutes); app.use("/api/game", gameRoutes); app.use("/api/employee", employeeRoutes); app.use("/api/admin", adminRoutes); // swagger app.use("/api-docs", helmet({ contentSecurityPolicy: false }), swaggerUi.serve, swaggerUi.setup(swaggerSpec)); // test route app.get("/", (req, res) => { res.json({ message: "API Thé Tip Top opérationnelle" }); }); module.exports = app;