// src/controladores/controlador_Areas.js const controladorAreas = { /** * @function listarAreas * @description Lista todas las áreas de acceso configuradas en la tabla `clientes_membresias_areas_acceso`. * Filtra por estado si se proporciona un query param `estado`. * @param {Object} req - Objeto de solicitud de Express (req.query.estado). * @param {Object} res - Objeto de respuesta de Express. */ listarAreas: (req, res) => { const { estado } = req.query; // Obtener el parámetro de estado req.getConnection((err, connection) => { if (err) { console.error('Error al obtener conexión para listar áreas:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); } let query = 'SELECT id_area, nombre_area, descripcion, estado_area, fecha_creacion, fecha_modificacion FROM clientes_membresias_areas_acceso'; const queryParams = []; if (estado) { // Validar que el estado sea uno de los permitidos por el ENUM const estadosPermitidos = ['ACTIVA', 'INACTIVA']; if (!estadosPermitidos.includes(estado.toUpperCase())) { return res.status(400).json({ mensaje: `El estado proporcionado '${estado}' no es válido. Los estados permitidos son: ${estadosPermitidos.join(', ')}.` }); } query += ' WHERE estado_area = ?'; queryParams.push(estado.toUpperCase()); } query += ' ORDER BY nombre_area'; connection.query(query, queryParams, (err, rows) => { if (err) { console.error('Error al listar áreas de configuración:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al listar áreas', error: err.message }); } res.json(rows); }); }); }, /** * @function obtenerAreaPorId * @description Obtiene una área específica por su ID. * @param {Object} req - Objeto de solicitud de Express (req.params.id). * @param {Object} res - Objeto de respuesta de Express. */ obtenerAreaPorId: (req, res) => { const { id } = req.params; req.getConnection((err, connection) => { if (err) { console.error('Error al obtener conexión para área por ID:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); } connection.query('SELECT id_area, nombre_area, descripcion, estado_area FROM clientes_membresias_areas_acceso WHERE id_area = ?', [id], (err, rows) => { if (err) { console.error('Error al obtener área por ID:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener área', error: err.message }); } if (rows.length === 0) { return res.status(404).json({ mensaje: 'Área no encontrada' }); } res.json(rows[0]); }); }); }, /** * @function crearArea * @description Crea una nueva área de acceso. * @param {Object} req - Objeto de solicitud de Express (req.body contiene los datos del área). * @param {Object} res - Objeto de respuesta de Express. */ crearArea: (req, res) => { const { nombre_area, descripcion } = req.body; if (!nombre_area) { return res.status(400).json({ mensaje: 'El nombre del área es obligatorio.' }); } req.getConnection((err, connection) => { if (err) { console.error('Error al obtener conexión para crear área:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); } connection.query('INSERT INTO clientes_membresias_areas_acceso (nombre_area, descripcion, estado_area, fecha_creacion) VALUES (?, ?, "ACTIVA", NOW())', [nombre_area, descripcion], (err, result) => { if (err) { console.error('Error al crear área:', err); if (err.code === 'ER_DUP_ENTRY') { return res.status(409).json({ mensaje: 'Ya existe un área con ese nombre.', error: err.message }); } return res.status(500).json({ mensaje: 'Error interno del servidor al crear área', error: err.message }); } res.status(201).json({ mensaje: 'Área creada exitosamente', id_area: result.insertId }); }); }); }, /** * @function actualizarArea * @description Actualiza una área de acceso existente. * @param {Object} req - Objeto de solicitud de Express (req.params.id, req.body). * @param {Object} res - Objeto de respuesta de Express. */ actualizarArea: (req, res) => { const { id } = req.params; const { nombre_area, descripcion, estado_area } = req.body; if (!nombre_area || !estado_area) { return res.status(400).json({ mensaje: 'El nombre del área y el estado son obligatorios para actualizar.' }); } // Validar que el estado sea uno de los permitidos por el ENUM const estadosPermitidos = ['ACTIVA', 'INACTIVA']; if (!estadosPermitidos.includes(estado_area.toUpperCase())) { return res.status(400).json({ mensaje: `El estado proporcionado '${estado_area}' no es válido. Los estados permitidos son: ${estadosPermitidos.join(', ')}.` }); } req.getConnection((err, connection) => { if (err) { console.error('Error al obtener conexión para actualizar área:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); } connection.query('UPDATE clientes_membresias_areas_acceso SET nombre_area = ?, descripcion = ?, estado_area = ?, fecha_modificacion = NOW() WHERE id_area = ?', [nombre_area, descripcion, estado_area, id], (err, result) => { if (err) { console.error('Error al actualizar área:', err); if (err.code === 'ER_DUP_ENTRY') { return res.status(409).json({ mensaje: 'Ya existe otra área con ese nombre.', error: err.message }); } return res.status(500).json({ mensaje: 'Error interno del servidor al actualizar área', error: err.message }); } if (result.affectedRows === 0) { return res.status(404).json({ mensaje: 'Área no encontrada para actualizar' }); } res.json({ mensaje: 'Área actualizada exitosamente' }); }); }); }, /** * @function inactivarArea * @description Cambia el estado de una área a 'INACTIVA'. (Eliminación lógica). * @param {Object} req - Objeto de solicitud de Express (req.params.id). * @param {Object} res - Objeto de respuesta de Express. */ inactivarArea: (req, res) => { const { id } = req.params; req.getConnection((err, connection) => { if (err) { console.error('Error al obtener conexión para inactivar área:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); } connection.query('UPDATE clientes_membresias_areas_acceso SET estado_area = "INACTIVA", fecha_modificacion = NOW() WHERE id_area = ?', [id], (err, result) => { if (err) { console.error('Error al inactivar área:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al inactivar área', error: err.message }); } if (result.affectedRows === 0) { return res.status(404).json({ mensaje: 'Área no encontrada para inactivar' }); } res.json({ mensaje: 'Área inactivada exitosamente' }); }); }); } }; module.exports = controladorAreas;