diff --git a/Pedidos/Controladores/actualizarPedido.controller.js b/Pedidos/Controladores/actualizarPedido.controller.js new file mode 100644 index 00000000..299ddbd4 --- /dev/null +++ b/Pedidos/Controladores/actualizarPedido.controller.js @@ -0,0 +1,47 @@ +const MENSAJES = require('@altertex/util/const/mensajesPedidos'); +const repositorio = require('@altertex/pedidos/repos/repositorioActualizarPedido'); + +/** + * RF[62] - Actualizar Pedido [https://codeandco-wiki.netlify.app/docs/proyectos/textiles/documentacion/requisitos/RF62] + * Controlador para actualizar la información de uno o varios pedidos. + * + * Respuestas posibles: + * - 400 si faltan datos en el cuerpo de la solicitud. + * - 200 si el pedido se actualiza correctamente. + * + * @async + * @function actualizarGrupoEmpleados + * @param {Express.Request} req - Objeto de solicitud HTTP de Express. + * @param {Express.Response} res - Objeto de respuesta HTTP de Express. + * @returns {Promise} La respuesta HTTP con el estado y mensaje correspondiente. + */ +exports.actualizarPedido = async (req, res) => { + let datos; + if (req.body.idPedido) { + datos = [req.body]; + } else if (req.body.cambios) { + datos = Array.isArray(req.body.cambios) ? req.body.cambios : [req.body.cambios]; + } else { + return res.status(MENSAJES.ERROR_ACTUALIZAR_PEDIDO.codigo).json({ + mensaje: MENSAJES.ERROR_ACTUALIZAR_PEDIDO.mensaje, + }); + } + + if (!datos || datos.length === 0) { + return res.status(MENSAJES.ERROR_ACTUALIZAR_PEDIDO.codigo).json({ + mensaje: MENSAJES.ERROR_ACTUALIZAR_PEDIDO.mensaje, + }); + } + + try { + await repositorio.actualizarPedido(datos); + return res.status(MENSAJES.PEDIDO_ACTUALIZADO.codigo).json({ + mensaje: MENSAJES.PEDIDO_ACTUALIZADO.mensaje, + datos, + }); + } catch { + return res.status(MENSAJES.ERROR_ACTUALIZAR_PEDIDO.codigo).json({ + mensaje: MENSAJES.ERROR_ACTUALIZAR_PEDIDO.mensaje, + }); + } +}; diff --git a/Pedidos/Datos/Repositorios/repositorioActualizarPedido.js b/Pedidos/Datos/Repositorios/repositorioActualizarPedido.js new file mode 100644 index 00000000..002d898a --- /dev/null +++ b/Pedidos/Datos/Repositorios/repositorioActualizarPedido.js @@ -0,0 +1,50 @@ +const correrQuery = require('@altertex/util/ser/correrQuery'); +const MENSAJES = require('@altertex/util/const/mensajesPedidos'); +const CONSULTAS = require('@altertex/util/const/consultasPedidos'); + +//RF[62] - Actualizar Pedido - [https://codeandco-wiki.netlify.app/docs/proyectos/textiles/documentacion/requisitos/RF62] + +/** + * Actualiza uno o varios pedidos en la base de datos con nueva información + * de estado, precio total, ID de envío y ID de pago. + * + * Esta función realiza: + * - La validación de que se proporcionen datos para actualizar. + * - La actualización simultánea de múltiples pedidos usando Promise.all. + * - El manejo de errores durante el proceso de actualización. + * + * La función procesa cada pedido de forma paralela, actualizando sus campos + * mediante una consulta SQL preparada con los parámetros proporcionados. + * + * @async + * @function actualizarPedido + * @param {object[]} datos - Array de objetos con los datos de los pedidos a actualizar. + * @param {number} datos[].idPedido - ID único del pedido a actualizar. + * @param {string|number} datos[].estado - Nuevo estado del pedido. + * @param {number} datos[].precioTotal - Nuevo precio total del pedido. + * @param {number} datos[].idEnvio - ID del envío asociado al pedido. + * @param {number} datos[].idPago - ID del pago asociado al pedido. + * @throws {Error} 'Sin datos para actualizar.' - Si el array está vacío o no es válido. + * @throws {Error} Mensaje de error específico desde MENSAJES.ERROR_ACTUALIZAR_PEDIDO - Si ocurre algún error durante la actualización. + */ +exports.actualizarPedido = async (datos) => { + if (!Array.isArray(datos) || datos.length === 0) { + throw new Error('Sin datos para actualizar.'); + } + + try { + await Promise.all( + datos.map(({ idPedido, estado, precioTotal, idEnvio, idPago }) => { + return correrQuery(CONSULTAS.ACTUALIZAR_PEDIDO, [ + estado, + precioTotal, + idPago, + idEnvio, + idPedido, + ]); + }) + ); + } catch { + throw new Error(MENSAJES.ERROR_ACTUALIZAR_PEDIDO.mensaje); + } +}; diff --git a/Pedidos/Rutas/RutasIndividuales/actualizarPedidos.routes.js b/Pedidos/Rutas/RutasIndividuales/actualizarPedidos.routes.js new file mode 100644 index 00000000..90ba4c2a --- /dev/null +++ b/Pedidos/Rutas/RutasIndividuales/actualizarPedidos.routes.js @@ -0,0 +1,24 @@ +const express = require('express'); +const ruteador = express.Router(); + +const controlador = require('@altertex/pedidos/ctrl/actualizarPedido.controller'); +const revisarApiKey = require('@altertex/util/inter/revisarApiKey'); +const autorizarToken = require('@altertex/util/inter/autorizarToken'); +const verificarPermisos = require('@altertex/util/inter/verificarPermisos'); +const limitePeticiones = require('@altertex/util/inter/limitePeticiones'); +const RUTAS = require('@altertex/util/const/rutas'); +const PERMISOS = require('@altertex/util/const/permisos'); +const validarYSanitizar = require('@altertex/util/inter/validarYSanitizar'); + +// RF[62] - Actualizar Pedido +ruteador.put( + RUTAS.PEDIDOS.ACTUALIZAR_PEDIDO, + revisarApiKey(), + autorizarToken, + limitePeticiones, + verificarPermisos(PERMISOS.ACTUALIZAR_PEDIDO), + validarYSanitizar, + controlador.actualizarPedido +); + +module.exports = ruteador; diff --git a/Pedidos/Rutas/indexPedidos.routes.js b/Pedidos/Rutas/indexPedidos.routes.js index 83334c54..16647e25 100644 --- a/Pedidos/Rutas/indexPedidos.routes.js +++ b/Pedidos/Rutas/indexPedidos.routes.js @@ -2,9 +2,11 @@ const express = require('express'); const ruteador = express.Router(); const rutasObtenerPedidos = require('@altertex/pedidos/rutasInd/obtenerPedidos.routes'); const rutasEliminarPedido = require('@altertex/pedidos/rutasInd/eliminarPedidos.routes'); +const rutasActualizarPedidos = require('@altertex/pedidos/rutasInd/actualizarPedidos.routes'); const RUTAS = require('@altertex/util/const/rutas'); ruteador.use(RUTAS.PEDIDOS.BASE, rutasObtenerPedidos); ruteador.use(RUTAS.PEDIDOS.BASE, rutasEliminarPedido); +ruteador.use(RUTAS.PEDIDOS.BASE, rutasActualizarPedidos); module.exports = ruteador; diff --git a/Utilidades/Constantes/consultasPedidos.js b/Utilidades/Constantes/consultasPedidos.js index a92f3cfc..1426a12d 100644 --- a/Utilidades/Constantes/consultasPedidos.js +++ b/Utilidades/Constantes/consultasPedidos.js @@ -34,4 +34,16 @@ module.exports = { ELIMINAR_PEDIDO: ` DELETE FROM pedido WHERE idPedido = ?;`, + + ACTUALIZAR_PEDIDO: ` + UPDATE pedido + JOIN pago ON pedido.idPago = pago.idPago + JOIN envio ON pedido.idEnvio = envio.idEnvio + SET + pedido.estado = ?, + pedido.precioTotal = ?, + pago.estatus = ?, + envio.estado = ? + WHERE pedido.idPedido = ?; + `, }; diff --git a/Utilidades/Constantes/mensajesPedidos.js b/Utilidades/Constantes/mensajesPedidos.js index 8e21d51d..978727e6 100644 --- a/Utilidades/Constantes/mensajesPedidos.js +++ b/Utilidades/Constantes/mensajesPedidos.js @@ -32,4 +32,13 @@ module.exports = { codigo: 500, mensaje: 'Ocurrió un error al eliminar el pedido.', }, + PEDIDO_ACTUALIZADO: { + codigo: 200, + mensaje: 'Pedido actualizado correctamente.', + }, + ERROR_ACTUALIZAR_PEDIDO: { + codigo: 400, + mensaje: 'Error al actualizar el pedido.', + }, + }; diff --git a/Utilidades/Constantes/rutas.js b/Utilidades/Constantes/rutas.js index 3f5cd178..a4aca81a 100644 --- a/Utilidades/Constantes/rutas.js +++ b/Utilidades/Constantes/rutas.js @@ -103,6 +103,7 @@ module.exports = { BASE: '/pedidos', CONSULTAR_LISTA: '/consultar-lista', ELIMINAR_PEDIDO: '/eliminar', + ACTUALIZAR_PEDIDO: '/actualizar-pedido', }, PAGOS: { BASE: '/pagos',