Files

154 lines
5.7 KiB
JavaScript

const express = require('express');
const router = express.Router();
const bcrypt = require('bcryptjs');
const { isCompanyAdmin } = require('../middleware/auth');
const User = require('../models/User');
const Department = require('../models/Department');
const Ticket = require('../models/Ticket');
router.get('/dashboard', isCompanyAdmin, async (req, res) => {
try {
const users = await User.findAll(req.session.user.company_id);
const tickets = await Ticket.findAll(req.session.user.company_id);
const departments = await Department.findAll(req.session.user.company_id);
const stats = await Ticket.countByStatus(req.session.user.company_id);
res.render('admin/dashboard', { users, tickets, departments, stats });
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al cargar dashboard');
res.redirect('/');
}
});
router.get('/users', isCompanyAdmin, async (req, res) => {
try {
const users = await User.findAll(req.session.user.company_id);
res.render('admin/users', { users });
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al cargar usuarios');
res.redirect('/admin/dashboard');
}
});
router.get('/users/create', isCompanyAdmin, (req, res) => {
res.render('admin/create-user');
});
router.post('/users/create', isCompanyAdmin, async (req, res) => {
const { nombre, email, password, rol } = req.body;
if (!nombre || !email || !password) {
req.flash('error_msg', 'Todos los campos son obligatorios');
return res.redirect('/admin/users/create');
}
try {
const existing = await User.findByEmail(email);
if (existing) {
req.flash('error_msg', 'El email ya existe');
return res.redirect('/admin/users/create');
}
const hashedPassword = await bcrypt.hash(password, 10);
const userId = await User.create(req.session.user.company_id, nombre, email, hashedPassword, rol || 'client');
req.flash('success_msg', 'Usuario creado exitosamente');
res.redirect('/admin/users');
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al crear usuario');
res.redirect('/admin/users/create');
}
});
router.post('/users/invite/:id', isCompanyAdmin, async (req, res) => {
try {
const user = await User.findById(req.params.id);
if (!user || user.company_id !== req.session.user.company_id) {
req.flash('error_msg', 'Usuario no encontrado');
return res.redirect('/admin/users');
}
const token = await User.generateInviteToken(user.id);
const inviteLink = `${req.protocol}://${req.get('host')}/invite/${token}`;
req.flash('success_msg', `Link de invitación: ${inviteLink}`);
res.redirect('/admin/users');
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al generar invitación');
res.redirect('/admin/users');
}
});
router.post('/users/delete/:id', isCompanyAdmin, async (req, res) => {
try {
const user = await User.findById(req.params.id);
if (!user || user.company_id !== req.session.user.company_id) {
req.flash('error_msg', 'Usuario no encontrado');
return res.redirect('/admin/users');
}
if (user.rol === 'superadmin') {
req.flash('error_msg', 'No puedes eliminar al superadmin');
return res.redirect('/admin/users');
}
await User.delete(req.params.id);
req.flash('success_msg', 'Usuario eliminado');
res.redirect('/admin/users');
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al eliminar usuario');
res.redirect('/admin/users');
}
});
router.get('/departments', isCompanyAdmin, async (req, res) => {
try {
const departments = await Department.findAll(req.session.user.company_id);
res.render('admin/departments', { departments });
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al cargar departamentos');
res.redirect('/admin/dashboard');
}
});
router.post('/departments/create', isCompanyAdmin, async (req, res) => {
const { nombre, descripcion } = req.body;
if (!nombre) {
req.flash('error_msg', 'El nombre es obligatorio');
return res.redirect('/admin/departments');
}
try {
await Department.create(req.session.user.company_id, nombre, descripcion || '');
req.flash('success_msg', 'Departamento creado');
res.redirect('/admin/departments');
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al crear departamento');
res.redirect('/admin/departments');
}
});
router.post('/departments/update/:id', isCompanyAdmin, async (req, res) => {
const { nombre, descripcion } = req.body;
try {
await Department.update(req.params.id, nombre, descripcion || '');
req.flash('success_msg', 'Departamento actualizado');
res.redirect('/admin/departments');
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al actualizar departamento');
res.redirect('/admin/departments');
}
});
router.post('/departments/delete/:id', isCompanyAdmin, async (req, res) => {
try {
await Department.delete(req.params.id);
req.flash('success_msg', 'Departamento eliminado');
res.redirect('/admin/departments');
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al eliminar departamento');
res.redirect('/admin/departments');
}
});
module.exports = router;