Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
31 commits
Select commit Hold shift + click to select a range
91f6748
merge develop
toscanodiaz May 16, 2025
f8c64b2
Merge branch 'develop' of https://github.com/CodeAnd-Co/Backend-texti…
toscanodiaz May 16, 2025
c0e7b18
Merge branch 'develop' of https://github.com/CodeAnd-Co/Backend-texti…
toscanodiaz May 19, 2025
854b317
Merge branch 'develop' of https://github.com/CodeAnd-Co/Backend-texti…
toscanodiaz May 22, 2025
6159f23
cambio clienteRedis.js
toscanodiaz May 23, 2025
6f98b70
Merge branch 'develop' of https://github.com/CodeAnd-Co/Backend-texti…
toscanodiaz May 23, 2025
3f447fa
Merge branch 'develop' of https://github.com/CodeAnd-Co/Backend-texti…
toscanodiaz May 23, 2025
913e0df
Merge branch 'develop' of https://github.com/CodeAnd-Co/Backend-texti…
toscanodiaz May 26, 2025
6fb3d31
Merge branch 'develop' of https://github.com/CodeAnd-Co/Backend-texti…
toscanodiaz May 27, 2025
2d72496
feat(usuarios): implement update user functionality with controller, …
toscanodiaz May 29, 2025
162ae42
feat(usuarios): add update user route and controller implementation
toscanodiaz May 31, 2025
db7645f
Merge branch 'develop' of https://github.com/CodeAnd-Co/Backend-texti…
toscanodiaz Jun 2, 2025
5c04f59
feat(usuarios): enhance user update functionality and improve user li…
toscanodiaz Jun 3, 2025
836b786
feat(usuarios): enhance user-client association logic in actualizarUs…
toscanodiaz Jun 4, 2025
8bfceca
Merge branch 'develop' of https://github.com/CodeAnd-Co/Backend-texti…
toscanodiaz Jun 4, 2025
513f18e
Co-authored-by: Nicolas Hood Figueroa <NicoH00d@users.noreply.github.…
toscanodiaz Jun 6, 2025
b5dcd00
feat(usuarios): add password hashing for user updates in actualizarUs…
toscanodiaz Jun 6, 2025
1ce82c1
fix(usuarios): improve error handling in actualizarUsuario and clarif…
toscanodiaz Jun 6, 2025
e459fcc
Merge branch 'MBI-1' of https://github.com/CodeAnd-Co/Backend-textile…
toscanodiaz Jun 6, 2025
57b6dbd
fix(package): add license information for csurf package
toscanodiaz Jun 6, 2025
ed5b689
fix(actualizarUsuario): streamline password handling and improve erro…
toscanodiaz Jun 7, 2025
daac9f3
Merge branch 'MBI-1' into feature/MT_RF4_ActualizaUsuario
Krlos7121 Jun 7, 2025
0a7d943
fix(actualizarUsuario): simplify password check logic in user update …
toscanodiaz Jun 7, 2025
3ac4ab9
Merge branch 'feature/MT_RF4_ActualizaUsuario' of https://github.com/…
toscanodiaz Jun 7, 2025
45f6bee
[FIX] - Arreglar actualizar rol de usuario
toscanodiaz Jun 7, 2025
12953d9
integración
toscanodiaz Jun 7, 2025
ace5540
Merge branch 'MBI-1' into feature/MT_RF4_ActualizaUsuario
toscanodiaz Jun 7, 2025
8f574eb
fix: arreglar consulta
NicoH00d Jun 7, 2025
6d69029
Merge branch 'MBI-1' of https://github.com/CodeAnd-Co/Backend-textile…
NicoH00d Jun 12, 2025
277fbfa
Manejo de errores con nuevo estandar
NicoH00d Jun 13, 2025
fd6df3f
Validación para eliminar al usuario logeado
NicoH00d Jun 13, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Configuracion/clienteRedis.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,4 @@ const redis = createClient({
redis.on('error', (err) => console.error('Error Redis', err));
redis.connect();

module.exports = redis;
module.exports = redis;
7 changes: 4 additions & 3 deletions Empleados/Datos/Repositorios/repositorioGrupoDeEmpleados.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
* @description
* Contiene funciones para consultar y validar grupos de empleados asociados a un cliente.
* Incluye lógica para obtener todos los grupos de un cliente y verificar duplicados por nombre.
*
*
* RF22 - Consulta Lista de Grupo Empleados - https://codeandco-wiki.netlify.app/docs/proyectos/textiles/documentacion/requisitos/RF22
*/

Expand All @@ -29,6 +29,7 @@ exports.obtenerGrupoDeEmpleados = async (idCliente) => {

try {
const gruposDeEmpleados = await correrQuery(query, [idCliente]);

return gruposDeEmpleados;
} catch {
return [];
Expand All @@ -55,7 +56,7 @@ exports.existeGrupoConNombre = (nombreGrupo, idCliente) => {
(err, resultados) => {
if (err) return reject(err);
resolve(resultados.length > 0);
},
}
);
});
};
};
12 changes: 6 additions & 6 deletions Productos/Controladores/crearProducto.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -103,11 +103,11 @@ exports.crearProducto = [
// Upload image processing remains unchanged
const urlImagenProductoPromise = imagenProducto
? enviarS3({
Bucket: process.env.AWS_BUCKET_NAME,
Key: `productos/${imagenProducto.originalname}`,
Body: imagenProducto.buffer,
ContentType: imagenProducto.mimetype,
})
Bucket: process.env.AWS_BUCKET_NAME,
Key: `productos/${imagenProducto.originalname}`,
Body: imagenProducto.buffer,
ContentType: imagenProducto.mimetype,
})
: Promise.resolve(null);

