Skip to content

Implement delivery assignment functionality and refactor order updates - #132

Merged
Lianyang1234 merged 6 commits into
devfrom
OM-328-Delivey-accept-and-reject-orders
May 1, 2026
Merged

Lianyang1234 merged 6 commits into
devfrom
OM-328-Delivey-accept-and-reject-orders

Conversation

@CrisNAC

@CrisNAC CrisNAC commented May 1, 2026 •

Copy link
Copy Markdown
Owner

Summary by CodeRabbit

Notas de Lanzamiento

  • Nuevas Características
    • Los repartidores ahora pueden aceptar o rechazar asignaciones de entrega.
    • Al aceptar una asignación, el estado del pedido se actualiza automáticamente a "Enviado".
    • Si se rechaza una asignación, el sistema intenta reasignar el pedido a otro repartidor disponible automáticamente.
    • Se agregó validación de entrada para garantizar respuestas válidas.

@coderabbitai

coderabbitai Bot commented May 1, 2026 •

Copy link
Copy Markdown
Contributor

Warning

Rate limit exceeded

@CrisNAC has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 38 minutes and 39 seconds before requesting another review.

To keep reviews running without waiting, you can enable usage-based add-on for your organization. This allows additional reviews beyond the hourly cap. Account admins can enable it under billing.

⌛ How to resolve this issue?

After the wait time has elapsed, 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 have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: ea526676-9fd3-49ce-9c87-b348c935d0c0

📥 Commits

Reviewing files that changed from the base of the PR and between a5b9c06 and 1b22370.

📒 Files selected for processing (5)
  • src/docs/schemas/delivery.schema.js
  • src/modules/delivery/delivery-assignments/delivery-assignments.routes.js
  • src/modules/delivery/delivery-assignments/delivery-assignments.validation.js
  • src/modules/users/orders/order.service.js
  • tests/unit/order/order.test.js
📝 Walkthrough

Walkthrough

Se implementa una nueva funcionalidad de respuesta a asignaciones de entregas que permite a usuarios con rol DELIVERY aceptar o rechazar pedidos asignados. Se agregó un endpoint POST, su correspondiente validación, servicio y tests. Se modificó updateOrderStatusService para crear automáticamente asignaciones de delivery al pasar pedidos a estado PROCESSING.

Changes

Cohort / File(s) Summary
Endpoint y validación de respuesta a asignaciones
src/modules/delivery/delivery-assignments/delivery-assignments.controller.js, src/modules/delivery/delivery-assignments/delivery-assignments.validation.js
Se agregó controlador respondToAssignment con validación de esquema Zod que requiere action como "ACCEPT" o "REJECT", con manejo de errores 400/403/404.
Rutas de delivery
src/modules/delivery/delivery-assignments/delivery-assignments.routes.js
Se agregó ruta POST /orders/:orderId/delivery-response protegida con autenticación JWT y rol DELIVERY que delega al controlador respondToAssignment.
Lógica de asignaciones de delivery
src/modules/delivery/delivery-assignments/delivery-assignments.service.js
Se implementó respondToAssignmentService con lógica de aceptación (actualiza a ACCEPTED y ordena a SHIPPED) y rechazo (actualiza a REJECTED, busca siguiente delivery, crea nueva asignación PENDING o revierte orden a PENDING si no hay disponibles). Se mejoró createAssignmentService para soportar búsqueda automática de delivery.
Lógica de órdenes
src/modules/users/orders/order.service.js
Se modificó updateOrderStatusService para encapsular actualizaciones en transacción Prisma y crear automáticamente asignación de delivery cuando ordenes transicionan a PROCESSING. Se ajustaron condicionales en createOrderService y getPendingDeliveryReviewsService.
Cobertura de tests
tests/unit/delivery/delivery-assignments.test.js, tests/unit/order/order.test.js
Se agregó suite completa de tests unitarios para createAssignmentService y respondToAssignmentService cubriendo casos de error y éxito. Se refactorizaron tests de updateOrderStatusService para mockear transacciones Prisma y agregar cobertura de asignación automática de delivery.

Sequence Diagram(s)

