const express = require("express"); const { register, login, verifyEmail, verifyCode, forgotPassword, resetPassword, me, changePassword, deleteAccount, oauthCallback } = require("../controllers/auth.controller"); const authMiddleware = require("../middlewares/auth.middleware"); const validate = require("../middlewares/validate.middleware"); const { registerSchema, loginSchema } = require("../validations/auth.validation"); const { passport, googleEnabled } = require("../config/passport"); const router = express.Router(); /** * @swagger * /api/auth/register: * post: * summary: Inscription d'un utilisateur * tags: * - Auth * requestBody: * required: true * content: * application/json: * schema: * type: object * properties: * firstname: * type: string * lastname: * type: string * email: * type: string * password: * type: string * responses: * 201: * description: Utilisateur créé */ router.post("/register", validate(registerSchema), register); /** * @swagger * /api/auth/login: * post: * summary: Connexion utilisateur * tags: * - Auth * requestBody: * required: true * responses: * 200: * description: Connexion réussie */ router.post("/login", validate(loginSchema), login); /** * @swagger * /api/auth/me: * get: * summary: Informations de l'utilisateur connecté * tags: * - Auth * security: * - bearerAuth: [] * responses: * 200: * description: Profil utilisateur */ router.get("/me", authMiddleware, me); /** * @swagger * /api/auth/verify-email/{token}: * get: * summary: Vérification de l'adresse email * tags: * - Auth * parameters: * - in: path * name: token * required: true * schema: * type: string * description: Token de validation envoyé par email * responses: * 200: * description: Email vérifié avec succès. * 400: * description: Lien de validation invalide ou expiré. * 500: * description: Erreur serveur. */ router.get("/verify-email/:token",verifyEmail); /** * @swagger * /api/auth/forgot-password: * post: * summary: Demande de réinitialisation du mot de passe * tags: * - Auth * requestBody: * required: true * content: * application/json: * schema: * type: object * required: * - email * properties: * email: * type: string * format: email * example: jean.dupont@gmail.com * responses: * 200: * description: Si un compte existe avec cet email, un lien de réinitialisation a été envoyé. * 400: * description: Email requis. * 500: * description: Erreur serveur. */ router.post("/forgot-password", forgotPassword); /** * @swagger * /api/auth/reset-password/{token}: * post: * summary: Réinitialisation du mot de passe * tags: * - Auth * parameters: * - in: path * name: token * required: true * schema: * type: string * description: Token de réinitialisation reçu par email * requestBody: * required: true * content: * application/json: * schema: * type: object * required: * - password * properties: * password: * type: string * format: password * example: NouveauPassword123 * responses: * 200: * description: Mot de passe réinitialisé avec succès. * 400: * description: Lien invalide, expiré ou mot de passe invalide. * 500: * description: Erreur serveur. */ router.post("/reset-password/:token", resetPassword); router.post("/verify-code", verifyCode); router.patch("/change-password", authMiddleware, changePassword); router.delete("/account", authMiddleware, deleteAccount); /** * @swagger * /api/auth/google: * get: * summary: Démarre la connexion via Google (redirection OAuth 2.0) * tags: * - Auth * responses: * 302: * description: Redirection vers l'écran de consentement Google. * 503: * description: Connexion Google non configurée sur ce serveur. */ /** * @swagger * /api/auth/google/callback: * get: * summary: Retour de Google, émet le JWT et redirige vers le front * tags: * - Auth * responses: * 302: * description: Redirection vers FRONTEND_URL/auth/callback avec le token. */ if (googleEnabled) { router.get( "/google", passport.authenticate("google", { scope: ["profile", "email"], session: false }) ); router.get( "/google/callback", passport.authenticate("google", { session: false, failureRedirect: `${process.env.FRONTEND_URL || "http://localhost:5173"}/auth/callback?error=${encodeURIComponent( "Connexion Google refusée." )}`, }), oauthCallback ); } else { // Sans identifiants configurés, on répond explicitement plutôt que de // laisser passport planter au démarrage. const notConfigured = (req, res) => res.status(503).json({ message: "La connexion Google n'est pas configurée sur ce serveur." }); router.get("/google", notConfigured); router.get("/google/callback", notConfigured); } module.exports = router;