Skip to content

OM-403 - #55

Merged
CrisNAC merged 2 commits into
devfrom
OM-403
Mar 24, 2026
Merged

CrisNAC merged 2 commits into
devfrom
OM-403

Conversation

@Benjakr04

@Benjakr04 Benjakr04 commented Mar 24, 2026 •

Copy link
Copy Markdown
Collaborator

agregue una funcion en Users para autorizar cualquier tipo de usuario

Summary by CodeRabbit

Notas de versión

  • Bug Fixes

    • Mejorada la autorización y manejo de errores en las actualizaciones de perfiles de usuario. Se implementaron códigos de respuesta HTTP apropiados (401, 403, 404) para casos de autenticación faltante, acceso no autorizado y usuario no encontrado o inactivo.
  • Refactor

    • Simplificada la lógica de validación de actualizaciones de usuario, permitiendo ahora que usuarios activos editen su propio perfil con validaciones más eficientes.

@coderabbitai

coderabbitai Bot commented Mar 24, 2026 •

Copy link
Copy Markdown
Contributor
📝 Walkthrough

Resumen General

El servicio updateUserService modifica su lógica de autorización, reemplazando getAuthorizedCustomerService por una nueva función getAuthorizedUserForUpdateService que elimina la restricción de rol CUSTOMER, permitiendo auto-ediciones para cualquier usuario activo. La nueva validación verifica: presencia de autenticación (401), identidad del usuario (403), y existencia/estado activo (404).

Cambios

Cohort / Archivo(s) Resumen
Lógica de Autorización de Actualización de Usuarios
src/modules/users/users/services/users.services.js
Se reemplaza getAuthorizedCustomerService con nueva función getAuthorizedUserForUpdateService, eliminando restricción de rol CUSTOMER. Se añaden respuestas HTTP estructuradas (401, 403, 404) para distintos escenarios de autorización. Se mantiene firma pública de updateUserService sin cambios.

Esfuerzo estimado de revisión de código

🎯 3 (Moderado) | ⏱️ ~20 minutos

PRs posiblemente relacionados

  • Om 44 #20: Modifica el mismo flujo de actualización en users.services.js, reemplazando la autorización basada en getAuthorizedCustomerService con una nueva que permite auto-actualizaciones para cualquier usuario activo.

Revisores sugeridos

  • CrisNAC

Poema

🐰 Salta el conejo entre servicios,
Sin roles que lo detengan hoy,
Cada usuario en su camino,
Se autoriza tal como soy. 🌟

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive El título 'OM-403' es solo un identificador de ticket sin descripción del cambio realizado. No comunica claramente cuál es el cambio principal en el código. Mejorar el título para que describa el cambio principal, por ejemplo: 'Crear función de autorización para cualquier tipo de usuario' o 'Refactorizar autorización de actualización de usuario'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch OM-403
⚔️ Resolve merge conflicts
  • Resolve merge conflict in branch OM-403

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/modules/users/users/services/users.services.js (1)

298-301: ⚠️ Potential issue | 🟠 Major

Inconsistencia en la autorización entre servicios de actualización.

updateUserService usa getAuthorizedUserForUpdateService (permite cualquier rol autenticado), pero updateUserPasswordService usa getAuthorizedCustomerService (solo permite CUSTOMER). Esto significa que usuarios con rol SELLER o ADMIN pueden actualizar su nombre/email/teléfono, pero no pueden cambiar su contraseña.

Aclarar si este comportamiento es intencional o si se debe unificar la autorización en ambos servicios.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/modules/users/users/services/users.services.js` around lines 298 - 301,
Hay una inconsistencia de autorización: updateUserService usa
getAuthorizedUserForUpdateService (permite cualquier rol autenticado) mientras
que updateUserPasswordService usa getAuthorizedCustomerService (solo CUSTOMER),
lo que impide que SELLER/ADMIN cambien su contraseña; unifica la política
reemplazando la llamada a getAuthorizedCustomerService en
updateUserPasswordService por getAuthorizedUserForUpdateService (o ajusta ambas
funciones para compartir una nueva función común de autorización) y asegúrate de
mantener/propagar los mismos parámetros y comprobaciones (authenticatedUserId,
requestedUserId) y de actualizar los tests/documentación según corresponda.
🧹 Nitpick comments (2)
src/modules/users/users/services/users.services.js (2)

387-412: Duplicación de código con getAuthorizedCustomerService.

Esta nueva función es casi idéntica a getAuthorizedCustomerService (líneas 51-99), diferenciándose solo en la ausencia de la verificación de rol CUSTOMER. Considerar refactorizar para evitar duplicación.

♻️ Refactor sugerido - extraer lógica común
+const getAuthorizedUserBase = async (authenticatedUserId, requestedUserId, errorMessage) => {
+    if (!authenticatedUserId) {
+        throw { status: 401, message: "Usuario autenticado requerido" };
+    }
+
+    const authenticatedId = parsePositiveInteger(authenticatedUserId, "ID de usuario autenticado");
+    const targetUserId = parsePositiveInteger(requestedUserId, "ID de usuario");
+
+    if (authenticatedId !== targetUserId) {
+        throw { status: 403, message: errorMessage };
+    }
+
+    const user = await prisma.users.findUnique({
+        where: { id_user: targetUserId },
+        select: { id_user: true, role: true, status: true },
+    });
+
+    if (!user || !user.status) {
+        throw { status: 404, message: "Usuario no encontrado o inactivo" };
+    }
+
+    return user;
+};
+
+export const getAuthorizedCustomerService = async (authenticatedUserId, requestedUserId) => {
+    const user = await getAuthorizedUserBase(authenticatedUserId, requestedUserId, "No tiene permisos para editar este perfil");
+    if (user.role !== "CUSTOMER") {
+        throw { status: 403, message: "El usuario no es un cliente" };
+    }
+    return user;
+};
+
+const getAuthorizedUserForUpdateService = async (authenticatedUserId, requestedUserId) => {
+    return getAuthorizedUserBase(authenticatedUserId, requestedUserId, "No tiene permisos para editar este perfil");
+};
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/modules/users/users/services/users.services.js` around lines 387 - 412,
The getAuthorizedUserForUpdateService duplicates most logic from
getAuthorizedCustomerService; extract the shared validation and lookup into a
helper (e.g., authorizeAndFetchUser or getAuthorizedUserById) that accepts
parameters for whether to enforce a specific role, reusing parsePositiveInteger
and prisma.users.findUnique to validate IDs and fetch {id_user, role, status};
then implement getAuthorizedCustomerService by calling the helper with
role="CUSTOMER" and getAuthorizedUserForUpdateService by calling it with no role
enforcement (or role=null) so both functions delegate to the common logic.