sequenceDiagram
    actor DeliveryUser as Delivery User
    participant Controller
    participant Service as respondToAssignmentService
    participant Database as Prisma
    
    DeliveryUser->>Controller: POST /orders/:orderId/delivery-response<br/>{action: "ACCEPT" | "REJECT"}
    activate Controller
    Controller->>Controller: Validar payload con schema
    alt Validación fallida
        Controller-->>DeliveryUser: 400 Bad Request
    else Validación exitosa
        Controller->>Service: respondToAssignmentService(orderId, userId, action)
        activate Service
        Service->>Database: Buscar asignación PENDING<br/>para el orden y usuario
        alt No existe asignación
            Service-->>Controller: 404 Not Found
        else Asignación existe pero usuario no coincide
            Service-->>Controller: 403 Forbidden
        else Usuario autorizado
            alt action === "ACCEPT"
                Service->>Database: Actualizar asignación a ACCEPTED
                Service->>Database: Actualizar orden a SHIPPED
                Service-->>Controller: 200 OK
            else action === "REJECT"
                Service->>Database: Actualizar asignación a REJECTED
                Service->>Database: Buscar siguiente delivery activo<br/>sin asignación PENDING
                alt Existe siguiente delivery
                    Service->>Database: Crear nueva asignación PENDING<br/>con siguiente delivery
                    Service-->>Controller: 200 OK
                else No hay deliveries disponibles
                    Service->>Database: Revertir orden a PENDING
                    Service-->>Controller: 404 Not Found
                end
            end
        end
        deactivate Service
        Controller-->>DeliveryUser: Response
    end
    deactivate Controller
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutos

Possibly related PRs

Suggested reviewers

  • Benjakr04
  • Andoumeda

🐰 ¡Qué alegría, nuevas asignaciones llegan!
Los deliveries pueden aceptar o rechazar sin temor,
Las órdenes fluyen en transacciones sin igual,
PENDING a ACCEPTED, el flujo es sensacional,
¡Orejas arriba, el código brilla! 🥕✨

🚥 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 describe con precisión los cambios principales: implementar funcionalidad de asignación de entregas y refactorizar actualizaciones de órdenes, coincidiendo con los cambios en controladores, rutas, servicios y validaciones.
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-328-Delivey-accept-and-reject-orders

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
Review rate limit: 0/1 reviews remaining, refill in 38 minutes and 39 seconds.

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: 3

🧹 Nitpick comments (2)
src/modules/delivery/delivery-assignments/delivery-assignments.routes.js (1)

41-42: 💤 Low value

Considerar agregar comentario descriptivo.

Las otras rutas tienen comentarios descriptivos en español (ej. "// Marcar asignación de delivery como completado"). Para mantener la consistencia, sería bueno agregar uno similar para esta nueva ruta.

📝 Sugerencia
+// Responder a asignación de delivery (aceptar o rechazar)
 router.post("/orders/:orderId/delivery-response", authenticate, requireRole(ROLES.DELIVERY), respondToAssignment);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/modules/delivery/delivery-assignments/delivery-assignments.routes.js`
around lines 41 - 42, Agregar un comentario descriptivo en español encima de la
ruta POST definida por router.post("/orders/:orderId/delivery-response",
authenticate, requireRole(ROLES.DELIVERY), respondToAssignment); que siga el
estilo de las demás rutas (por ejemplo "// Responder a la asignación de
delivery" o similar) para mantener consistencia; ubica el comentario justo antes
de la línea que contiene router.post y referencia la ruta y el handler
respondToAssignment al escribir el texto.
src/modules/users/orders/order.service.js (1)

909-940: ⚖️ Poor tradeoff

Duplicación de lógica con createAssignmentService.

La lógica de selección automática de delivery (líneas 910-939) duplica código de createAssignmentService en delivery-assignments.service.js. Ambos buscan un delivery ACTIVE sin asignaciones PENDING y crean una asignación con sequence incrementado.

Considerar extraer esta lógica a una función compartida para evitar drift y facilitar mantenimiento.

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

In `@src/modules/users/orders/order.service.js` around lines 909 - 940, El bloque
en order.service.js que busca un delivery ACTIVE sin asignaciones PENDING y crea
una deliveryAssignment duplica la lógica de createAssignmentService en
delivery-assignments.service.js; refactoriza extrayendo esa lógica a una función
compartida (por ejemplo exportar assignDeliveryToOrder/
createAssignmentForOrder) que acepte el transaction client (tx), fk_store,
resolvedOrderId (o fk_order) y lance ValidationError si no hay delivery; la
función debe realizar la misma consulta a tx.deliveries (delivery_status:
"ACTIVE", status: true, delivery_assignments: { none: { assignment_status:
"PENDING" } }), calcular assignment_sequence usando
tx.deliveryAssignments.findFirst y crear la entrada con assignment_status
"PENDING" y status true, y devolver la assignment creada; luego reemplaza el
bloque en order.service.js para llamar a esa función y reutiliza
createAssignmentService donde corresponda.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/modules/delivery/delivery-assignments/delivery-assignments.service.js`:
- Around line 14-40: The validation schema createAssignmentSchema currently
requires fk_delivery, preventing the service's auto-selection branch from ever
running; change the fk_delivery field in the schema from
z.number().int().positive("Delivery ID requerido") to an optional variant (e.g.,
z.number().int().positive("Delivery ID requerido").optional()) so the controller
can omit fk_delivery and allow delivery-assignments.service.js logic (the
fk_delivery_input handling and auto-selection using prisma.deliveries) to
execute; ensure any downstream code that expects fk_delivery handles undefined
accordingly.