// prettier-ignore
Expand Down Expand Up @@ -176,4 +176,4 @@ exports.crearProducto = [
if (conexion) conexion.release();
}
},
];
];
45 changes: 45 additions & 0 deletions Usuarios/Controladores/actualizarUsuario.controller.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
const repositorio = require('@altertex/usu/repos/repositorioActualizarUsuario');
const bcrypt = require('bcryptjs');

//RF[4] Actualizar Usuario - [https://codeandco-wiki.netlify.app/docs/proyectos/textiles/documentacion/requisitos/RF4]

/**
* Controlador para actualizar la información de un usuario.
*
* Este endpoint recibe un objeto con los cambios que se aplicarán
* sobre un usuario y usa su repositorio para hacer el cambio en la
* base de datos.
*
* @function actualizarUsuario
* @async
* @param {Express.Request} req - Objeto de solicitud HTTP de Express.
* @param {object} req.body - Cuerpo de la solicitud.
* @param {object|Array<object>} req.body.cambios - Información del usuario a actualizar.
* @param {Express.Response} res - Objecto de respuesta HTTP de Express.
* @returns {Promise<void>} Retorna una respuesta JSON indicando éxito o un error.
*/
exports.actualizarUsuario = async (req, res) => {
const cambios = req.body.cambios || req.body;

if (!cambios) {
return res.status(400).json({ mensaje: 'No se enviaron los datos del usuario' });
}

const datos = Array.isArray(cambios) ? cambios : [cambios];

if (!datos[0].idUsuario) {
return res.status(400).json({ mensaje: 'ID del usuario no proporcionado' });
}

if (datos[0].contrasenia) {
const contraseniaEncriptada = await bcrypt.hash(datos[0].contrasenia, 10);
datos[0].contrasenia = contraseniaEncriptada;
}

try {
await repositorio.actualizarUsuario(datos);
return res.status(200).json({ mensaje: 'Usuario actualizado correctamente' });
} catch (error) {
return res.status(400).json({ mensaje: error.message });
}
};
13 changes: 12 additions & 1 deletion Usuarios/Controladores/consultarListaUsuarios.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,20 @@ exports.consultarListaUsuarios = async (req, res) => {
.json({ mensaje: MENSAJES_USUARIOS.USUARIOS_NO_ENCONTRADOS.mensaje });
}

const generoMap = {
masculino: 'Hombre',
femenino: 'Mujer',
otro: 'Otro',
};

const resultadosMapeados = resultados.map((usuario) => ({
...usuario,
genero: generoMap[usuario.genero] || usuario.genero,
}));