191-191: Nombre de variable engañoso.

La variable customer ahora puede contener cualquier tipo de usuario (no solo CUSTOMER). Considerar renombrarla a user o authorizedUser para mayor claridad.

♻️ Refactor sugerido
-    const customer = await getAuthorizedUserForUpdateService(authenticatedUserId, requestedUserId);
+    const user = await getAuthorizedUserForUpdateService(authenticatedUserId, requestedUserId);

Y actualizar las referencias en las líneas 265 y 284:

-        if (existingUser && existingUser.id_user !== customer.id_user) {
+        if (existingUser && existingUser.id_user !== user.id_user) {
-            id_user: customer.id_user,
+            id_user: user.id_user,
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/modules/users/users/services/users.services.js` at line 191, La variable
llamada `customer` que recibe el resultado de getAuthorizedUserForUpdateService
debe renombrarse a algo genérico como `user` o `authorizedUser` porque puede
representar cualquier tipo de usuario; update todas las referencias posteriores
que usan `customer` (por ejemplo las lecturas/propagaciones que actualmente
aparecen tras la llamada a getAuthorizedUserForUpdateService) para usar el nuevo
nombre (`user` o `authorizedUser`) y mantener consistencia en las líneas donde
se lee/usa ese valor (referencias actuales a `customer` en el bloque de código
posterior deben actualizarse).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Outside diff comments:
In `@src/modules/users/users/services/users.services.js`:
- Around line 298-301: Hay una inconsistencia de autorización: updateUserService
usa getAuthorizedUserForUpdateService (permite cualquier rol autenticado)
mientras que updateUserPasswordService usa getAuthorizedCustomerService (solo
CUSTOMER), lo que impide que SELLER/ADMIN cambien su contraseña; unifica la
política reemplazando la llamada a getAuthorizedCustomerService en
updateUserPasswordService por getAuthorizedUserForUpdateService (o ajusta ambas
funciones para compartir una nueva función común de autorización) y asegúrate de
mantener/propagar los mismos parámetros y comprobaciones (authenticatedUserId,
requestedUserId) y de actualizar los tests/documentación según corresponda.

---

Nitpick comments:
In `@src/modules/users/users/services/users.services.js`:
- Around line 387-412: The getAuthorizedUserForUpdateService duplicates most
logic from getAuthorizedCustomerService; extract the shared validation and
lookup into a helper (e.g., authorizeAndFetchUser or getAuthorizedUserById) that
accepts parameters for whether to enforce a specific role, reusing
parsePositiveInteger and prisma.users.findUnique to validate IDs and fetch
{id_user, role, status}; then implement getAuthorizedCustomerService by calling
the helper with role="CUSTOMER" and getAuthorizedUserForUpdateService by calling
it with no role enforcement (or role=null) so both functions delegate to the
common logic.
- Line 191: La variable llamada `customer` que recibe el resultado de
getAuthorizedUserForUpdateService debe renombrarse a algo genérico como `user` o
`authorizedUser` porque puede representar cualquier tipo de usuario; update
todas las referencias posteriores que usan `customer` (por ejemplo las
lecturas/propagaciones que actualmente aparecen tras la llamada a
getAuthorizedUserForUpdateService) para usar el nuevo nombre (`user` o
`authorizedUser`) y mantener consistencia en las líneas donde se lee/usa ese
valor (referencias actuales a `customer` en el bloque de código posterior deben
actualizarse).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 9aaa6695-b841-467d-86d8-8df6d1cac2db

📥 Commits

Reviewing files that changed from the base of the PR and between 1e034fa and a9c377f.

📒 Files selected for processing (1)
  • src/modules/users/users/services/users.services.js

@CrisNAC
CrisNAC merged commit ce571e3 into dev Mar 24, 2026
1 of 2 checks passed
@coderabbitai coderabbitai Bot mentioned this pull request Mar 25, 2026
@Andoumeda
Andoumeda deleted the OM-403 branch April 11, 2026 17:10
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants