From 0e73d8d5e3d04d62d444d17138f9cf61b7a236a2 Mon Sep 17 00:00:00 2001 From: Nicolas Gorga <62995075+NicolasGorga@users.noreply.github.com> Date: Tue, 25 Nov 2025 06:56:10 -0300 Subject: [PATCH] fix(core-flows): lock mark as delivered fulfillment/order flows (#14111) * Lock markFulfillmentAsDeliveredWorkflow with fulifllment id * Lock markOrderFulfillmentAsDeliveredWorkflow by orderId before calling markFulfillmentAsDeliveredWorkflow * Add changeset --- .changeset/new-owls-heal.md | 5 +++++ .../workflows/mark-fulfillment-as-delivered.ts | 18 +++++++++++++++--- .../mark-order-fulfillment-as-delivered.ts | 11 +++++++++++ 3 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 .changeset/new-owls-heal.md diff --git a/.changeset/new-owls-heal.md b/.changeset/new-owls-heal.md new file mode 100644 index 0000000000..86132e220e --- /dev/null +++ b/.changeset/new-owls-heal.md @@ -0,0 +1,5 @@ +--- +"@medusajs/core-flows": patch +--- + +fix(core-flows): lock mark as delivered fulfillment/order flows diff --git a/packages/core/core-flows/src/fulfillment/workflows/mark-fulfillment-as-delivered.ts b/packages/core/core-flows/src/fulfillment/workflows/mark-fulfillment-as-delivered.ts index 66170380d7..eea9df7b6f 100644 --- a/packages/core/core-flows/src/fulfillment/workflows/mark-fulfillment-as-delivered.ts +++ b/packages/core/core-flows/src/fulfillment/workflows/mark-fulfillment-as-delivered.ts @@ -10,6 +10,7 @@ import { } from "@medusajs/framework/workflows-sdk" import { useRemoteQueryStep } from "../../common" import { updateFulfillmentWorkflow } from "./update-fulfillment" +import { acquireLockStep, releaseLockStep } from "../../locking" export const validateFulfillmentDeliverabilityStepId = "validate-fulfillment-deliverability" @@ -84,6 +85,12 @@ export const markFulfillmentAsDeliveredWorkflowId = export const markFulfillmentAsDeliveredWorkflow = createWorkflow( markFulfillmentAsDeliveredWorkflowId, ({ id }: WorkflowData) => { + acquireLockStep({ + key: id, + timeout: 2, + ttl: 10, + }) + const fulfillment = useRemoteQueryStep({ entry_point: "fulfillment", fields: ["id", "delivered_at", "canceled_at"], @@ -99,8 +106,13 @@ export const markFulfillmentAsDeliveredWorkflow = createWorkflow( delivered_at: new Date(), })) - return new WorkflowResponse( - updateFulfillmentWorkflow.runAsStep({ input: updateInput }) - ) + const updatedFulfillment = updateFulfillmentWorkflow.runAsStep({ + input: updateInput, + }) + + releaseLockStep({ + key: id, + }) + return new WorkflowResponse(updatedFulfillment) } ) diff --git a/packages/core/core-flows/src/order/workflows/mark-order-fulfillment-as-delivered.ts b/packages/core/core-flows/src/order/workflows/mark-order-fulfillment-as-delivered.ts index 83d3d477b1..217aa3f182 100644 --- a/packages/core/core-flows/src/order/workflows/mark-order-fulfillment-as-delivered.ts +++ b/packages/core/core-flows/src/order/workflows/mark-order-fulfillment-as-delivered.ts @@ -27,6 +27,7 @@ import { throwIfItemsDoesNotExistsInOrder, throwIfOrderIsCancelled, } from "../utils/order-validation" +import { acquireLockStep, releaseLockStep } from "../../locking" type OrderItemWithVariantDTO = OrderLineItemDTO & { variant?: ProductVariantDTO & { @@ -258,10 +259,20 @@ export const markOrderFulfillmentAsDeliveredWorkflow = createWorkflow( prepareRegisterDeliveryData ) + acquireLockStep({ + key: orderId, + timeout: 2, + ttl: 10, + }) + const deliveredFulfillment = markFulfillmentAsDeliveredWorkflow.runAsStep({ input: { id: fulfillment.id }, }) + releaseLockStep({ + key: orderId, + }) + registerOrderDeliveryStep(deliveryData) emitEventStep({