feat: inicializacion de Help Desk segun estandar Telcotronics con bitacora de errores e integracion MCP
This commit is contained in:
+153
@@ -0,0 +1,153 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user