Skip to content

Auditoría BAC en pedidos, asignaciones y notificaciones - #195

Merged
CrisNAC merged 6 commits into
devfrom
OM-552
Jun 4, 2026
Merged

CrisNAC merged 6 commits into
devfrom
OM-552

Conversation

@Andoumeda

@Andoumeda Andoumeda commented Jun 3, 2026 •

Copy link
Copy Markdown
Collaborator

Summary by CodeRabbit

Release Notes

  • Documentation

    • Se añadió documentación de auditoría de seguridad para la API de asignaciones y notificaciones de entregas.
  • Bug Fixes

    • Se implementaron controles de acceso restringido por rol (vendedor, cliente, repartidor) en asignaciones de entregas.
    • Se agregó validación para garantizar que solo repartidores con asignaciones aceptadas puedan actualizar el estado de pedidos.
    • Se mejoró la validación de datos en formularios de registro.
  • Tests

    • Se actualizaron tests para reflejar nuevos controles de seguridad.

@coderabbitai

coderabbitai Bot commented Jun 3, 2026 •

Copy link
Copy Markdown
Contributor

Review Change Stack

Warning

Review limit reached

@coderabbitai[bot], we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 24 minutes and 42 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 682ae04e-b3e6-4902-9f5b-ec4532bfdb86

📥 Commits

Reviewing files that changed from the base of the PR and between 5dc12b6 and adda519.

📒 Files selected for processing (5)
  • src/modules/delivery/delivery-assignments/delivery-assignments.service.js
  • tests/e2e/delivery-assignments-create.test.js
  • tests/unit/commerce/delivery-assignments.test.js
  • tests/unit/delivery/delivery-assignments.test.js
  • tests/unit/delivery/delivery-register.test.js
📝 Walkthrough

Walkthrough

Se implementa autorización y validación en el flujo de asignaciones de delivery. Se agregan helpers centralizados de seguridad, se propaga el usuario autenticado a todos los servicios, se valida pertenencia de tienda en creación, se restringe acceso en lecturas según rol, y se exige una asignación ACCEPTED para que repartidores transicionen pedidos a DELIVERED. Se actualiza documentación de auditoría BAC.

Changes

Validación de autorización en asignaciones de delivery y transiciones de pedidos

Layer / File(s) Resumen
Helpers de seguridad y creación de asignaciones con validación
src/modules/delivery/delivery-assignments/delivery-assignments.service.js, src/modules/delivery/delivery-assignments/delivery-assignments.controller.js, tests/e2e/delivery-assignments-create.test.js, tests/unit/commerce/delivery-assignments.test.js
Se incorporan funciones resolveAuth y ensureOrderAccess para autorización centralizada. createAssignmentService ahora exige rol SELLER, valida pertenencia del pedido al comercio del vendedor, y comprueba que un delivery opcional pertenezca al mismo store. El controlador propaga req.user en la llamada. Tests ajustan mocks para reflejar datos adicionales requeridos (store.fk_user, fk_store).
Lecturas de asignaciones con control de acceso por rol
src/modules/delivery/delivery-assignments/delivery-assignments.service.js, src/modules/delivery/delivery-assignments/delivery-assignments.controller.js, tests/unit/delivery/delivery-assignments.test.js, tests/unit/delivery/delivery-assignments-controller.test.js
getAssignmentByIdService, getOrderAssignmentsService, getDeliveryAssignmentsService, getDeliveryPendingAssignmentsService y getAcceptedAssignmentService actualizan firmas para recibir authenticatedUser. Se valida acceso según rol (SELLER propietario del comercio, CUSTOMER dueño del pedido, DELIVERY asignado). El controlador propaga req.user en todas las llamadas. Tests unitarios cubren casos de error (404, 403) y flujos permitidos con el nuevo contexto de usuario.
Restricción de actualización de orden para repartidores con asignación validada
src/modules/users/orders/order.service.js, tests/unit/order/order.test.js
updateOrderStatusService agrega verificación transaccional para rol DELIVERY: exige una asignación ACCEPTED, activa y vinculada al usuario autenticado antes de permitir actualización. Si no existe asignación válida, rechaza con ForbiddenError. Tests configuran mocks por defecto y agregan cobertura para rechazo sin asignación válida.
Documentación de auditoría y ajustes auxiliares
docs/auditoria-bac.md, src/modules/delivery/delivery/delivery.controller.js, tests/unit/delivery/delivery-register.test.js
Se agrega documento auditoria-bac.md formalizando reglas de autorización. Se unifican mensajes de error de ZodError en registerDelivery. Se ajustan mocks en tests de registro de delivery.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Possibly related PRs

  • CrisNAC/BackendMarketplace#68: Modifica updateOrderStatusService en la misma función afectada por este PR; la anterior PR ajusta reglas de transición mientras esta PR agrega validación de asignación ACCEPTED para rol DELIVERY.
  • CrisNAC/BackendMarketplace#128: Introduce la estructura inicial del módulo delivery-assignments que este PR extiende con autenticación, autorización y validaciones de acceso.
  • CrisNAC/BackendMarketplace#166: Toca los mocks e2e de POST /api/assignments (prueba de creación) que este PR reafecta para incluir validación de pertenencia de tienda.