return res.status(MENSAJES_USUARIOS.LISTA_USUARIOS_OBTENIDA.codigo).json({
mensaje: MENSAJES_USUARIOS.LISTA_USUARIOS_OBTENIDA.mensaje,
listaUsuarios: resultados,
listaUsuarios: resultadosMapeados,
});
} catch {
return res
Expand Down
6 changes: 6 additions & 0 deletions Usuarios/Controladores/eliminarUsuario.controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ exports.eliminarUsuario = async (req, res) => {
}

const idsNumericos = idsUsuarios.map(Number);

if (idsNumericos.includes(idSolicitante)) {
return res.status(403).json({
mensaje: 'No puedes eliminar tu propio usuario.',
});
}

const [usuariosObjetivo] = await db.query(`
SELECT u.idUsuario, r.nombre AS rol
Expand Down
104 changes: 104 additions & 0 deletions Usuarios/Datos/Repositorios/repositorioActualizarUsuario.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
const correrQuery = require('@altertex/util/ser/correrQuery');
const MENSAJES = require('@altertex/util/const/mensajesUsuarios');
const CONSULTAS_USUARIOS = require('@altertex/util/const/consultasUsuarios');

//RF[4] Actualizar Usuario - [https://codeandco-wiki.netlify.app/docs/proyectos/textiles/documentacion/requisitos/RF4

/**
* Repositorio para actualizar los datos de un usuario en la BD.
*
* Recorre un arreglo de objetos que contienen la información de cada usuario para
* actualizar su información.
*
* Utiliza un array de objetos con la información del usuario, y hace la
* consulta correspondiente a la base de datos.
*
* @function actualizarUsuario
* @async
* @param {Array<{ idUsuario: number, nombreCompleto: string, correoElectronico: string, telefono: string }>} datos - Lista de
* información del usuario a actualizar.
* @throws {Error} Si el arreglo está vacío o si ocurre un error en la base de datos.
* @returns {Promise<void>} Promesa que se resuelve cuando todas las actualizaciones han sido ejecutadas.
*/
exports.actualizarUsuario = async (datos) => {
if (!Array.isArray(datos) || datos.length === 0) {
throw new Error(MENSAJES.ERROR_OBTENER_USUARIO.mensaje);
}

try {
for (const usuario of datos) {
const {
idUsuario,
correoElectronico,
nombreCompleto,
contrasenia,
numeroTelefono,
direccion,
fechaNacimiento,
idRol,
genero,
estatus,
cliente,
} = usuario;

const resultadoCorreo = await correrQuery(
CONSULTAS_USUARIOS.VALIDAR_CORREO_DUPLICADO_ACTUALIZACION,
[correoElectronico, idUsuario]
);

if (resultadoCorreo.length > 0) {
throw new Error(MENSAJES.USUARIO_YA_EXISTE.mensaje);
}

const conContrasena = contrasenia && contrasenia.trim() !== '';

if (conContrasena) {
await correrQuery(CONSULTAS_USUARIOS.ACTUALIZAR_DATOS_USUARIO, [
nombreCompleto,
correoElectronico,
contrasenia,
numeroTelefono,
direccion,
fechaNacimiento,
genero,
estatus,
idUsuario,
]);
} else {
await correrQuery(CONSULTAS_USUARIOS.ACTUALIZAR_DATOS_USUARIO_SIN_CONTRASENA, [
nombreCompleto,
correoElectronico,
numeroTelefono,
direccion,
fechaNacimiento,
genero,
estatus,
idUsuario,
]);
}

// Asociar cliente(s)
if (cliente) {
const clientes = Array.isArray(cliente) ? cliente : [cliente];

// Eliminar asociaciones anteriores
await correrQuery(CONSULTAS_USUARIOS.ELIMINAR_USUARIO_CLIENTE, [idUsuario]);

for (const idCliente of clientes) {
if (idCliente) {
await correrQuery(CONSULTAS_USUARIOS.ASOCIAR_USUARIO_A_CLIENTE, [
idUsuario,
idCliente,
]);
}
}
}
await correrQuery(CONSULTAS_USUARIOS.ACTUALIZAR_ROL_USUARIO, [idRol, idUsuario]);
}
} catch (error) {
if (error.code === 'ER_TRUNCATED_WRONG_VALUE') {
throw new Error(MENSAJES.ERROR_FECHA_NO_VALIDA.mensaje);
}
throw new Error(error.message || MENSAJES.ERROR_ACTUALIZAR_USUARIO.mensaje);
}
};
Loading