import pg from 'pg' import bcrypt from "bcrypt"; import { pool } from '../lib/database.js'; export const getAllUsers = async (req, res) => { try { const result = await pool.query("SELECT nombre, apellido_pa, apellido_ma, fecha_registro, nombre_carrera, nombre_facultad FROM usuarios JOIN carreras ON usuarios.id_carrera = carreras.id_carrera JOIN facultades ON carreras.id_facultad = facultades.id_facultad;"); res.json(result.rows); } catch (err) { res.status(500).json({ error: err.message }); } } export const getSpecificUser = async (req, res) => { try { const result = await pool.query("SELECT nombre, apellido_pa, apellido_ma, fecha_registro, nombre_carrera, nombre_facultad FROM usuarios JOIN carreras ON usuarios.id_carrera = carreras.id_carrera JOIN facultades ON carreras.id_facultad = facultades.id_facultad WHERE id_usuario = $1;", [req.params.userId] ); res.json(result.rows); } catch (err) { res.status(500).json({ error: err.message }); } } export const validateForUser = async (req, res) => { try { const { correo_unach, clave } = req.body; const query = await pool.query(` SELECT usuarios.*, carreras.nombre_carrera, facultades.nombre_facultad FROM usuarios JOIN carreras ON usuarios.id_carrera = carreras.id_carrera JOIN facultades ON carreras.id_facultad = facultades.id_facultad WHERE correo_unach = $1 `, [correo_unach]); const user = query.rows[0]; if (!user) { return res.status(404).json({ error: 'User not found' }); } const match = await bcrypt.compare(clave, user.clave_hasheada); if (!match) { return res.status(401).json({ error: 'Invalid credentials' }); } // Clean sensitive data and return user info const userResponse = { id_usuario: user.id_usuario, nombre: user.nombre, apellido_pa: user.apellido_pa, apellido_ma: user.apellido_ma, correo_unach: user.correo_unach, carrera: user.nombre_carrera, facultad: user.nombre_facultad }; res.json(userResponse); } catch (err) { console.error(err); res.status(500).json({ error: err.message }); } } export const editUser = async (req, res) => { try { const { userId } = req.params; const { nombre, apellido_pa, apellido_ma, id_carrera } = req.body; const query = await pool.query( 'UPDATE usuarios SET nombre = $1, apellido_pa = $2, apellido_ma = $3, id_carrera = $5 WHERE id_usuario = $4 RETURNING *', [nombre, apellido_pa, apellido_ma, userId, id_carrera] ); res.json(query.rows[0]); } catch (err) { console.error(err); res.status(500).json({ error: err.message }); throw err; } } export const deleteUser = async (req, res) => { try { const { userId } = req.params; const query = await pool.query( 'DELETE FROM usuarios WHERE id_usuario = $1 RETURNING *', [userId] ); res.json({ message: `User ${userId} deleted`, user: query.rows[0] }); } catch (err) { console.error(err); res.status(500).json({ error: err.message }); throw err; } } export const createNewUser = async (req,res) => { try { const { correo_unach, clave, matricula, nombre, apellido_pa, apellido_ma, id_carrera } = req.body; const query = await pool.query( 'INSERT INTO public.Usuarios (correo_unach, clave_hasheada, matricula, nombre, apellido_ma, apellido_pa, id_carrera) VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING *', [correo_unach, hashPassword(clave), matricula, nombre, apellido_ma, apellido_pa, id_carrera] ); console.log(`Creado el usuario: ${JSON.stringify(query.rows[0])}`); res.json(query.rows[0]); } catch (err) { console.error(err); res.status(500).json({ error: err.message }); throw err; } } function hashPassword(password) { const saltRounds = 15; const salt = bcrypt.genSaltSync(saltRounds); return bcrypt.hashSync(password, salt); }