Suggested reviewers

  • Benjakr04
  • leoAchu16
  • CrisNAC

Poem

🐰 Validar y proteger, que art es de guardar,
Por rol y pertenencia, el acceso controlar,
SELLER su tienda cuida, DELIVERY entrega sin fallar,
Con asignaciones ACCEPTED, la entrega puede llegar.
¡Seguridad en capas, el código a reivindicar! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed El título es específico y describe claramente el cambio principal: implementar auditoría BAC (control de acceso basado en comportamiento) en pedidos, asignaciones de entrega y notificaciones, lo cual se refleja en toda la documentación y cambios de código del PR.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch OM-552

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.

Actionable comments posted: 4

🧹 Nitpick comments (2)
tests/e2e/delivery-register.test.js (1)

138-142: ⚡ Quick win

No aflojen la cobertura del phone heredado.

Ahora el setup agrega phone, pero la expectativa del users.update sólo valida role. Si registerDeliveryService deja de propagar el teléfono existente cuando no viene en el body, este caso seguiría pasando.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/e2e/delivery-register.test.js` around lines 138 - 142, The test
currently only asserts that prisma.users.update is called with role "DELIVERY"
but ignores preserving the existing phone added in the test setup; update the
expectation in the delivery register test so prisma.users.update's data includes
both role: "DELIVERY" and the existing phone value from the test setup (e.g.,
assert data contains { role: "DELIVERY", phone: <existingPhoneVariable> }) to
ensure registerDeliveryService preserves inherited phone when none is provided
in the request body.
tests/unit/order/order.test.js (1)

249-270: ⚡ Quick win

Aserten también el where de deliveryAssignments.findFirst.

Estos casos sólo mockean el retorno, así que un filtro Prisma mal armado en el servicio también queda verde. Una expectativa sobre la forma del where les cubre la autorización de DELIVERY y evita que se cuele de nuevo un query inválido.

🧪 Ejemplo
   const result = await updateOrderStatusService(1, 100, "DELIVERED");

   expect(result.status).toBe("DELIVERED");
+  expect(prisma.deliveryAssignments.findFirst).toHaveBeenCalledWith(
+    expect.objectContaining({
+      where: expect.objectContaining({
+        fk_order: 100,
+        assignment_status: "ACCEPTED",
+        status: true,
+        delivery: expect.objectContaining({
+          is: { fk_user: 1 }
+        })
+      })
+    })
+  );
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@tests/unit/order/order.test.js` around lines 249 - 270, Añade en ambos tests
una expectativa que verifique el filtro pasado a
prisma.deliveryAssignments.findFirst para asegurarnos de que el where está
correctamente construido; por ejemplo, después de preparar los mocks y
antes/after de invocar updateOrderStatusService(1, 100, "DELIVERED") añade
expect(prisma.deliveryAssignments.findFirst).toHaveBeenCalledWith(expect.objectContaining({
where: expect.objectContaining({ fk_delivery_user: 1, fk_order: 100 }) }))
(ajusta los keys si en tu modelo se llaman distinto) para validar que la
autorización de DELIVERY usa el where correcto en la llamada desde
updateOrderStatusService.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/modules/delivery/delivery-assignments/delivery-assignments.service.js`:
- Around line 45-56: The DELIVERY authorization currently only checks fk_user on
deliveryAssignments queries (e.g., in getDeliveryPendingAssignmentsService using
prisma.deliveryAssignments.findFirst) and thus allows disabled delivery users;
replicate the same active-status check used in getDeliveryOrderHistoryService by
ensuring the query filters for delivery.status = true (or explicitly verify
delivery.status and throw the 403) wherever deliveries are authorized (including
the affected branches around the findFirst/select checks and the other instances
you noted) so disabled deliveries cannot list or read order/client data.
- Around line 73-87: The current access check in delivery-assignments.service.js
only compares order.store.fk_user to auth.id_user and misses store.status,
allowing suspended/inactive stores to act; update the code (same pattern at the
other occurrences noted) to select store.status when fetching the order and
enforce that the store is active before permitting assignment or reads: e.g.,
add store: { select: { fk_user: true, status: true } } in the
prisma.orders.findUnique call and throw a 403 (same shape as existing errors) if
store.status is not the expected "active" value (or reuse ensureOrderAccess()
behavior) so suspended/inactive merchants are blocked.

In `@src/modules/users/orders/order.service.js`:
- Around line 864-878: La validación de delivery está sujeta a TOCTOU porque se
hace con prisma.deliveryAssignments.findFirst antes de la actualización; arregla
envolviendo la revalidación y el update en la misma transacción: usar
prisma.$transaction(async (tx) => { const deliveryAssignment = await
tx.deliveryAssignments.findFirst({ where: { fk_order: resolvedOrderId,
assignment_status: "ACCEPTED", status: true, delivery: { fk_user: resolvedUserId
} }, select: { id_delivery_assignment: true } }); if (!deliveryAssignment) throw
new ForbiddenError("No tienes permisos para modificar este pedido."); await
tx.orders.update({ where: { id: resolvedOrderId }, data: { /* cambios que ya
haces */ } }); }); y asegurarte de reemplazar las llamadas a prisma.* por tx.*
dentro del cierre para que la comprobación y el orders.update sean atómicos.
- Around line 865-870: El where de la consulta
prisma.deliveryAssignments.findFirst usa una sintaxis inválida para una relación
to-one; reemplazá el filtro relacional delivery: { fk_user: resolvedUserId } por
delivery: { is: { fk_user: resolvedUserId } } dentro de la misma llamada a
prisma.deliveryAssignments.findFirst, y además mové la verificación de
autorización relacionada con esa asignación para ejecutarla dentro de la misma
prisma.$transaction que realiza la actualización del pedido (asegurate de usar
la misma transacción para leer la asignación aceptada y luego mutar el pedido)
para evitar condiciones de carrera.

---

Nitpick comments:
In `@tests/e2e/delivery-register.test.js`:
- Around line 138-142: The test currently only asserts that prisma.users.update
is called with role "DELIVERY" but ignores preserving the existing phone added
in the test setup; update the expectation in the delivery register test so
prisma.users.update's data includes both role: "DELIVERY" and the existing phone
value from the test setup (e.g., assert data contains { role: "DELIVERY", phone:
<existingPhoneVariable> }) to ensure registerDeliveryService preserves inherited
phone when none is provided in the request body.

In `@tests/unit/order/order.test.js`:
- Around line 249-270: Añade en ambos tests una expectativa que verifique el
filtro pasado a prisma.deliveryAssignments.findFirst para asegurarnos de que el
where está correctamente construido; por ejemplo, después de preparar los mocks
y antes/after de invocar updateOrderStatusService(1, 100, "DELIVERED") añade
expect(prisma.deliveryAssignments.findFirst).toHaveBeenCalledWith(expect.objectContaining({
where: expect.objectContaining({ fk_delivery_user: 1, fk_order: 100 }) }))
(ajusta los keys si en tu modelo se llaman distinto) para validar que la
autorización de DELIVERY usa el where correcto en la llamada desde
updateOrderStatusService.
🪄 Autofix (Beta)

✅ Autofix completed


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: dd0d1605-c2f6-4779-84c3-f443a4c84553

📥 Commits

Reviewing files that changed from the base of the PR and between 4ef0145 and 088ba0b.

📒 Files selected for processing (14)
  • docs/auditoria-bac.md
  • src/modules/delivery/delivery-assignments/delivery-assignments.controller.js
  • src/modules/delivery/delivery-assignments/delivery-assignments.service.js
  • src/modules/delivery/delivery/delivery.controller.js
  • src/modules/users/orders/order.service.js
  • tests/e2e/delivery-assignments-create.test.js
  • tests/e2e/delivery-register.test.js
  • tests/e2e/notifications.test.js
  • tests/e2e/stock.test.js
  • tests/unit/commerce/delivery-assignments.test.js
  • tests/unit/delivery/delivery-assignments-controller.test.js
  • tests/unit/delivery/delivery-assignments.test.js
  • tests/unit/delivery/delivery-register.test.js
  • tests/unit/order/order.test.js

Comment thread src/modules/users/orders/order.service.js Outdated
Comment thread src/modules/users/orders/order.service.js Outdated
@coderabbitai

coderabbitai Bot commented Jun 3, 2026 •

Copy link
Copy Markdown
Contributor

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Fixes Applied Successfully

Fixed 3 file(s) based on 4 unresolved review comments.

Files modified:

  • src/modules/delivery/delivery-assignments/delivery-assignments.service.js
  • src/modules/users/orders/order.service.js
  • tsconfig.json

Commit: 87349a1dc04a3c5b2c034dd9e9bc666451ec39eb

The changes have been pushed to the OM-552 branch.

Time taken: 3m 34s

Fixed 3 file(s) based on 4 unresolved review comments.

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>

@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.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/modules/users/orders/order.service.js`:
- Around line 890-904: El fallo viene del test: actualizar el mock de la
transacción para incluir un resultado para deliveryAssignments.findFirst usado
por order.service (TOCTOU ya resuelto). En la fábrica createMockTx o en el caso
de prueba "DELIVERY SHIPPED → DELIVERED: transición permitida" añade
deliveryAssignments: { findFirst: vi.fn().mockResolvedValue({
id_delivery_assignment: 1 }) } (o similar) para que la llamada dentro de la
transacción no devuelva undefined y no lance ForbiddenError; referencia
createMockTx y deliveryAssignments.findFirst para localizar dónde añadir el
mock.
🪄 Autofix (Beta)

✅ Autofix completed


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 3735b9cd-7a1d-4ca7-b9ed-d4b7ac004074

📥 Commits

Reviewing files that changed from the base of the PR and between 088ba0b and 87349a1.

📒 Files selected for processing (3)
  • src/modules/delivery/delivery-assignments/delivery-assignments.service.js
  • src/modules/users/orders/order.service.js
  • tsconfig.json
✅ Files skipped from review due to trivial changes (1)
  • tsconfig.json
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/modules/delivery/delivery-assignments/delivery-assignments.service.js

Comment thread src/modules/users/orders/order.service.js
@coderabbitai

coderabbitai Bot commented Jun 3, 2026 •

Copy link
Copy Markdown
Contributor

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Fixes Applied Successfully

Fixed 1 file(s) based on 1 unresolved review comment.

Files modified:

  • tests/unit/order/order.test.js

Commit: 80c319088a02d1618f8a6d2fa89b253f4bc45030

The changes have been pushed to the OM-552 branch.

Time taken: 3m 10s

coderabbitai Bot and others added 2 commits June 3, 2026 17:55
Fixed 1 file(s) based on 1 unresolved review comment.

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
@Andoumeda

Copy link
Copy Markdown
Collaborator Author

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Jun 4, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Review finished.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@Andoumeda

