All files / routes auth.js

57.81% Statements 37/64
65.38% Branches 17/26
40% Functions 2/5
57.81% Lines 37/64

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 1531x 1x 1x     1x 2x 2x     2x         2x 2x         2x       2x     2x 2x 1x       1x             1x   1x                               1x 2x 2x     2x       2x     2x   2x 1x 1x     1x     1x 1x               1x                 1x     1x   1x   1x                     1x                                         1x                           1x
const express = require('express');
const router = express.Router();
const { usuariosService } = require('../services/db');
 
// Registro de usuario
router.post('/register', async (req, res) => {
  try {
    const { email, password, name, apellidos = '' } = req.body;
    
    // Validar datos
    Iif (!email || !password || !name) {
      return res.status(400).json({ error: 'Email, contraseña y nombre son requeridos' });
    }
    
    // Validar formato de email
    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
    Iif (!emailRegex.test(email)) {
      return res.status(400).json({ error: 'Formato de email inválido' });
    }
    
    // Validar longitud de contraseña
    Iif (password.length < 6) {
      return res.status(400).json({ error: 'La contraseña debe tener al menos 6 caracteres' });
    }
    
    console.log('Iniciando registro para:', email);
    
    // Verificar si el email ya existe
    const emailExiste = await usuariosService.verificarEmailExiste(email);
    if (emailExiste) {
      return res.status(400).json({ error: 'El email ya está registrado' });
    }
    
    // Crear usuario en la base de datos
    const nuevoUsuario = await usuariosService.crearUsuario({
      email,
      password, // Contraseña en texto plano
      nombre: name,
      apellidos: apellidos
    });
    
    console.log('Usuario creado:', nuevoUsuario.id);
    
    return res.status(201).json({ 
      message: 'Usuario registrado correctamente', 
      user: {
        id: nuevoUsuario.id,
        email: nuevoUsuario.correo_electronico,
        nombre: nuevoUsuario.nombre,
        apellidos: nuevoUsuario.apellidos
      }
    });
  } catch (error) {
    console.error('Error general en registro:', error);
    return res.status(500).json({ error: 'Error interno del servidor' });
  }
});
 
// Inicio de sesión
router.post('/login', async (req, res) => {
  try {
    const { email, password } = req.body;
    
    // Validar datos
    Iif (!email || !password) {
      return res.status(400).json({ error: 'Email y contraseña son requeridos' });
    }
    
    console.log('Intento de login para:', email);
    
    // Verificar credenciales
    const usuario = await usuariosService.verificarCredenciales(email, password);
    
    if (!usuario) {
      console.log('Credenciales inválidas para:', email);
      return res.status(401).json({ error: 'Credenciales inválidas' });
    }
    
    console.log('Login exitoso para:', usuario.correo_electronico);
    
    // Actualizar último inicio de sesión
    try {
      await usuariosService.actualizarUsuario(usuario.id, {
        ultimo_inicio_sesion_en: new Date().toISOString()
      });
    } catch (updateError) {
      console.error('Error al actualizar último inicio de sesión:', updateError);
    }
    
    // Crear objeto de usuario para la sesión
    const sessionUser = {
      id: usuario.id,
      email: usuario.correo_electronico,
      nombre: usuario.nombre || 'Usuario',
      apellidos: usuario.apellidos || '',
      esta_activo: usuario.esta_activo !== false
    };
    
    // Calcular nombre completo
    sessionUser.nombre_completo = `${sessionUser.nombre} ${sessionUser.apellidos}`.trim();
    
    // Guardar información del usuario en la sesión
    req.session.user = sessionUser;
    
    console.log('Sesión creada para:', sessionUser.email);
    
    return res.status(200).json({ 
      message: 'Inicio de sesión exitoso', 
      user: sessionUser 
    });
  } catch (error) {
    console.error('Error general en login:', error);
    return res.status(500).json({ error: 'Error interno del servidor' });
  }
});
 
// Cerrar sesión
router.post('/logout', async (req, res) => {
  try {
    console.log('Cerrando sesión para usuario:', req.session.user?.email);
    
    // Destruir sesión
    req.session.destroy((err) => {
      if (err) {
        console.error('Error al destruir sesión:', err);
        return res.status(500).json({ error: 'Error al cerrar sesión' });
      }
      res.clearCookie('connect.sid');
      console.log('Sesión cerrada correctamente');
      return res.status(200).json({ message: 'Sesión cerrada correctamente' });
    });
  } catch (error) {
    console.error('Error general al cerrar sesión:', error);
    return res.status(500).json({ error: 'Error interno del servidor' });
  }
});
 
// Verificar si el usuario está autenticado
router.get('/user', async (req, res) => {
  try {
    if (req.session.user) {
      console.log('Usuario autenticado desde sesión:', req.session.user.email);
      return res.status(200).json({ user: req.session.user });
    }
    
    return res.status(401).json({ error: 'No autenticado' });
  } catch (error) {
    console.error('Error al verificar sesión:', error);
    return res.status(500).json({ error: 'Error interno del servidor' });
  }
});
 
module.exports = router;