// packages/core/middlewares/src/requireAuth.mjs // @suitecoffee/middlewares/src/requireAuth.mjs /** * requireAuth * Verifica que exista una sesión válida en req.session.user (con `sub`). * - Si hay sesión, llama a next(). * - Si no hay sesión: * - Si se define `redirectTo`, redirige (302) cuando el cliente acepta HTML. * - En caso contrario, responde 401 con { error: 'unauthenticated' }. * * @param {Object} [options] * @param {string|null} [options.redirectTo=null] Ruta a la que redirigir si no hay sesión (p.ej. '/auth/login') * @param {(req: import('express').Request) => any} [options.getSessionUser] Cómo leer el usuario de la sesión * @returns {import('express').RequestHandler} * * Uso típico: * import { requireAuth } from '@suitecoffee/middlewares'; * app.get('/me', requireAuth(), (req,res)=> res.json({ user: req.session.user })); * app.get('/dashboard', requireAuth({ redirectTo: '/auth/login' }), handler); */ export function requireAuth(options = {}) { const { redirectTo = null, getSessionUser = (req) => req?.session?.user, } = options; return function requireAuthMiddleware(req, res, next) { const user = getSessionUser(req); if (user && user.sub) { return next(); } // Si el cliente acepta HTML y tenemos redirectTo, redirigimos (útil para front web) if (redirectTo && req.accepts('html')) { return res.redirect(302, redirectTo); } // Fallback JSON return res.status(401).json({ error: 'unauthenticated' }); }; }