Copy link
Copy Markdown
Collaborator Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jun 4, 2026 •

Copy link
Copy Markdown
Contributor
✅ Action performed

Full review finished.

@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.

Actionable comments posted: 5

♻️ Duplicate comments (1)
src/modules/delivery/delivery-assignments/delivery-assignments.service.js (1)

189-193: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Falta bloquear entidades inactivas en lecturas autorizadas (store/delivery).

En Line 203, 211, 272 y 331 se valida propietario (fk_user) pero no estado activo. Un comercio o delivery desactivado podría seguir leyendo asignaciones/datos de pedido. Este punto ya había sido señalado previamente y reapareció en estas rutas.

🔒 Ajuste sugerido
       order: {
         select: {
           id_order: true,
           total: true,
           created_at: true,
           fk_user: true,
-          store: { select: { fk_user: true } }
+          store: { select: { fk_user: true, status: true } }
         }
       },
       delivery: {
-        select: { id_delivery: true, delivery_status: true, fk_user: true }
+        select: { id_delivery: true, delivery_status: true, fk_user: true, status: true }
       }

-    if (assignment.order?.store?.fk_user !== auth.id_user) {
+    if (assignment.order?.store?.fk_user !== auth.id_user || !assignment.order?.store?.status) {
       throw { status: 403, message: "No tienes permiso para ver esta asignación" };
     }

-    if (assignment.delivery?.fk_user !== auth.id_user) {
+    if (assignment.delivery?.fk_user !== auth.id_user || !assignment.delivery?.status) {
       throw { status: 403, message: "No tienes permiso para ver esta asignación" };
     }

   const delivery = await prisma.deliveries.findUnique({
     where: { id_delivery },
-    select: { id_delivery: true, fk_user: true }
+    select: { id_delivery: true, fk_user: true, status: true }
   });

-  if (delivery.fk_user !== auth.id_user) {
+  if (delivery.fk_user !== auth.id_user || !delivery.status) {
     throw { status: 403, message: "No tienes permiso para ver asignaciones de este delivery" };
   }

Also applies to: 202-213, 263-274, 322-333

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/modules/delivery/delivery-assignments/delivery-assignments.service.js`
around lines 189 - 193, Las lecturas autorizadas están validando solo el
propietario (fk_user) pero no el estado activo de las entidades store/delivery;
actualiza las consultas y validaciones en delivery-assignments.service.js para
incluir el filtro/chequeo de entidad activa (por ejemplo where: { fk_user: ...,
active: true } o comprobar store.active/delivery.active junto a fk_user) en los
lugares que usan store y delivery (referencias a store, delivery, fk_user,
delivery_status en las selecciones) para bloquear comercios/deliveries
desactivados al leer asignaciones; aplícalo de forma consistente en los puntos
señalados (las validaciones que usan fk_user en este servicio).
🧹 Nitpick comments (1)
src/modules/delivery/delivery/delivery.controller.js (1)

54-54: ⚡ Quick win

Inconsistencia en el manejo de errores de validación.

Esta función ahora devuelve siempre el mensaje fijo "Datos inválidos" cuando hay un ZodError, pero las funciones updateDeliveryStatus (línea 94) y updateDeliveryProfile (línea 175) en el mismo archivo aún usan error.issues[0].message para extraer mensajes dinámicos de validación. Esto crea una experiencia de usuario inconsistente entre endpoints.

Si la intención es unificar los mensajes de error, considerá aplicar el mismo patrón en los tres bloques catch de ZodError.

🔧 Propuesta para unificar el manejo de errores

Aplicá el mismo patrón en las líneas 94 y 175:

     if (error instanceof ZodError) {
       return res.status(400).json({
         error: {
           code: 400,
-          message: error.issues[0].message,
+          message: "Datos inválidos",
           details: error.issues
         }
       });
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/modules/delivery/delivery/delivery.controller.js` at line 54, En el
bloque catch que actualmente responde con message: "Datos inválidos" reemplazá
ese mensaje estático por la extracción dinámica del primer issue del ZodError
(por ejemplo usar error.issues[0].message) para que coincida con el
comportamiento ya usado en updateDeliveryStatus y updateDeliveryProfile; mantené
la validación de tipo (instanceof ZodError) y devolvé el mensaje dinámico en el
mismo formato de respuesta que usan esas funciones.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/modules/delivery/delivery-assignments/delivery-assignments.service.js`:
- Around line 46-51: En ensureOrderAccess y en la consulta que busca
asignaciones (ej. la query en deliveryAssignments.findFirst) cambia el filtro de
relación to-one de delivery: { ... } a delivery: { is: { fk_user: auth.id_user,
status: true, delivery_status: 'ACTIVE' } } (o usa el enum/valor correcto para
estado activo) para usar la sintaxis Prisma correcta y además en
getDeliveryAssignmentsService y getDeliveryPendingAssignmentsService añade el
mismo filtro sobre delivery.is para forzar que solo se devuelvan asignaciones
cuyo delivery pertenece al usuario y esté activo (incluye status y
delivery_status según el modelo).

In `@tests/e2e/delivery-assignments-create.test.js`:
- Around line 80-84: El mock de pedido usado en el test falla la nueva
precondición de store activa: en el objeto retornado por
prisma.orders.findUnique (usado por createAssignmentService) añade la propiedad
status: true dentro de store (p. ej. store: { fk_user: 1, status: true }) para
que la validación de store activa pase y el test no devuelva 403.

In `@tests/unit/commerce/delivery-assignments.test.js`:
- Around line 217-221: El mock de orders usado por los tests de
createAssignmentService está devolviendo store sin la propiedad status activa,
lo que provoca un 403 antes de llegar a las comprobaciones esperadas; actualiza
los mocks de vi.mocked(prisma.orders.findUnique) en los puntos donde se define
store (los casos alrededor del test que espera 409/PENDING) para incluir
store.status: true y así permitir que createAssignmentService continue hasta la
lógica que debe probarse (asegúrate de modificar ambos mocks que devuelven store
en esos tests).

In `@tests/unit/delivery/delivery-assignments.test.js`:
- Around line 77-83: El fixture mockOrder está desactualizado: su propiedad
store debe incluir status: true para evitar que la capa de autorización devuelva
403 y permitir que los tests de create lleguen a los escenarios 404/409;
actualiza el objeto mockOrder (símbolo: mockOrder en
delivery-assignments.test.js) añadiendo store.status = true y revisa otros casos
de prueba que reutilicen mockOrder para garantizar que esperan un store activo
cuando corresponda.

In `@tests/unit/delivery/delivery-register.test.js`:
- Around line 124-126: El objeto mock en el test de delivery tiene la clave
duplicada "phone" (aparecen `phone: "1234567890"` dos veces alrededor de la
propiedad `delivery`); elimina la segunda definición duplicada dejando solo una
entrada `phone` para ese objeto (mantén el valor existente) para evitar
sobrescritura redundante en el test.

---

Duplicate comments:
In `@src/modules/delivery/delivery-assignments/delivery-assignments.service.js`:
- Around line 189-193: Las lecturas autorizadas están validando solo el
propietario (fk_user) pero no el estado activo de las entidades store/delivery;
actualiza las consultas y validaciones en delivery-assignments.service.js para
incluir el filtro/chequeo de entidad activa (por ejemplo where: { fk_user: ...,
active: true } o comprobar store.active/delivery.active junto a fk_user) en los
lugares que usan store y delivery (referencias a store, delivery, fk_user,
delivery_status en las selecciones) para bloquear comercios/deliveries
desactivados al leer asignaciones; aplícalo de forma consistente en los puntos
señalados (las validaciones que usan fk_user en este servicio).

---

Nitpick comments:
In `@src/modules/delivery/delivery/delivery.controller.js`:
- Line 54: En el bloque catch que actualmente responde con message: "Datos
inválidos" reemplazá ese mensaje estático por la extracción dinámica del primer
issue del ZodError (por ejemplo usar error.issues[0].message) para que coincida
con el comportamiento ya usado en updateDeliveryStatus y updateDeliveryProfile;
mantené la validación de tipo (instanceof ZodError) y devolvé el mensaje
dinámico en el mismo formato de respuesta que usan esas funciones.
🪄 Autofix (Beta)

✅ Autofix completed


ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c99c60d3-29da-4114-ba6e-d4a746b7a884

📥 Commits

Reviewing files that changed from the base of the PR and between 50e6983 and b5fdeef.

📒 Files selected for processing (14)
  • docs/auditoria-bac.md
  • src/modules/delivery/delivery-assignments/delivery-assignments.controller.js
  • src/modules/delivery/delivery-assignments/delivery-assignments.service.js
  • src/modules/delivery/delivery/delivery.controller.js
  • src/modules/users/orders/order.service.js
  • tests/e2e/delivery-assignments-create.test.js
  • tests/e2e/delivery-register.test.js
  • tests/e2e/notifications.test.js
  • tests/e2e/stock.test.js
  • tests/unit/commerce/delivery-assignments.test.js
  • tests/unit/delivery/delivery-assignments-controller.test.js
  • tests/unit/delivery/delivery-assignments.test.js
  • tests/unit/delivery/delivery-register.test.js
  • tests/unit/order/order.test.js

Comment thread tests/e2e/delivery-assignments-create.test.js
Comment thread tests/unit/commerce/delivery-assignments.test.js
Comment thread tests/unit/delivery/delivery-assignments.test.js
Comment thread tests/unit/delivery/delivery-register.test.js Outdated
@coderabbitai

coderabbitai Bot commented Jun 4, 2026 •

Copy link
Copy Markdown
Contributor

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

❌ Cannot run autofix: This PR has merge conflicts.

Please resolve the conflicts with the base branch and try again.

Alternatively, use @coderabbitai resolve merge conflict to automatically resolve the conflicts.

@Andoumeda

Copy link
Copy Markdown
Collaborator Author

@coderabbitai resolve merge conflict

@coderabbitai

coderabbitai Bot commented Jun 4, 2026 •

Copy link
Copy Markdown
Contributor

✅ Merge conflicts resolved successfully!

Resolved 3 conflict file(s). Commit: 5dc12b6bce6f25257cc1b9210f60b1e7b02f518a pushed to OM-552.

11 file operation(s)
  • docs/auditoria-bac.md (update)
  • src/modules/delivery/delivery-assignments/delivery-assignments.controller.js (update)
  • src/modules/delivery/delivery-assignments/delivery-assignments.service.js (update)
  • src/modules/delivery/delivery/delivery.controller.js (update)
  • src/modules/users/orders/order.service.js (update)
  • tests/e2e/delivery-assignments-create.test.js (update)
  • tests/unit/commerce/delivery-assignments.test.js (update)
  • tests/unit/delivery/delivery-assignments-controller.test.js (update)
  • tests/unit/delivery/delivery-assignments.test.js (update)
  • tests/unit/delivery/delivery-register.test.js (update)
  • tests/unit/order/order.test.js (update)
View agent analysis
I'll resolve the merge conflicts by first inspecting the git state, then analyzing and resolving each conflict.

Now I have a clear picture of all three conflicts. Let me read the current conflicted files and delegate resolution to the merge-resolver agent.

Now I have a clear understanding of all conflicts. Let me analyze them:

**delivery-register.test.js**: 
- HEAD (OM-552): `data: expect.objectContaining({ role: "DELIVERY" })` + `phone: "1234567890"` in mock + duplicate `phone` key issue
- dev: `data: expect.objectContaining({ role: "DELIVERY", phone: "0981234567" })` + `phone: "0981234567"` 
- Resolution: Use dev's version (more complete, includes phone in both mock and assertion), clean up the duplicate `phone` key

**notifications.test.js**:
- HEAD (OM-552): `count: vi.fn().mockResolvedValue(0)` (inline default)
- dev: `count: vi.fn()` (no default, set in beforeEach)
- Both sides add `count` - dev sets it in beforeEach hooks, OM-552 sets default inline. Since dev also sets it per-test in beforeEach, using dev's `count: vi.fn()` is correct.

**stock.test.js**: Same pattern - HEAD has inline default, dev uses per-test setup in beforeEach.

No unmerged files remain. Let me verify the resolved files look correct and run checks.

The TypeScript build error is pre-existing (the `@types/node` package isn't installed in this environment) and unrelated to the merge conflict changes. All three files pass syntax validation.

All three merge conflicts are resolved and staged. Here's a summary:

---

## Resolution Summary

### `tests/e2e/delivery-register.test.js`

**What each side did:**
- **HEAD (OM-552)**: Added `phone: "1234567890"` to the `findUnique` mock and used `expect.objectContaining({ role: "DELIVERY" })` in the `users.update` assertion.
- **dev**: Added `phone: "0981234567"` to the mock and extended the assertion to also verify `phone: "0981234567"` was passed to the update — reflecting that delivery registration now persists the user's phone number.

**Resolution**: Used the dev version for both changes (phone in mock + phone in assertion). Also removed the duplicate `phone: "1234567890"` key that was left from the OM-552 side (the object had two `phone` properties).

### `tests/e2e/notifications.test.js`

**What each side did:**
- **HEAD (OM-552)**: Added `count: vi.fn().mockResolvedValue(0)` inline in the mock definition.
- **dev**: Added `count: vi.fn()` (no default), then configured it to return `0` in `beforeEach` hooks.

**Resolution**: Used the dev version (`count: vi.fn()`). The dev approach is correct — the default is set per-test in `beforeEach`, which is the established pattern in this file.

### `tests/e2e/stock.test.js`

**Same pattern** as notifications — HEAD had the default inline, dev separates the initialization into `beforeEach` hooks. Used the dev version (`count: vi.fn()`) for the same reason.

**Behavioral snapshot**: Every line in the resolved files traces directly to one of the two sides. The dev branch changes are more complete (phone assertion, proper beforeEach initialization), so they were preferred for the conflicting hunks.

Resolved conflicts in:
- tests/e2e/delivery-register.test.js (content)
- tests/e2e/notifications.test.js (content)
- tests/e2e/stock.test.js (content)

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>

@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.

♻️ Duplicate comments (3)
src/modules/delivery/delivery-assignments/delivery-assignments.service.js (3)

221-228: ⚠️ Potential issue | 🟠 Major

getAssignmentByIdService quedó más permisivo para SELLER que el helper común.

ensureOrderAccess() ya exige stores.status = true, pero este path manual sólo compara fk_user. Con un token todavía válido, un seller suspendido puede seguir leyendo la asignación por ID. Acá conviene traer store.status en el select y rechazar !assignment.order?.store?.status, o directamente reutilizar el helper.

Also applies to: 241-243

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/modules/delivery/delivery-assignments/delivery-assignments.service.js`
around lines 221 - 228, La rama en getAssignmentByIdService está más permisiva
para SELLER que el helper ensureOrderAccess: actualmente sólo selecciona
order.store.fk_user pero no order.store.status, por lo que un vendedor
suspendido aún puede leer la asignación; arregla esto trayendo store.status en
el select (añadir store: { select: { fk_user: true, status: true } }) y luego
rechaza el acceso cuando !assignment.order?.store?.status, o mejor: reutiliza el
helper ensureOrderAccess() para validar permisos/estado de la tienda en lugar de
la comprobación manual; aplica el mismo cambio al otro lugar similar en este
archivo (el segundo path equivalente mencionado en el comentario).

46-54: ⚠️ Potential issue | 🟠 Major

Usen el filtro is de Prisma para esta relación to-one.

delivery en deliveryAssignments se está filtrando como una relación to-one. Con delivery: { fk_user: ..., status: true }, Prisma valida el where como inválido y la rama DELIVERY de ensureOrderAccess() termina rompiendo en runtime antes de autorizar getOrderAssignmentsService() y getAcceptedAssignmentService().

🔧 Ajuste mínimo
     const assignment = await prisma.deliveryAssignments.findFirst({
       where: {
         fk_order: order.id_order,
         status: true,
-        delivery: { fk_user: auth.id_user, status: true }
+        delivery: { is: { fk_user: auth.id_user, status: true } }
       },
       select: { id_delivery_assignment: true }
     });
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/modules/delivery/delivery-assignments/delivery-assignments.service.js`
around lines 46 - 54, La rama que maneja auth.role === "DELIVERY" usa
prisma.deliveryAssignments.findFirst con la relación to-one `delivery` pasada
directamente; cambia ese filtro a usar el operador `is` para relaciones to-one
(por ejemplo, reemplazar delivery: { fk_user: auth.id_user, status: true } por
delivery: { is: { fk_user: auth.id_user, status: true } }) conservando el resto
del where (fk_order, status) y el select (id_delivery_assignment) para evitar la
validación inválida del where en
ensureOrderAccess()/getOrderAssignmentsService()/getAcceptedAssignmentService().

231-233: ⚠️ Potential issue | 🟠 Major

Mantengan el bloqueo de deliveries inactivos en todas las lecturas.

Estas ramas siguen autorizando sólo por fk_user. Un delivery con status = false todavía puede leer una asignación puntual y, en los listados, alcanzar expireStalePendingAssignments() antes de devolver la respuesta. getDeliveryOrderHistoryService() ya corta con !delivery.status, así que la política quedó inconsistente y sigue exponiendo datos de pedido/cliente a cuentas deshabilitadas.

Also applies to: 249-252, 302-315, 361-374

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/modules/delivery/delivery-assignments/delivery-assignments.service.js`
around lines 231 - 233, Las lecturas siguen exponiendo asignaciones de
deliveries desactivados porque sólo filtran por fk_user; debes bloquear siempre
deliveries inactivos añadiendo una condición que requiera
delivery.delivery_status === true en todas las consultas/lecturas y/o
comprobando inmediatamente después del fetch y rechazando si
delivery.delivery_status es false. Revisa y corrige los lugares señalados donde
aparece el objeto delivery (por ejemplo el bloque select mostrado y las
consultas en las zonas 249-252, 302-315, 361-374), y mantén la misma política
que usa getDeliveryOrderHistoryService() y la lógica de
expireStalePendingAssignments(): o bien incorporar delivery: { where: {
delivery_status: true } } en las consultas ORM/N+1, o validar y devolver
error/empty cuando delivery.delivery_status sea falso para evitar exponer datos
a cuentas deshabilitadas.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@src/modules/delivery/delivery-assignments/delivery-assignments.service.js`:
- Around line 221-228: La rama en getAssignmentByIdService está más permisiva
para SELLER que el helper ensureOrderAccess: actualmente sólo selecciona
order.store.fk_user pero no order.store.status, por lo que un vendedor
suspendido aún puede leer la asignación; arregla esto trayendo store.status en
el select (añadir store: { select: { fk_user: true, status: true } }) y luego
rechaza el acceso cuando !assignment.order?.store?.status, o mejor: reutiliza el
helper ensureOrderAccess() para validar permisos/estado de la tienda en lugar de
la comprobación manual; aplica el mismo cambio al otro lugar similar en este
archivo (el segundo path equivalente mencionado en el comentario).
- Around line 46-54: La rama que maneja auth.role === "DELIVERY" usa
prisma.deliveryAssignments.findFirst con la relación to-one `delivery` pasada
directamente; cambia ese filtro a usar el operador `is` para relaciones to-one
(por ejemplo, reemplazar delivery: { fk_user: auth.id_user, status: true } por
delivery: { is: { fk_user: auth.id_user, status: true } }) conservando el resto
del where (fk_order, status) y el select (id_delivery_assignment) para evitar la
validación inválida del where en
ensureOrderAccess()/getOrderAssignmentsService()/getAcceptedAssignmentService().
- Around line 231-233: Las lecturas siguen exponiendo asignaciones de deliveries
desactivados porque sólo filtran por fk_user; debes bloquear siempre deliveries
inactivos añadiendo una condición que requiera delivery.delivery_status === true
en todas las consultas/lecturas y/o comprobando inmediatamente después del fetch
y rechazando si delivery.delivery_status es false. Revisa y corrige los lugares
señalados donde aparece el objeto delivery (por ejemplo el bloque select
mostrado y las consultas en las zonas 249-252, 302-315, 361-374), y mantén la
misma política que usa getDeliveryOrderHistoryService() y la lógica de
expireStalePendingAssignments(): o bien incorporar delivery: { where: {
delivery_status: true } } en las consultas ORM/N+1, o validar y devolver
error/empty cuando delivery.delivery_status sea falso para evitar exponer datos
a cuentas deshabilitadas.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ec4a11cb-848f-4d72-88b3-c98a2e8a55bc

📥 Commits

Reviewing files that changed from the base of the PR and between b5fdeef and 5dc12b6.

📒 Files selected for processing (2)
  • src/modules/delivery/delivery-assignments/delivery-assignments.service.js
  • src/modules/users/orders/order.service.js
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/modules/users/orders/order.service.js

@coderabbitai

coderabbitai Bot commented Jun 4, 2026 •

Copy link
Copy Markdown
Contributor

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

An unexpected error occurred while generating fixes: Request timed out after 300000ms (requestId=99b1a606-576d-42a3-88b6-e6cf41c75443)

@coderabbitai

coderabbitai Bot commented Jun 4, 2026 •

Copy link
Copy Markdown
Contributor

Note

Autofix is a beta feature. Expect some limitations and changes as we gather feedback and continue to improve it.

Fixes Applied Successfully

Fixed 5 file(s) based on 5 unresolved review comments.

Files modified:

  • src/modules/delivery/delivery-assignments/delivery-assignments.service.js
  • tests/e2e/delivery-assignments-create.test.js
  • tests/unit/commerce/delivery-assignments.test.js
  • tests/unit/delivery/delivery-assignments.test.js
  • tests/unit/delivery/delivery-register.test.js

Commit: adda51961c9dce399037cea29b8db0057f745ddb

The changes have been pushed to the OM-552 branch.

Time taken: 3m 25s

Fixed 5 file(s) based on 5 unresolved review comments.

Co-authored-by: CodeRabbit <noreply@coderabbit.ai>
@sonarqubecloud

sonarqubecloud Bot commented Jun 4, 2026

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

Failed conditions
15.6% Duplication on New Code (required ≤ 3%)

See analysis details on SonarQube Cloud

@CrisNAC
CrisNAC merged commit 4cdd80b into dev Jun 4, 2026
4 of 5 checks passed
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