Files

105 lines
3.9 KiB
JavaScript

const express = require('express');
const router = express.Router();
const { isAuthenticated } = require('../middleware/auth');
const Ticket = require('../models/Ticket');
const Department = require('../models/Department');
router.get('/dashboard', isAuthenticated, async (req, res) => {
try {
const tickets = await Ticket.findByUser(req.session.user.company_id, req.session.user.id);
res.render('client/dashboard', { tickets });
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al cargar tickets');
res.redirect('/');
}
});
router.get('/new-ticket', isAuthenticated, async (req, res) => {
try {
const departments = await Department.findAll(req.session.user.company_id);
res.render('client/new-ticket', { departments });
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al cargar formulario');
res.redirect('/client/dashboard');
}
});
router.post('/new-ticket', isAuthenticated, async (req, res) => {
const { department_id, asunto, mensaje, prioridad } = req.body;
if (!asunto || !mensaje) {
req.flash('error_msg', 'Asunto y mensaje son obligatorios');
return res.redirect('/client/new-ticket');
}
try {
await Ticket.create(req.session.user.company_id, req.session.user.id, department_id || null, asunto, mensaje, prioridad || 'media');
req.flash('success_msg', 'Ticket creado exitosamente');
res.redirect('/client/dashboard');
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al crear ticket');
res.redirect('/client/new-ticket');
}
});
router.get('/ticket/:id', isAuthenticated, async (req, res) => {
try {
const ticket = await Ticket.findById(req.params.id);
if (!ticket) {
req.flash('error_msg', 'Ticket no encontrado');
return res.redirect('/client/dashboard');
}
if (ticket.company_id !== req.session.user.company_id) {
req.flash('error_msg', 'Acceso denegado');
return res.redirect('/client/dashboard');
}
if (ticket.user_id !== req.session.user.id && req.session.user.rol === 'client') {
req.flash('error_msg', 'Acceso denegado');
return res.redirect('/client/dashboard');
}
const respuestas = await Ticket.getResponses(req.params.id);
res.render('client/view-ticket', { ticket, respuestas });
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al cargar ticket');
res.redirect('/client/dashboard');
}
});
router.post('/ticket/:id/respond', isAuthenticated, async (req, res) => {
const { mensaje } = req.body;
if (!mensaje) {
req.flash('error_msg', 'El mensaje es obligatorio');
return res.redirect(`/client/ticket/${req.params.id}`);
}
try {
await Ticket.addResponse(req.params.id, req.session.user.id, mensaje);
req.flash('success_msg', 'Respuesta enviada');
res.redirect(`/client/ticket/${req.params.id}`);
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al enviar respuesta');
res.redirect(`/client/ticket/${req.params.id}`);
}
});
router.post('/ticket/:id/close', isAuthenticated, async (req, res) => {
try {
const ticket = await Ticket.findById(req.params.id);
if (ticket && ticket.company_id !== req.session.user.company_id) {
req.flash('error_msg', 'Acceso denegado');
return res.redirect('/client/dashboard');
}
await Ticket.update(req.params.id, { status: 'cerrado' });
req.flash('success_msg', 'Ticket cerrado');
res.redirect(`/client/ticket/${req.params.id}`);
} catch (error) {
console.error(error);
req.flash('error_msg', 'Error al cerrar ticket');
res.redirect(`/client/ticket/${req.params.id}`);
}
});
module.exports = router;