import Conexion from './Conexion.js'; import Usuario from '../Model/Usuario.js'; import Mensaje from '../Model/Mensaje.js'; import DAORegistro from './DAORegistro.js'; import logger from '../utils/logger.js'; class DAO { static async matriculas() { const conexion = new Conexion(); const conexionEstablecida = await conexion.conectar(); try { const sql = `SELECT U.id, U.matricula FROM usuario U WHERE U.id NOT IN (SELECT I.idUsuario FROM inscripcion I, usuario U WHERE U.id = I.idUsuario) AND U.inscrito = 1;`; const [rows] = await conexionEstablecida.query(sql); const resultado = rows.map(row => { return { id: row.id, matricula: row.matricula }; }); return resultado; } catch (error) { logger.error(`Error en DAO.matriculas: ${error.message}`); return []; } finally { conexion.cerrarConexion(); } } static async validarAlumno(alumno) { const conexion = new Conexion(); const conexionEstablecida = await conexion.conectar(); try { const sql = `SELECT * FROM usuario WHERE matricula = ? AND contrasena = ?`; const [rows] = await conexionEstablecida.query(sql, [alumno.getMatricula(), alumno.getContrasena()]); return rows.length > 0; } catch (error) { logger.error(`Error en DAO.validarAlumno: ${error.message}`); return false; } finally { conexion.cerrarConexion(); } } static async agregarAlumno(usuario) { const conexion = new Conexion(); const conexionEstablecida = await conexion.conectar(); try { const ultimoID = await this.obtenerUltimoID(); const matricula = "SIU24" + (1000 + ultimoID); const password = this.crearContrasena(); usuario.contrasena = password; usuario.matricula = matricula; const sql = `INSERT INTO usuario (nombre, apellido, nacionalidad, matricula, contrasena, correo, rol) VALUES (?, ?, ?, ?, ?, ?, ?)`; const [result] = await conexionEstablecida.query(sql, [ usuario.nombre, usuario.apellido, usuario.nacionalidad, usuario.matricula, usuario.contrasena, usuario.correo, usuario.rol ]); if (result.affectedRows > 0) { await DAORegistro.registrar(usuario, "Alumno agregado", new Date()); logger.info(`Usuario agregado ${usuario.matricula}`); return new Mensaje(true, usuario.matricula, usuario.contrasena); } else { return new Mensaje(false, null); } } catch (error) { logger.error(`Error en DAO.agregarAlumno: ${error.message}`); return new Mensaje(false, null); } finally { conexion.cerrarConexion(); } } static async editarAlumno(usuario) { const conexion = new Conexion(); const conexionEstablecida = await conexion.conectar(); try { const sql = `UPDATE usuario SET nombre = ?, apellido = ?, correo = ?, nacionalidad = ?, tipoSangre = ?, fecha_nacimiento = ?, curp = ?, idCarrera = ? WHERE id = ?`; const [result] = await conexionEstablecida.query(sql, [ usuario.nombre, usuario.apellido, usuario.correo, usuario.nacionalidad, usuario.tipoSangre, usuario.fecha_nacimiento, usuario.curp, usuario.idCarrera, usuario.id ]); if (result.affectedRows > 0) { await DAORegistro.registrar(usuario, "Alumno editado", new Date()); logger.info(`Usuario Editado ${usuario.matricula}`); return true; } return false; } catch (error) { logger.error(`Error en DAO.editarAlumno: ${error.message}`); return false; } finally { conexion.cerrarConexion(); } } static async alumnoIniciado(matricula, contrasena) { const conexion = new Conexion(); const conexionEstablecida = await conexion.conectar(); try { const sql = `SELECT * FROM usuario WHERE matricula = ? AND contrasena = ?`; const [rows] = await conexionEstablecida.query(sql, [matricula, contrasena]); if (rows.length > 0) { const row = rows[0]; const usuario = new Usuario( row.id, row.nombre, row.apellido, row.matricula, row.contrasena, row.correo, row.nacionalidad, row.tipoSangre, row.fecha_nacimiento, row.curp, row.rol, row.idCarrera, row.inscrito ); await DAORegistro.registrar(usuario.matricula, "Inicio SesiĆ³n", new Date()); logger.info(`Iniciao sesion el usuario: ${usuario.matricula}`); return usuario; } return null; } catch (error) { logger.error(`Error en DAO.alumnoIniciado: ${error.message}`); return null; } finally { conexion.cerrarConexion(); } } static async obtenerUltimoID() { const conexion = new Conexion(); const conexionEstablecida = await conexion.conectar(); try { const sql = `SELECT MAX(id) AS ultimo_id FROM usuario`; const [rows] = await conexionEstablecida.query(sql); return rows[0].ultimo_id || -1; } catch (error) { logger.error(`Error en DAO.obtenerUltimoID: ${error.message}`); return -1; } finally { conexion.cerrarConexion(); } } static crearContrasena() { const CARACTERES_PERMITIDOS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789@#"; let contrasena = ''; for (let i = 0; i < 10; i++) { const index = Math.floor(Math.random() * CARACTERES_PERMITIDOS.length); contrasena += CARACTERES_PERMITIDOS.charAt(index); } return contrasena; } static async traeUsuario(id) { const conexion = new Conexion(); const conexionEstablecida = await conexion.conectar(); let usuario = null; try { const sql = `SELECT id, nombre, apellido, matricula, correo, nacionalidad, tipoSangre, fecha_nacimiento, curp, rol, idCarrera, inscrito FROM usuario WHERE id = ?`; const [rows] = await conexionEstablecida.query(sql, [id]); if (rows.length > 0) { const row = rows[0]; // Convertir la fecha al formato "yyyy-MM-dd" const fechaNacimiento = new Date(row.fecha_nacimiento); const formattedDate = fechaNacimiento.toISOString().split('T')[0]; usuario = new Usuario( row.id, row.nombre, row.apellido, row.matricula, "", row.correo, row.nacionalidad, row.tipoSangre, formattedDate, row.curp, row.rol, row.idCarrera, row.inscrito ); } } catch (error) { logger.error(`Error en DAO.traeUsuario: ${error.message}`); } finally { conexion.cerrarConexion(); } return usuario; } static async editarAlumnoInscrito(data, id) { const conexion = new Conexion(); const conexionEstablecida = await conexion.conectar(); try { const sql = `UPDATE usuario SET inscrito = ? WHERE id = ?`; const [result] = await conexionEstablecida.query(sql, [ id, data.idUsuario ]); if (result.affectedRows > 0) { const usuario = new Usuario(); usuario.id = data.idUsuario; await DAORegistro.registrar(usuario, "Alumno inscrito", new Date()); return true; } return false; } catch (error) { logger.error(`Error en DAO.editarAlumnoInscrito: ${error.message}`); return false; } finally { conexion.cerrarConexion(); } } static async traeTodosLosDatosUsuario(id) { const conexion = new Conexion(); const conexionEstablecida = await conexion.conectar(); let usuario = null; try { const sql = `SELECT U.id, U.nombre, U.apellido, matricula, correo, nacionalidad, tipoSangre, fecha_nacimiento, curp, inscrito, T.nombre as tutorNombre, T.apellido as tutorApellido, T.numeroDeTelefono, C.nombre as carreraNombre, C.id as idCarrera FROM usuario U, tutor T, carrera C WHERE C.id = U.idCarrera AND U.id = T.idUsuario AND inscrito = 1 AND U.id = ?;`; const [rows] = await conexionEstablecida.query(sql, [id]); if (rows.length > 0) { const row = rows[0]; // Convertir la fecha al formato "yyyy-MM-dd" const fechaNacimiento = new Date(row.fecha_nacimiento); const formattedDate = fechaNacimiento.toISOString().split('T')[0]; usuario = { id: row.id, nombre: row.nombre, apellido: row.apellido, matricula: row.matricula, correo: row.correo, nacionalidad: row.nacionalidad, tipoSangre: row.tipoSangre, fecha_nacimiento: formattedDate, curp: row.curp, inscrito: row.inscrito, tutorNombre: row.tutorNombre, tutorApellido: row.tutorApellido, numeroDeTelefono: row.numeroDeTelefono, carreraNombre: row.carreraNombre, idCarrera: row.idCarrera }; } } catch (error) { logger.error(`Error en DAO.traeTodosLosDatosUsuario: ${error.message}`); } finally { conexion.cerrarConexion(); } return usuario; } static async inscribirUsuario(data) { const conexion = new Conexion(); const conexionEstablecida = await conexion.conectar(); try { const sql = `INSERT INTO inscripcion (idUsuario, idCarrera) VALUES (?, ?);`; const [result] = await conexionEstablecida.query(sql, [data.id, data.idCarrera]); if (result.affectedRows > 0) { const usuario = new Usuario(); usuario.id = data.id; await DAORegistro.registrar(usuario, "Usuario inscrito", new Date()); return true; } return false; } catch (error) { logger.error(`Error en DAO.inscribirUsuario: ${error.message}`); return false; } finally { conexion.cerrarConexion(); } } static async editarAlumnoRechazado(data, id) { const conexion = new Conexion(); const conexionEstablecida = await conexion.conectar(); try { const sql = `UPDATE usuario SET inscrito = ? WHERE id = ?`; const [result] = await conexionEstablecida.query(sql, [ id, data.id ]); if (result.affectedRows > 0) { const usuario = new Usuario(); usuario.id = data.id; await DAORegistro.registrar(usuario, "Alumno rechazado", new Date()); return true; } return false; } catch (error) { logger.error(`Error en DAO.editarAlumnoRechazado: ${error.message}`); return false; } finally { conexion.cerrarConexion(); } } } export default DAO;