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
This commit is contained in:
Nicolas Gorga
2025-11-25 06:56:10 -03:00
committed by GitHub
parent 78842af1c3
commit 0e73d8d5e3
3 changed files with 31 additions and 3 deletions

View File

@@ -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<MarkFulfillmentAsDeliveredInput>) => {
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)
}
)

View File

@@ -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({