Skip to content

Commit 8acfb88

Browse files
authored
fix(core-flows): lock draft order workflows (#13668)
I added a lock in all workflows of the draft order. I don't think there are drawbacks and it will make sure we don't run into concurrency issues in with draft orders. I don't see why we would not add this in the order workflows, let me know and I can add it too. I also didn't see any workflow that is long enough to justify adding a timeout of more than 2 seconds, but let me know if you think otherwise, we can discuss adjustments :) CLOSES-1228
1 parent 2d43a49 commit 8acfb88

21 files changed

Lines changed: 216 additions & 26 deletions

.changeset/old-zebras-destroy.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@medusajs/core-flows": patch
3+
---
4+
5+
fix(core-flows): lock draft order workflows

packages/core/core-flows/src/draft-order/workflows/add-draft-order-items.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import {
2525
import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change"
2626
import { draftOrderFieldsForRefreshSteps } from "../utils/fields"
2727
import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments"
28+
import { acquireLockStep, releaseLockStep } from "../../locking"
2829

2930
export const addDraftOrderItemsWorkflowId = "add-draft-order-items"
3031

@@ -56,6 +57,12 @@ export const addDraftOrderItemsWorkflow = createWorkflow(
5657
function (
5758
input: WorkflowData<OrderWorkflow.OrderEditAddNewItemWorkflowInput>
5859
) {
60+
acquireLockStep({
61+
key: input.order_id,
62+
timeout: 2,
63+
ttl: 10,
64+
})
65+
5966
const order: OrderDTO & { promotions: { code: string }[] } =
6067
useRemoteQueryStep({
6168
entry_point: "orders",
@@ -142,6 +149,10 @@ export const addDraftOrderItemsWorkflow = createWorkflow(
142149
input: orderChangeActionInput,
143150
})
144151

152+
releaseLockStep({
153+
key: input.order_id,
154+
})
155+
145156
return new WorkflowResponse(previewOrderChangeStep(input.order_id))
146157
}
147158
)

packages/core/core-flows/src/draft-order/workflows/add-draft-order-promotions.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-chan
2323
import { validatePromoCodesToAddStep } from "../steps/validate-promo-codes-to-add"
2424
import { draftOrderFieldsForRefreshSteps } from "../utils/fields"
2525
import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments"
26+
import { acquireLockStep, releaseLockStep } from "../../locking"
2627

2728
export const addDraftOrderPromotionWorkflowId = "add-draft-order-promotion"
2829

@@ -63,6 +64,12 @@ export interface AddDraftOrderPromotionWorkflowInput {
6364
export const addDraftOrderPromotionWorkflow = createWorkflow(
6465
addDraftOrderPromotionWorkflowId,
6566
function (input: WorkflowData<AddDraftOrderPromotionWorkflowInput>) {
67+
acquireLockStep({
68+
key: input.order_id,
69+
timeout: 2,
70+
ttl: 10,
71+
})
72+
6673
const order: OrderDTO = useRemoteQueryStep({
6774
entry_point: "orders",
6875
fields: draftOrderFieldsForRefreshSteps,
@@ -131,6 +138,10 @@ export const addDraftOrderPromotionWorkflow = createWorkflow(
131138
input: orderChangeActionInput,
132139
})
133140

141+
releaseLockStep({
142+
key: input.order_id,
143+
})
144+
134145
return new WorkflowResponse(previewOrderChangeStep(input.order_id))
135146
}
136147
)

packages/core/core-flows/src/draft-order/workflows/add-draft-order-shipping-methods.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import { prepareShippingMethod } from "../../order/utils/prepare-shipping-method
3131
import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change"
3232
import { draftOrderFieldsForRefreshSteps } from "../utils/fields"
3333
import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments"
34+
import { acquireLockStep, releaseLockStep } from "../../locking"
3435

3536
const validateShippingOptionStep = createStep(
3637
"validate-shipping-option",
@@ -99,6 +100,12 @@ export interface AddDraftOrderShippingMethodsWorkflowInput {
99100
export const addDraftOrderShippingMethodsWorkflow = createWorkflow(
100101
addDraftOrderShippingMethodsWorkflowId,
101102
function (input: WorkflowData<AddDraftOrderShippingMethodsWorkflowInput>) {
103+
acquireLockStep({
104+
key: input.order_id,
105+
timeout: 2,
106+
ttl: 10,
107+
})
108+
102109
const order: OrderDTO & {
103110
promotions: {
104111
code: string
@@ -232,6 +239,10 @@ export const addDraftOrderShippingMethodsWorkflow = createWorkflow(
232239
input: [orderChangeActionInput],
233240
})
234241

242+
releaseLockStep({
243+
key: input.order_id,
244+
})
245+
235246
return new WorkflowResponse(previewOrderChangeStep(order.id))
236247
}
237248
)

packages/core/core-flows/src/draft-order/workflows/begin-draft-order-edit.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type { OrderDTO, OrderWorkflow } from "@medusajs/framework/types"
88
import { useRemoteQueryStep } from "../../common"
99
import { createOrderChangeStep, previewOrderChangeStep } from "../../order"
1010
import { validateDraftOrderStep } from "../steps"
11+
import { acquireLockStep, releaseLockStep } from "../../locking"
1112

1213
export const beginDraftOrderEditWorkflowId = "begin-draft-order-edit"
1314

@@ -35,6 +36,12 @@ export const beginDraftOrderEditWorkflowId = "begin-draft-order-edit"
3536
export const beginDraftOrderEditWorkflow = createWorkflow(
3637
beginDraftOrderEditWorkflowId,
3738
function (input: WorkflowData<OrderWorkflow.BeginorderEditWorkflowInput>) {
39+
acquireLockStep({
40+
key: input.order_id,
41+
timeout: 2,
42+
ttl: 10,
43+
})
44+
3845
const order: OrderDTO = useRemoteQueryStep({
3946
entry_point: "orders",
4047
fields: ["id", "status", "is_draft_order"],
@@ -57,6 +64,10 @@ export const beginDraftOrderEditWorkflow = createWorkflow(
5764

5865
createOrderChangeStep(orderChangeInput)
5966

67+
releaseLockStep({
68+
key: input.order_id,
69+
})
70+
6071
return new WorkflowResponse(previewOrderChangeStep(input.order_id))
6172
}
6273
)

packages/core/core-flows/src/draft-order/workflows/cancel-draft-order-edit.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import { restoreDraftOrderShippingMethodsStep } from "../steps/restore-draft-ord
1717
import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change"
1818
import { draftOrderFieldsForRefreshSteps } from "../utils/fields"
1919
import { refreshDraftOrderAdjustmentsWorkflow } from "./refresh-draft-order-adjustments"
20+
import { acquireLockStep, releaseLockStep } from "../../locking"
2021

2122
export const cancelDraftOrderEditWorkflowId = "cancel-draft-order-edit"
2223

@@ -52,6 +53,12 @@ export interface CancelDraftOrderEditWorkflowInput {
5253
export const cancelDraftOrderEditWorkflow = createWorkflow(
5354
cancelDraftOrderEditWorkflowId,
5455
function (input: WorkflowData<CancelDraftOrderEditWorkflowInput>) {
56+
acquireLockStep({
57+
key: input.order_id,
58+
timeout: 2,
59+
ttl: 10,
60+
})
61+
5562
const order: OrderDTO & {
5663
promotions: {
5764
code: string
@@ -166,5 +173,9 @@ export const cancelDraftOrderEditWorkflow = createWorkflow(
166173
shippingMethods: shippingToRestore as any,
167174
})
168175
})
176+
177+
releaseLockStep({
178+
key: input.order_id,
179+
})
169180
}
170181
)

packages/core/core-flows/src/draft-order/workflows/confirm-draft-order-edit.ts

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,17 @@
1-
import {
2-
ChangeActionType,
3-
MathBN,
4-
OrderChangeStatus,
5-
} from "@medusajs/framework/utils"
6-
import {
7-
createWorkflow,
8-
transform,
9-
WorkflowResponse,
10-
} from "@medusajs/framework/workflows-sdk"
11-
import {
12-
BigNumberInput,
13-
OrderChangeDTO,
14-
OrderDTO,
15-
} from "@medusajs/framework/types"
1+
import { ChangeActionType, MathBN, OrderChangeStatus, } from "@medusajs/framework/utils"
2+
import { createWorkflow, transform, WorkflowResponse, } from "@medusajs/framework/workflows-sdk"
3+
import { BigNumberInput, OrderChangeDTO, OrderDTO, } from "@medusajs/framework/types"
164
import { reserveInventoryStep } from "../../cart"
175
import {
186
prepareConfirmInventoryInput,
197
requiredOrderFieldsForInventoryConfirmation,
208
} from "../../cart/utils/prepare-confirm-inventory-input"
219
import { useRemoteQueryStep } from "../../common"
22-
import {
23-
createOrUpdateOrderPaymentCollectionWorkflow,
24-
previewOrderChangeStep,
25-
} from "../../order"
10+
import { createOrUpdateOrderPaymentCollectionWorkflow, previewOrderChangeStep, } from "../../order"
2611
import { confirmOrderChanges } from "../../order/steps/confirm-order-changes"
2712
import { deleteReservationsByLineItemsStep } from "../../reservation"
2813
import { validateDraftOrderChangeStep } from "../steps/validate-draft-order-change"
14+
import { acquireLockStep, releaseLockStep } from "../../locking"
2915

3016
export const confirmDraftOrderEditWorkflowId = "confirm-draft-order-edit"
3117

@@ -63,6 +49,12 @@ export interface ConfirmDraftOrderEditWorkflowInput {
6349
export const confirmDraftOrderEditWorkflow = createWorkflow(
6450
confirmDraftOrderEditWorkflowId,
6551
function (input: ConfirmDraftOrderEditWorkflowInput) {
52+
acquireLockStep({
53+
key: input.order_id,
54+
timeout: 2,
55+
ttl: 10,
56+
})
57+
6658
const order: OrderDTO = useRemoteQueryStep({
6759
entry_point: "orders",
6860
fields: [
@@ -221,6 +213,10 @@ export const confirmDraftOrderEditWorkflow = createWorkflow(
221213
},
222214
})
223215

216+
releaseLockStep({
217+
key: input.order_id,
218+
})
219+
224220
return new WorkflowResponse(orderPreview)
225221
}
226222
)

packages/core/core-flows/src/draft-order/workflows/convert-draft-order.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ import {
66
import {
77
createStep,
88
createWorkflow,
9+
parallelize,
910
StepResponse,
1011
WorkflowData,
1112
WorkflowResponse,
1213
} from "@medusajs/framework/workflows-sdk"
1314
import type { IOrderModuleService, OrderDTO } from "@medusajs/framework/types"
1415
import { emitEventStep, useRemoteQueryStep } from "../../common"
1516
import { validateDraftOrderStep } from "../steps/validate-draft-order"
17+
import { acquireLockStep, releaseLockStep } from "../../locking"
1618

1719
export const convertDraftOrderWorkflowId = "convert-draft-order"
1820

@@ -99,6 +101,12 @@ export const convertDraftOrderWorkflow = createWorkflow(
99101
function (
100102
input: WorkflowData<ConvertDraftOrderWorkflowInput>
101103
): WorkflowResponse<OrderDTO> {
104+
acquireLockStep({
105+
key: input.id,
106+
timeout: 2,
107+
ttl: 10,
108+
})
109+
102110
const order = useRemoteQueryStep({
103111
entry_point: "orders",
104112
fields: ["id", "status", "is_draft_order"],
@@ -113,10 +121,15 @@ export const convertDraftOrderWorkflow = createWorkflow(
113121

114122
const updatedOrder = convertDraftOrderStep({ id: input.id })
115123

116-
emitEventStep({
117-
eventName: OrderWorkflowEvents.PLACED,
118-
data: { id: updatedOrder.id },
119-
})
124+
parallelize(
125+
releaseLockStep({
126+
key: input.id,
127+
}),
128+
emitEventStep({
129+
eventName: OrderWorkflowEvents.PLACED,
130+
data: { id: updatedOrder.id },
131+
})
132+
)
120133

121134
return new WorkflowResponse(updatedOrder)
122135
}

packages/core/core-flows/src/draft-order/workflows/delete-draft-order.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import {
2-
WorkflowData,
3-
WorkflowResponse,
42
createStep,
53
createWorkflow,
64
transform,
5+
WorkflowData,
6+
WorkflowResponse,
77
} from "@medusajs/framework/workflows-sdk"
88
import type { OrderDTO } from "@medusajs/framework/types"
99
import { Modules } from "@medusajs/framework/utils"

packages/core/core-flows/src/draft-order/workflows/refresh-draft-order-adjustments.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import { createDraftOrderShippingMethodAdjustmentsStep } from "../steps/create-d
1616
import { removeDraftOrderLineItemAdjustmentsStep } from "../steps/remove-draft-order-line-item-adjustments"
1717
import { removeDraftOrderShippingMethodAdjustmentsStep } from "../steps/remove-draft-order-shipping-method-adjustments"
1818
import { updateDraftOrderPromotionsStep } from "../steps/update-draft-order-promotions"
19+
import { acquireLockStep, releaseLockStep } from "../../locking"
1920

2021
export const refreshDraftOrderAdjustmentsWorkflowId =
2122
"refresh-draft-order-adjustments"
@@ -78,6 +79,12 @@ export interface RefreshDraftOrderAdjustmentsWorkflowInput {
7879
export const refreshDraftOrderAdjustmentsWorkflow = createWorkflow(
7980
refreshDraftOrderAdjustmentsWorkflowId,
8081
function (input: WorkflowData<RefreshDraftOrderAdjustmentsWorkflowInput>) {
82+
acquireLockStep({
83+
key: input.order.id,
84+
timeout: 2,
85+
ttl: 10,
86+
})
87+
8188
const promotionCodesToApply = getPromotionCodesToApply({
8289
cart: input.order,
8390
promo_codes: input.promo_codes,
@@ -118,6 +125,10 @@ export const refreshDraftOrderAdjustmentsWorkflow = createWorkflow(
118125
})
119126
)
120127

128+
releaseLockStep({
129+
key: input.order.id,
130+
})
131+
121132
return new WorkflowResponse(void 0)
122133
}
123134
)

0 commit comments

Comments
 (0)