// src/controladores/controlador_Membresias.js const controladorMembresias = { /** * @function listarTiposMembresia * @description Lista todos los tipos de membresía disponibles, incluyendo información del combo ensamblado si aplica. * @param {Object} req - Objeto de solicitud de Express. * @param {Object} res - Objeto de respuesta de Express. */ listarTiposMembresia: (req, res) => { // ¡Ya no es async aquí directamente! req.getConnection((err, connection) => { // Obtiene la conexión con un callback if (err) { console.error('Error al obtener conexión para listar tipos de membresía:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); } connection.query(` SELECT cm.id_tipo_membresia, cm.nombre_tipo, cm.categoria_membresia, cm.es_grupal, cm.capacidad_maxima_miembros, cm.valor, cm.descripcion, cm.duracion_dias, cm.visitas_maximas_diarias, cm.areas_de_acceso, cm.id_combo_ensamblado_incluido, cm.cantidad_combo_incluido, pe.PdctEnsb_codigoEnsamble AS codigo_combo_ensamblado, cm.estado_tipo, cm.fecha_creacion, cm.fecha_modificacion FROM clientes_membresias cm LEFT JOIN productos_Ensamblados pe ON cm.id_combo_ensamblado_incluido = pe.PdctEnsb_ID `, (err, rows) => { // Ejecuta la query con un callback if (err) { console.error('Error al listar tipos de membresía:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al listar tipos de membresía', error: err.message }); } res.json(rows); // express-myconnection se encarga de liberar la conexión automáticamente si no usas transacciones manuales }); }); }, /** * @function obtenerTipoMembresiaPorId * @description Obtiene un tipo de membresía específico por su ID. * @param {Object} req - Objeto de solicitud de Express (req.params.id contiene el ID del tipo de membresía). * @param {Object} res - Objeto de respuesta de Express. */ obtenerTipoMembresiaPorId: (req, res) => { const { id } = req.params; req.getConnection((err, connection) => { if (err) { console.error('Error al obtener conexión para tipo de membresía por ID:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); } connection.query(` SELECT cm.id_tipo_membresia, cm.nombre_tipo, cm.categoria_membresia, cm.es_grupal, cm.capacidad_maxima_miembros, cm.valor, cm.descripcion, cm.duracion_dias, cm.visitas_maximas_diarias, cm.areas_de_acceso, cm.id_combo_ensamblado_incluido, cm.cantidad_combo_incluido, pe.PdctEnsb_codigoEnsamble AS codigo_combo_ensamblado, cm.estado_tipo, cm.fecha_creacion, cm.fecha_modificacion FROM clientes_membresias cm LEFT JOIN productos_Ensamblados pe ON cm.id_combo_ensamblado_incluido = pe.PdctEnsb_ID WHERE cm.id_tipo_membresia = ?`, [id], (err, rows) => { if (err) { console.error('Error al obtener tipo de membresía:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener tipo de membresía', error: err.message }); } if (rows.length === 0) { return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado' }); } res.json(rows[0]); }); }); }, /** * @function crearTipoMembresia * @description Crea un nuevo tipo de membresía. * @param {Object} req - Objeto de solicitud de Express (req.body contiene los datos del tipo de membresía). * @param {Object} res - Objeto de respuesta de Express. */ crearTipoMembresia: (req, res) => { const { nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, valor, descripcion, duracion_dias, visitas_maximas_diarias, areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido } = req.body; if (!nombre_tipo || es_grupal === undefined || valor === undefined) { return res.status(400).json({ mensaje: 'Faltan campos obligatorios para el tipo de membresía (nombre_tipo, es_grupal, valor).' }); } req.getConnection((err, connection) => { if (err) { console.error('Error al obtener conexión para crear tipo de membresía:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); } connection.query( `INSERT INTO clientes_membresias ( nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, valor, descripcion, duracion_dias, visitas_maximas_diarias, areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, estado_tipo, fecha_creacion ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, 'ACTIVO', NOW())`, [ nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, valor, descripcion, duracion_dias, visitas_maximas_diarias, areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido ], (err, result) => { if (err) { console.error('Error al crear tipo de membresía:', err); if (err.code === 'ER_DUP_ENTRY') { return res.status(409).json({ mensaje: 'Ya existe un tipo de membresía con ese nombre.', error: err.message }); } return res.status(500).json({ mensaje: 'Error interno del servidor al crear tipo de membresía', error: err.message }); } res.status(201).json({ mensaje: 'Tipo de membresía creado exitosamente', id: result.insertId }); } ); }); }, /** * @function actualizarTipoMembresia * @description Actualiza un tipo de membresía existente por su ID. * @param {Object} req - Objeto de solicitud de Express (req.params.id para el ID, req.body para los datos). * @param {Object} res - Objeto de respuesta de Express. */ actualizarTipoMembresia: (req, res) => { const { id } = req.params; // ID del tipo de membresía a actualizar const { nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, valor, descripcion, duracion_dias, visitas_maximas_diarias, areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, estado_tipo } = req.body; if (!nombre_tipo || es_grupal === undefined || valor === undefined || !estado_tipo) { return res.status(400).json({ mensaje: 'Faltan campos obligatorios para actualizar el tipo de membresía (nombre_tipo, es_grupal, valor, estado_tipo).' }); } req.getConnection((err, connection) => { if (err) { console.error('Error al obtener conexión para actualizar tipo de membresía:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); } connection.query( `UPDATE clientes_membresias SET nombre_tipo = ?, categoria_membresia = ?, es_grupal = ?, capacidad_maxima_miembros = ?, valor = ?, descripcion = ?, duracion_dias = ?, visitas_maximas_diarias = ?, areas_de_acceso = ?, id_combo_ensamblado_incluido = ?, cantidad_combo_incluido = ?, estado_tipo = ?, fecha_modificacion = NOW() WHERE id_tipo_membresia = ?`, [ nombre_tipo, categoria_membresia, es_grupal, capacidad_maxima_miembros, valor, descripcion, duracion_dias, visitas_maximas_diarias, areas_de_acceso, id_combo_ensamblado_incluido, cantidad_combo_incluido, estado_tipo, id ], (err, result) => { if (err) { console.error('Error al actualizar tipo de membresía:', err); if (err.code === 'ER_DUP_ENTRY') { return res.status(409).json({ mensaje: 'Ya existe otro tipo de membresía con ese nombre.', error: err.message }); } return res.status(500).json({ mensaje: 'Error interno del servidor al actualizar tipo de membresía', error: err.message }); } if (result.affectedRows === 0) { return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado para actualizar' }); } res.json({ mensaje: 'Tipo de membresía actualizado exitosamente' }); } ); }); }, /** * @function eliminarTipoMembresia * @description Elimina lógicamente un tipo de membresía por su ID (cambia su estado a 'ELIMINADO'). * @param {Object} req - Objeto de solicitud de Express (req.params.id para el ID). * @param {Object} res - Objeto de respuesta de Express. */ eliminarTipoMembresia: (req, res) => { const { id } = req.params; req.getConnection((err, connection) => { if (err) { console.error('Error al obtener conexión para eliminar tipo de membresía:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al obtener conexión', error: err.message }); } connection.query('UPDATE clientes_membresias SET estado_tipo = "ELIMINADO" WHERE id_tipo_membresia = ?', [id], (err, result) => { if (err) { console.error('Error al eliminar tipo de membresía:', err); return res.status(500).json({ mensaje: 'Error interno del servidor al eliminar tipo de membresía', error: err.message }); } if (result.affectedRows === 0) { return res.status(404).json({ mensaje: 'Tipo de membresía no encontrado para eliminar' }); } res.json({ mensaje: 'Tipo de membresía eliminado (lógicamente) exitosamente' }); }); }); } }; module.exports = controladorMembresias;