diff --git a/.changeset/old-zebras-destroy.md b/.changeset/old-zebras-destroy.md new file mode 100644 index 0000000000..4ce0073139 --- /dev/null +++ b/.changeset/old-zebras-destroy.md @@ -0,0 +1,5 @@ +--- +"@medusajs/core-flows": patch +--- + +fix(core-flows): lock draft order workflows diff --git a/packages/core/core-flows/src/draft-order/workflows/add-draft-order-items.ts b/packages/core/core-flows/src/draft-order/workflows/add-draft-order-items.ts index 592a01143f..aaa9e777a6 100644 --- a/packages/core/core-flows/src/draft-order/workflows/add-draft-order-items.ts +++ b/packages/core/core-flows/src/draft-order/workflows/add-draft-order-items.ts @@ -25,6 +25,7 @@ import { import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" export const addDraftOrderItemsWorkflowId = "add-draft-order-items" @@ -56,6 +57,12 @@ export const addDraftOrderItemsWorkflow = createWorkflow( function ( input: WorkflowData ) { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO & { promotions: { code: string }[] } = useRemoteQueryStep({ entry_point: "orders", @@ -142,6 +149,10 @@ export const addDraftOrderItemsWorkflow = createWorkflow( input: orderChangeActionInput, }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(input.order_id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/add-draft-order-promotions.ts b/packages/core/core-flows/src/draft-order/workflows/add-draft-order-promotions.ts index 63948dc44a..0b64ceec77 100644 --- a/packages/core/core-flows/src/draft-order/workflows/add-draft-order-promotions.ts +++ b/packages/core/core-flows/src/draft-order/workflows/add-draft-order-promotions.ts @@ -23,6 +23,7 @@ import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-chan import { validatePromoCodesToAddStep } from "../steps/validate-promo-codes-to-add" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" export const addDraftOrderPromotionWorkflowId = "add-draft-order-promotion" @@ -63,6 +64,12 @@ export interface AddDraftOrderPromotionWorkflowInput { export const addDraftOrderPromotionWorkflow = createWorkflow( addDraftOrderPromotionWorkflowId, function (input: WorkflowData) { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO = useRemoteQueryStep({ entry_point: "orders", fields: draftOrderFieldsForRefreshSteps, @@ -131,6 +138,10 @@ export const addDraftOrderPromotionWorkflow = createWorkflow( input: orderChangeActionInput, }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(input.order_id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/add-draft-order-shipping-methods.ts b/packages/core/core-flows/src/draft-order/workflows/add-draft-order-shipping-methods.ts index 0629c7592a..3963a84243 100644 --- a/packages/core/core-flows/src/draft-order/workflows/add-draft-order-shipping-methods.ts +++ b/packages/core/core-flows/src/draft-order/workflows/add-draft-order-shipping-methods.ts @@ -31,6 +31,7 @@ import { prepareShippingMethod } from "../../order/utils/prepare-shipping-method import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" const validateShippingOptionStep = createStep( "validate-shipping-option", @@ -99,6 +100,12 @@ export interface AddDraftOrderShippingMethodsWorkflowInput { export const addDraftOrderShippingMethodsWorkflow = createWorkflow( addDraftOrderShippingMethodsWorkflowId, function (input: WorkflowData) { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO & { promotions: { code: string @@ -232,6 +239,10 @@ export const addDraftOrderShippingMethodsWorkflow = createWorkflow( input: [orderChangeActionInput], }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(order.id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/begin-draft-order-edit.ts b/packages/core/core-flows/src/draft-order/workflows/begin-draft-order-edit.ts index cdd3561ca3..330e73d658 100644 --- a/packages/core/core-flows/src/draft-order/workflows/begin-draft-order-edit.ts +++ b/packages/core/core-flows/src/draft-order/workflows/begin-draft-order-edit.ts @@ -8,6 +8,7 @@ import type { OrderDTO, OrderWorkflow } from "@medusajs/framework/types" import { useRemoteQueryStep } from "../../common" import { createOrderChangeStep, previewOrderChangeStep } from "../../order" import { validateDraftOrderStep } from "../steps" +import { acquireLockStep, releaseLockStep } from "../../locking" export const beginDraftOrderEditWorkflowId = "begin-draft-order-edit" @@ -35,6 +36,12 @@ export const beginDraftOrderEditWorkflowId = "begin-draft-order-edit" export const beginDraftOrderEditWorkflow = createWorkflow( beginDraftOrderEditWorkflowId, function (input: WorkflowData) { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO = useRemoteQueryStep({ entry_point: "orders", fields: ["id", "status", "is_draft_order"], @@ -57,6 +64,10 @@ export const beginDraftOrderEditWorkflow = createWorkflow( createOrderChangeStep(orderChangeInput) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(input.order_id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/cancel-draft-order-edit.ts b/packages/core/core-flows/src/draft-order/workflows/cancel-draft-order-edit.ts index 27afbf02a1..bcae9f32d5 100644 --- a/packages/core/core-flows/src/draft-order/workflows/cancel-draft-order-edit.ts +++ b/packages/core/core-flows/src/draft-order/workflows/cancel-draft-order-edit.ts @@ -17,6 +17,7 @@ import { restoreDraftOrderShippingMethodsStep } from "../steps/restore-draft-ord import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" export const cancelDraftOrderEditWorkflowId = "cancel-draft-order-edit" @@ -52,6 +53,12 @@ export interface CancelDraftOrderEditWorkflowInput { export const cancelDraftOrderEditWorkflow = createWorkflow( cancelDraftOrderEditWorkflowId, function (input: WorkflowData) { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO & { promotions: { code: string @@ -166,5 +173,9 @@ export const cancelDraftOrderEditWorkflow = createWorkflow( shippingMethods: shippingToRestore as any, }) }) + + releaseLockStep({ + key: input.order_id, + }) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/confirm-draft-order-edit.ts b/packages/core/core-flows/src/draft-order/workflows/confirm-draft-order-edit.ts index aac042d318..749df1d975 100644 --- a/packages/core/core-flows/src/draft-order/workflows/confirm-draft-order-edit.ts +++ b/packages/core/core-flows/src/draft-order/workflows/confirm-draft-order-edit.ts @@ -1,31 +1,17 @@ -import { - ChangeActionType, - MathBN, - OrderChangeStatus, -} from "@medusajs/framework/utils" -import { - createWorkflow, - transform, - WorkflowResponse, -} from "@medusajs/framework/workflows-sdk" -import { - BigNumberInput, - OrderChangeDTO, - OrderDTO, -} from "@medusajs/framework/types" +import { ChangeActionType, MathBN, OrderChangeStatus, } from "@medusajs/framework/utils" +import { createWorkflow, transform, WorkflowResponse, } from "@medusajs/framework/workflows-sdk" +import { BigNumberInput, OrderChangeDTO, OrderDTO, } from "@medusajs/framework/types" import { reserveInventoryStep } from "../../cart" import { prepareConfirmInventoryInput, requiredOrderFieldsForInventoryConfirmation, } from "../../cart/utils/prepare-confirm-inventory-input" import { useRemoteQueryStep } from "../../common" -import { - createOrUpdateOrderPaymentCollectionWorkflow, - previewOrderChangeStep, -} from "../../order" +import { createOrUpdateOrderPaymentCollectionWorkflow, previewOrderChangeStep, } from "../../order" import { confirmOrderChanges } from "../../order/steps/confirm-order-changes" import { deleteReservationsByLineItemsStep } from "../../reservation" import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change" +import { acquireLockStep, releaseLockStep } from "../../locking" export const confirmDraftOrderEditWorkflowId = "confirm-draft-order-edit" @@ -63,6 +49,12 @@ export interface ConfirmDraftOrderEditWorkflowInput { export const confirmDraftOrderEditWorkflow = createWorkflow( confirmDraftOrderEditWorkflowId, function (input: ConfirmDraftOrderEditWorkflowInput) { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO = useRemoteQueryStep({ entry_point: "orders", fields: [ @@ -221,6 +213,10 @@ export const confirmDraftOrderEditWorkflow = createWorkflow( }, }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(orderPreview) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/convert-draft-order.ts b/packages/core/core-flows/src/draft-order/workflows/convert-draft-order.ts index b550c3d736..b8758d3828 100644 --- a/packages/core/core-flows/src/draft-order/workflows/convert-draft-order.ts +++ b/packages/core/core-flows/src/draft-order/workflows/convert-draft-order.ts @@ -6,6 +6,7 @@ import { import { createStep, createWorkflow, + parallelize, StepResponse, WorkflowData, WorkflowResponse, @@ -13,6 +14,7 @@ import { import type { IOrderModuleService, OrderDTO } from "@medusajs/framework/types" import { emitEventStep, useRemoteQueryStep } from "../../common" import { validateDraftOrderStep } from "../steps/validate-draft-order" +import { acquireLockStep, releaseLockStep } from "../../locking" export const convertDraftOrderWorkflowId = "convert-draft-order" @@ -99,6 +101,12 @@ export const convertDraftOrderWorkflow = createWorkflow( function ( input: WorkflowData ): WorkflowResponse { + acquireLockStep({ + key: input.id, + timeout: 2, + ttl: 10, + }) + const order = useRemoteQueryStep({ entry_point: "orders", fields: ["id", "status", "is_draft_order"], @@ -113,10 +121,15 @@ export const convertDraftOrderWorkflow = createWorkflow( const updatedOrder = convertDraftOrderStep({ id: input.id }) - emitEventStep({ - eventName: OrderWorkflowEvents.PLACED, - data: { id: updatedOrder.id }, - }) + parallelize( + releaseLockStep({ + key: input.id, + }), + emitEventStep({ + eventName: OrderWorkflowEvents.PLACED, + data: { id: updatedOrder.id }, + }) + ) return new WorkflowResponse(updatedOrder) } diff --git a/packages/core/core-flows/src/draft-order/workflows/delete-draft-order.ts b/packages/core/core-flows/src/draft-order/workflows/delete-draft-order.ts index 32a0d8e845..801ea8088a 100644 --- a/packages/core/core-flows/src/draft-order/workflows/delete-draft-order.ts +++ b/packages/core/core-flows/src/draft-order/workflows/delete-draft-order.ts @@ -1,9 +1,9 @@ import { - WorkflowData, - WorkflowResponse, createStep, createWorkflow, transform, + WorkflowData, + WorkflowResponse, } from "@medusajs/framework/workflows-sdk" import type { OrderDTO } from "@medusajs/framework/types" import { Modules } from "@medusajs/framework/utils" diff --git a/packages/core/core-flows/src/draft-order/workflows/refresh-draft-order-adjustments.ts b/packages/core/core-flows/src/draft-order/workflows/refresh-draft-order-adjustments.ts index f3be54d55e..231372470b 100644 --- a/packages/core/core-flows/src/draft-order/workflows/refresh-draft-order-adjustments.ts +++ b/packages/core/core-flows/src/draft-order/workflows/refresh-draft-order-adjustments.ts @@ -16,6 +16,7 @@ import { createDraftOrderShippingMethodAdjustmentsStep } from "../steps/create-d import { removeDraftOrderLineItemAdjustmentsStep } from "../steps/remove-draft-order-line-item-adjustments" import { removeDraftOrderShippingMethodAdjustmentsStep } from "../steps/remove-draft-order-shipping-method-adjustments" import { updateDraftOrderPromotionsStep } from "../steps/update-draft-order-promotions" +import { acquireLockStep, releaseLockStep } from "../../locking" export const refreshDraftOrderAdjustmentsWorkflowId = "refresh-draft-order-adjustments" @@ -78,6 +79,12 @@ export interface RefreshDraftOrderAdjustmentsWorkflowInput { export const refreshDraftOrderAdjustmentsWorkflow = createWorkflow( refreshDraftOrderAdjustmentsWorkflowId, function (input: WorkflowData) { + acquireLockStep({ + key: input.order.id, + timeout: 2, + ttl: 10, + }) + const promotionCodesToApply = getPromotionCodesToApply({ cart: input.order, promo_codes: input.promo_codes, @@ -118,6 +125,10 @@ export const refreshDraftOrderAdjustmentsWorkflow = createWorkflow( }) ) + releaseLockStep({ + key: input.order.id, + }) + return new WorkflowResponse(void 0) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-action-item.ts b/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-action-item.ts index 0307b12540..edec987f43 100644 --- a/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-action-item.ts +++ b/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-action-item.ts @@ -21,6 +21,7 @@ import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-chan import { validateDraftOrderRemoveActionItemStep } from "../steps/validate-draft-order-remove-action-item" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" export const removeDraftOrderActionItemWorkflowId = "remove-draft-order-action-item" @@ -50,6 +51,12 @@ export const removeDraftOrderActionItemWorkflow = createWorkflow( function ( input: WorkflowData ): WorkflowResponse { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO & { promotions: { code: string @@ -111,6 +118,10 @@ export const removeDraftOrderActionItemWorkflow = createWorkflow( }) }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(input.order_id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-action-shipping-method.ts b/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-action-shipping-method.ts index a7b5fe9e20..4992bac85f 100644 --- a/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-action-shipping-method.ts +++ b/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-action-shipping-method.ts @@ -25,6 +25,7 @@ import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-chan import { validateDraftOrderShippingMethodActionStep } from "../steps/validate-draft-order-shipping-method-action" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" export const removeDraftOrderActionShippingMethodWorkflowId = "remove-draft-order-action-shipping-method" @@ -54,6 +55,12 @@ export const removeDraftOrderActionShippingMethodWorkflow = createWorkflow( function ( input: WorkflowData ): WorkflowResponse { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO = useRemoteQueryStep({ entry_point: "orders", fields: draftOrderFieldsForRefreshSteps, @@ -119,6 +126,10 @@ export const removeDraftOrderActionShippingMethodWorkflow = createWorkflow( }) }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(input.order_id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-promotions.ts b/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-promotions.ts index 6580aeb639..1cbfde0c1e 100644 --- a/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-promotions.ts +++ b/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-promotions.ts @@ -23,6 +23,7 @@ import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-chan import { validatePromoCodesToRemoveStep } from "../steps/validate-promo-codes-to-remove" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" export const removeDraftOrderPromotionsWorkflowId = "remove-draft-order-promotions" @@ -64,6 +65,12 @@ export interface RemoveDraftOrderPromotionsWorkflowInput { export const removeDraftOrderPromotionsWorkflow = createWorkflow( removeDraftOrderPromotionsWorkflowId, function (input: WorkflowData) { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO = useRemoteQueryStep({ entry_point: "orders", fields: draftOrderFieldsForRefreshSteps, @@ -132,6 +139,10 @@ export const removeDraftOrderPromotionsWorkflow = createWorkflow( input: orderChangeActionInput, }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(input.order_id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-shipping-method.ts b/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-shipping-method.ts index 14a40fe67b..90f2dcb185 100644 --- a/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-shipping-method.ts +++ b/packages/core/core-flows/src/draft-order/workflows/remove-draft-order-shipping-method.ts @@ -19,6 +19,7 @@ import { import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" export const removeDraftOrderShippingMethodWorkflowId = "remove-draft-order-shipping-method" @@ -60,6 +61,12 @@ export interface RemoveDraftOrderShippingMethodWorkflowInput { export const removeDraftOrderShippingMethodWorkflow = createWorkflow( removeDraftOrderShippingMethodWorkflowId, function (input: WorkflowData) { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO & { promotions: { code: string @@ -136,6 +143,10 @@ export const removeDraftOrderShippingMethodWorkflow = createWorkflow( input: orderChangeActionInput, }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(order.id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/request-draft-order-edit.ts b/packages/core/core-flows/src/draft-order/workflows/request-draft-order-edit.ts index f3f183f5e2..a225ba1e37 100644 --- a/packages/core/core-flows/src/draft-order/workflows/request-draft-order-edit.ts +++ b/packages/core/core-flows/src/draft-order/workflows/request-draft-order-edit.ts @@ -12,6 +12,7 @@ import { updateOrderChangesStep, } from "../../order" import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change" +import { acquireLockStep, releaseLockStep } from "../../locking" export const requestDraftOrderEditId = "request-draft-order-edit" @@ -71,6 +72,12 @@ export type RequestDraftOrderEditWorkflowInput = { export const requestDraftOrderEditWorkflow = createWorkflow( requestDraftOrderEditId, function (input: RequestDraftOrderEditWorkflowInput) { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO = useRemoteQueryStep({ entry_point: "orders", fields: ["id", "version", "status", "is_draft_order", "canceled_at"], @@ -105,6 +112,10 @@ export const requestDraftOrderEditWorkflow = createWorkflow( }, }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(order.id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/update-draft-order-action-item.ts b/packages/core/core-flows/src/draft-order/workflows/update-draft-order-action-item.ts index 06a2b2b748..14ffc8f319 100644 --- a/packages/core/core-flows/src/draft-order/workflows/update-draft-order-action-item.ts +++ b/packages/core/core-flows/src/draft-order/workflows/update-draft-order-action-item.ts @@ -22,6 +22,7 @@ import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-chan import { validateDraftOrderUpdateActionItemStep } from "../steps/validate-draft-order-update-action-item" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" export const updateDraftOrderActionItemId = "update-draft-order-action-item" @@ -53,6 +54,12 @@ export const updateDraftOrderActionItemWorkflow = createWorkflow( function ( input: WorkflowData ) { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO & { promotions: { code: string @@ -136,6 +143,10 @@ export const updateDraftOrderActionItemWorkflow = createWorkflow( }) }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(input.order_id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/update-draft-order-action-shipping-method.ts b/packages/core/core-flows/src/draft-order/workflows/update-draft-order-action-shipping-method.ts index 9417c8135e..7d9e52d4df 100644 --- a/packages/core/core-flows/src/draft-order/workflows/update-draft-order-action-shipping-method.ts +++ b/packages/core/core-flows/src/draft-order/workflows/update-draft-order-action-shipping-method.ts @@ -26,6 +26,7 @@ import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-chan import { validateDraftOrderShippingMethodActionStep } from "../steps/validate-draft-order-shipping-method-action" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" export const updateDraftOrderActionShippingMethodWorkflowId = "update-draft-order-action-shipping-method" @@ -58,6 +59,12 @@ export const updateDraftOrderActionShippingMethodWorkflow = createWorkflow( function ( input: WorkflowData ): WorkflowResponse { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO = useRemoteQueryStep({ entry_point: "orders", fields: draftOrderFieldsForRefreshSteps, @@ -161,6 +168,10 @@ export const updateDraftOrderActionShippingMethodWorkflow = createWorkflow( }) }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(input.order_id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/update-draft-order-item.ts b/packages/core/core-flows/src/draft-order/workflows/update-draft-order-item.ts index 464b33412b..711496ad57 100644 --- a/packages/core/core-flows/src/draft-order/workflows/update-draft-order-item.ts +++ b/packages/core/core-flows/src/draft-order/workflows/update-draft-order-item.ts @@ -27,6 +27,7 @@ import { getDraftOrderPromotionContextStep } from "../steps/get-draft-order-prom import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" export const updateDraftOrderItemWorkflowId = "update-draft-order-item" @@ -55,6 +56,12 @@ export const updateDraftOrderItemWorkflow = createWorkflow( function ( input: WorkflowData ): WorkflowResponse { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO = useRemoteQueryStep({ entry_point: "orders", fields: draftOrderFieldsForRefreshSteps, @@ -135,6 +142,10 @@ export const updateDraftOrderItemWorkflow = createWorkflow( }) }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(input.order_id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/update-draft-order-shipping-method.ts b/packages/core/core-flows/src/draft-order/workflows/update-draft-order-shipping-method.ts index 0e6b64a153..e3a0c91f22 100644 --- a/packages/core/core-flows/src/draft-order/workflows/update-draft-order-shipping-method.ts +++ b/packages/core/core-flows/src/draft-order/workflows/update-draft-order-shipping-method.ts @@ -25,6 +25,7 @@ import { updateDraftOrderShippingMethodStep } from "../steps/update-draft-order- import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change" import { draftOrderFieldsForRefreshSteps } from "../utils/fields" import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments" +import { acquireLockStep, releaseLockStep } from "../../locking" export const updateDraftOrderShippingMethodWorkflowId = "update-draft-order-shipping-method" @@ -83,6 +84,12 @@ export interface UpdateDraftOrderShippingMethodWorkflowInput { export const updateDraftOrderShippingMethodWorkflow = createWorkflow( updateDraftOrderShippingMethodWorkflowId, function (input: WorkflowData) { + acquireLockStep({ + key: input.order_id, + timeout: 2, + ttl: 10, + }) + const order: OrderDTO = useRemoteQueryStep({ entry_point: "orders", fields: ["id", "status", "is_draft_order"], @@ -171,6 +178,10 @@ export const updateDraftOrderShippingMethodWorkflow = createWorkflow( input: [orderChangeActionInput as any], }) + releaseLockStep({ + key: input.order_id, + }) + return new WorkflowResponse(previewOrderChangeStep(input.order_id)) } ) diff --git a/packages/core/core-flows/src/draft-order/workflows/update-draft-order.ts b/packages/core/core-flows/src/draft-order/workflows/update-draft-order.ts index 0fade3a2c8..8c879a9838 100644 --- a/packages/core/core-flows/src/draft-order/workflows/update-draft-order.ts +++ b/packages/core/core-flows/src/draft-order/workflows/update-draft-order.ts @@ -17,6 +17,7 @@ import { import { emitEventStep, useRemoteQueryStep } from "../../common" import { previewOrderChangeStep, registerOrderChangesStep } from "../../order" import { validateDraftOrderStep } from "../steps/validate-draft-order" +import { acquireLockStep, releaseLockStep } from "../../locking" export const updateDraftOrderWorkflowId = "update-draft-order" @@ -149,6 +150,12 @@ export const updateDraftOrderStep = createStep( export const updateDraftOrderWorkflow = createWorkflow( updateDraftOrderWorkflowId, function (input: WorkflowData) { + acquireLockStep({ + key: input.id, + timeout: 2, + ttl: 10, + }) + const order = useRemoteQueryStep({ entry_point: "orders", fields: [ @@ -312,6 +319,10 @@ export const updateDraftOrderWorkflow = createWorkflow( const preview = previewOrderChangeStep(input.id) + releaseLockStep({ + key: input.id, + }) + return new WorkflowResponse(preview) } ) diff --git a/packages/core/core-flows/src/locking/steps/acquire-lock.ts b/packages/core/core-flows/src/locking/steps/acquire-lock.ts index 33d050cc89..a64cd676c7 100644 --- a/packages/core/core-flows/src/locking/steps/acquire-lock.ts +++ b/packages/core/core-flows/src/locking/steps/acquire-lock.ts @@ -11,7 +11,7 @@ export interface AcquireLockStepInput { */ key: string | string[] /** - * The maximum time to wait for acquiring the lock. If the lock cannot be acquired within this time, an error is thrown. + * The maximum time (in seconds) to wait for acquiring the lock. If the lock cannot be acquired within this time, an error is thrown. * * @defaultValue 0 */