In `@src/modules/users/orders/order.service.js`:
- Around line 878-943: The state-transition validation is done before the
transaction, allowing two concurrent requests to both pass and create duplicate
assignments; fix by performing the status-check and update atomically inside the
transaction (use tx.orders.update with a conditional where that includes
order_status: "PENDING" so the update fails if another request already changed
it) and, before creating a new assignment in the tx block, query
tx.deliveryAssignments.findFirst for { fk_order: resolvedOrderId,
assignment_status: "PENDING", status: true } and skip/throw if one exists
(mirror the logic in createAssignmentService). Ensure you replace the current
tx.orders.update and tx.deliveryAssignments.create flow to first do the
conditional update and then check existing PENDING assignment within the same tx
to avoid race conditions.

In `@tests/unit/order/order.test.js`:
- Around line 50-57: El mock actual cierra el objeto prisma demasiado pronto y
define deliveries y deliveryAssignments como propiedades externas; reubica las
propiedades deliveries (findFirst) y deliveryAssignments (findFirst, create)
dentro del objeto prisma en el mock para que queden como prisma.deliveries y
prisma.deliveryAssignments, ajustando la llave de cierre que actualmente termina
el objeto prisma para envolver esas entradas; busca el mock en order.test.js
donde se crea el objeto prisma y mueve/mergea las claves deliveries y
deliveryAssignments dentro de ese mismo objeto mock.

---

Nitpick comments:
In `@src/modules/delivery/delivery-assignments/delivery-assignments.routes.js`:
- Around line 41-42: Agregar un comentario descriptivo en español encima de la
ruta POST definida por router.post("/orders/:orderId/delivery-response",
authenticate, requireRole(ROLES.DELIVERY), respondToAssignment); que siga el
estilo de las demás rutas (por ejemplo "// Responder a la asignación de
delivery" o similar) para mantener consistencia; ubica el comentario justo antes
de la línea que contiene router.post y referencia la ruta y el handler
respondToAssignment al escribir el texto.

In `@src/modules/users/orders/order.service.js`:
- Around line 909-940: El bloque en order.service.js que busca un delivery
ACTIVE sin asignaciones PENDING y crea una deliveryAssignment duplica la lógica
de createAssignmentService en delivery-assignments.service.js; refactoriza
extrayendo esa lógica a una función compartida (por ejemplo exportar
assignDeliveryToOrder/ createAssignmentForOrder) que acepte el transaction
client (tx), fk_store, resolvedOrderId (o fk_order) y lance ValidationError si
no hay delivery; la función debe realizar la misma consulta a tx.deliveries
(delivery_status: "ACTIVE", status: true, delivery_assignments: { none: {
assignment_status: "PENDING" } }), calcular assignment_sequence usando
tx.deliveryAssignments.findFirst y crear la entrada con assignment_status
"PENDING" y status true, y devolver la assignment creada; luego reemplaza el
bloque en order.service.js para llamar a esa función y reutiliza
createAssignmentService donde corresponda.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 464204cf-8496-44ad-9d98-27ba6bd02e89

📥 Commits

Reviewing files that changed from the base of the PR and between 52e43b4 and a5b9c06.

📒 Files selected for processing (8)
  • src/modules/delivery/delivery-assignments/delivery-assignments.controller.js
  • src/modules/delivery/delivery-assignments/delivery-assignments.routes.js
  • src/modules/delivery/delivery-assignments/delivery-assignments.service.js
  • src/modules/delivery/delivery-assignments/delivery-assignments.validation.js
  • src/modules/users/orders/.gitkeep
  • src/modules/users/orders/order.service.js
  • tests/unit/delivery/delivery-assignments.test.js
  • tests/unit/order/order.test.js

Comment thread src/modules/users/orders/order.service.js
Comment thread tests/unit/order/order.test.js Outdated
CrisNAC and others added 2 commits April 30, 2026 22:05
…l and enhance order status update logic with atomic condition and conflict handling

Co-authored-by: Copilot <copilot@github.com>
@sonarqubecloud

sonarqubecloud Bot commented May 1, 2026

Copy link
Copy Markdown

Quality Gate Failed Quality Gate failed

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

See analysis details on SonarQube Cloud

@Lianyang1234 Lianyang1234 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

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

LGMT!

@Lianyang1234
Lianyang1234 merged commit 85637d0 into dev May 1, 2026
3 of 4 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