Skip to content

Commit bca145b

Browse files
authored
chore: Add locks to order edit flows (medusajs#14270)
1 parent 8bd1d22 commit bca145b

13 files changed

+186
-31
lines changed

.changeset/little-panthers-hide.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+
chore: Add locks to order edit flows

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
transform,
1212
} from "@medusajs/framework/workflows-sdk"
1313
import { useQueryGraphStep } from "../../../common"
14+
import { acquireLockStep, releaseLockStep } from "../../../locking"
1415
import { createOrderChangeStep } from "../../steps/create-order-change"
1516
import { throwIfOrderIsCancelled } from "../../utils/order-validation"
1617
import { fieldsToRefreshOrderEdit } from "./utils/fields"
@@ -79,6 +80,12 @@ export const beginOrderEditOrderWorkflow = createWorkflow(
7980
function (
8081
input: WorkflowData<OrderWorkflow.BeginorderEditWorkflowInput>
8182
): WorkflowResponse<OrderChangeDTO> {
83+
acquireLockStep({
84+
key: input.order_id,
85+
timeout: 2,
86+
ttl: 10,
87+
})
88+
8289
const orderResult = useQueryGraphStep({
8390
entity: "order",
8491
fields: fieldsToRefreshOrderEdit,
@@ -106,6 +113,10 @@ export const beginOrderEditOrderWorkflow = createWorkflow(
106113

107114
const orderChange = createOrderChangeStep(orderChangeInput)
108115

116+
releaseLockStep({
117+
key: input.order_id,
118+
})
119+
109120
return new WorkflowResponse(orderChange)
110121
}
111122
)

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
transform,
1313
} from "@medusajs/framework/workflows-sdk"
1414
import { emitEventStep, useQueryGraphStep } from "../../../common"
15+
import { acquireLockStep, releaseLockStep } from "../../../locking"
1516
import { deleteOrderChangesStep, deleteOrderShippingMethods } from "../../steps"
1617
import {
1718
throwIfIsCancelled,
@@ -102,6 +103,12 @@ export const cancelBeginOrderEditWorkflow = createWorkflow(
102103
function (
103104
input: WorkflowData<CancelBeginOrderEditWorkflowInput>
104105
): WorkflowData<void> {
106+
acquireLockStep({
107+
key: input.order_id,
108+
timeout: 2,
109+
ttl: 10,
110+
})
111+
105112
const orderResult = useQueryGraphStep({
106113
entity: "order",
107114
fields: fieldsToRefreshOrderEdit,
@@ -160,5 +167,9 @@ export const cancelBeginOrderEditWorkflow = createWorkflow(
160167
data: eventData,
161168
})
162169
)
170+
171+
releaseLockStep({
172+
key: input.order_id,
173+
})
163174
}
164175
)

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
requiredOrderFieldsForInventoryConfirmation,
2424
} from "../../../cart/utils/prepare-confirm-inventory-input"
2525
import { emitEventStep, useQueryGraphStep } from "../../../common"
26+
import { acquireLockStep, releaseLockStep } from "../../../locking"
2627
import { deleteReservationsByLineItemsStep } from "../../../reservation"
2728
import { previewOrderChangeStep } from "../../steps"
2829
import { confirmOrderChanges } from "../../steps/confirm-order-changes"
@@ -120,6 +121,12 @@ export const confirmOrderEditRequestWorkflow = createWorkflow(
120121
function (
121122
input: ConfirmOrderEditRequestWorkflowInput
122123
): WorkflowResponse<OrderPreviewDTO> {
124+
acquireLockStep({
125+
key: input.order_id,
126+
timeout: 2,
127+
ttl: 10,
128+
})
129+
123130
const orderResult = useQueryGraphStep({
124131
entity: "order",
125132
fields: fieldsToRefreshOrderEdit,
@@ -286,6 +293,10 @@ export const confirmOrderEditRequestWorkflow = createWorkflow(
286293
data: eventData,
287294
})
288295

296+
releaseLockStep({
297+
key: input.order_id,
298+
})
299+
289300
return new WorkflowResponse(orderPreview)
290301
}
291302
)

packages/core/core-flows/src/order/workflows/order-edit/create-order-edit-shipping-method.ts

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
} from "@medusajs/framework/workflows-sdk"
1616
import { pricingContextResult } from "../../../cart/utils/schemas"
1717
import { useRemoteQueryStep } from "../../../common"
18+
import { acquireLockStep, releaseLockStep } from "../../../locking"
1819
import { previewOrderChangeStep } from "../../steps"
1920
import { createOrderShippingMethods } from "../../steps/create-order-shipping-methods"
2021
import {
@@ -113,25 +114,25 @@ export const createOrderEditShippingMethodWorkflowId =
113114
* @summary
114115
*
115116
* Create a shipping method for an order edit.
116-
*
117+
*
117118
* @property hooks.setPricingContext - This hook is executed before the shipping method is created. You can consume this hook to return any custom context useful for the prices retrieval of the shipping method's option.
118-
*
119+
*
119120
* For example, assuming you have the following custom pricing rule:
120-
*
121+
*
121122
* ```json
122123
* {
123124
* "attribute": "location_id",
124125
* "operator": "eq",
125126
* "value": "sloc_123",
126127
* }
127128
* ```
128-
*
129+
*
129130
* You can consume the `setPricingContext` hook to add the `location_id` context to the prices calculation:
130-
*
131+
*
131132
* ```ts
132133
* import { createOrderEditShippingMethodWorkflow } from "@medusajs/medusa/core-flows";
133134
* import { StepResponse } from "@medusajs/workflows-sdk";
134-
*
135+
*
135136
* createOrderEditShippingMethodWorkflow.hooks.setPricingContext((
136137
* { order, shipping_option_id, additional_data }, { container }
137138
* ) => {
@@ -140,20 +141,26 @@ export const createOrderEditShippingMethodWorkflowId =
140141
* });
141142
* });
142143
* ```
143-
*
144+
*
144145
* The price of the shipping method's option will now be retrieved using the context you return.
145-
*
146+
*
146147
* :::note
147-
*
148+
*
148149
* Learn more about prices calculation context in the [Prices Calculation](https://docs.medusajs.com/resources/commerce-modules/pricing/price-calculation) documentation.
149-
*
150+
*
150151
* :::
151152
*/
152153
export const createOrderEditShippingMethodWorkflow = createWorkflow(
153154
createOrderEditShippingMethodWorkflowId,
154155
function (
155156
input: CreateOrderEditShippingMethodWorkflowInput & AdditionalData
156157
) {
158+
acquireLockStep({
159+
key: input.order_id,
160+
timeout: 2,
161+
ttl: 10,
162+
})
163+
157164
const order: OrderDTO = useRemoteQueryStep({
158165
entry_point: "orders",
159166
fields: ["id", "status", "currency_code", "canceled_at"],
@@ -274,11 +281,16 @@ export const createOrderEditShippingMethodWorkflow = createWorkflow(
274281
input: [orderChangeActionInput],
275282
})
276283

277-
return new WorkflowResponse(
278-
previewOrderChangeStep(order.id) as OrderPreviewDTO,
279-
{
280-
hooks: [setPricingContext] as const,
281-
}
282-
)
284+
const previewOrderChange = previewOrderChangeStep(
285+
order.id
286+
) as OrderPreviewDTO
287+
288+
releaseLockStep({
289+
key: input.order_id,
290+
})
291+
292+
return new WorkflowResponse(previewOrderChange, {
293+
hooks: [setPricingContext] as const,
294+
})
283295
}
284296
)

packages/core/core-flows/src/order/workflows/order-edit/order-edit-add-new-item.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,17 @@ import {
1313
WorkflowResponse,
1414
} from "@medusajs/framework/workflows-sdk"
1515
import { useQueryGraphStep } from "../../../common"
16+
import { acquireLockStep, releaseLockStep } from "../../../locking"
1617
import { previewOrderChangeStep } from "../../steps/preview-order-change"
1718
import {
1819
throwIfIsCancelled,
1920
throwIfOrderChangeIsNotActive,
2021
} from "../../utils/order-validation"
2122
import { addOrderLineItemsWorkflow } from "../add-line-items"
23+
import { computeAdjustmentsForPreviewWorkflow } from "../compute-adjustments-for-preview"
2224
import { createOrderChangeActionsWorkflow } from "../create-order-change-actions"
2325
import { updateOrderTaxLinesWorkflow } from "../update-tax-lines"
2426
import { fieldsToRefreshOrderEdit } from "./utils/fields"
25-
import { computeAdjustmentsForPreviewWorkflow } from "../compute-adjustments-for-preview"
2627

2728
/**
2829
* The data to validate that new items can be added to an order edit.
@@ -103,6 +104,12 @@ export const orderEditAddNewItemWorkflow = createWorkflow(
103104
function (
104105
input: WorkflowData<OrderWorkflow.OrderEditAddNewItemWorkflowInput>
105106
): WorkflowResponse<OrderPreviewDTO> {
107+
acquireLockStep({
108+
key: input.order_id,
109+
timeout: 2,
110+
ttl: 10,
111+
})
112+
106113
const orderResult = useQueryGraphStep({
107114
entity: "order",
108115
fields: fieldsToRefreshOrderEdit,
@@ -193,6 +200,14 @@ export const orderEditAddNewItemWorkflow = createWorkflow(
193200
},
194201
})
195202

196-
return new WorkflowResponse(previewOrderChangeStep(input.order_id))
203+
const previewOrderChange = previewOrderChangeStep(
204+
input.order_id
205+
) as OrderPreviewDTO
206+
207+
releaseLockStep({
208+
key: input.order_id,
209+
})
210+
211+
return new WorkflowResponse(previewOrderChange)
197212
}
198213
)

packages/core/core-flows/src/order/workflows/order-edit/order-edit-update-item-quantity.ts

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,14 @@ import {
1818
WorkflowResponse,
1919
} from "@medusajs/framework/workflows-sdk"
2020
import { useQueryGraphStep } from "../../../common"
21+
import { acquireLockStep, releaseLockStep } from "../../../locking"
2122
import { previewOrderChangeStep } from "../../steps/preview-order-change"
2223
import {
2324
throwIfIsCancelled,
2425
throwIfOrderChangeIsNotActive,
2526
} from "../../utils/order-validation"
26-
import { createOrderChangeActionsWorkflow } from "../create-order-change-actions"
2727
import { computeAdjustmentsForPreviewWorkflow } from "../compute-adjustments-for-preview"
28+
import { createOrderChangeActionsWorkflow } from "../create-order-change-actions"
2829
import { fieldsToRefreshOrderEdit } from "./utils/fields"
2930

3031
/**
@@ -113,6 +114,12 @@ export const orderEditUpdateItemQuantityWorkflow = createWorkflow(
113114
function (
114115
input: WorkflowData<OrderWorkflow.OrderEditUpdateItemQuantityWorkflowInput>
115116
): WorkflowResponse<OrderPreviewDTO> {
117+
acquireLockStep({
118+
key: input.order_id,
119+
timeout: 2,
120+
ttl: 10,
121+
})
122+
116123
const orderResult = useQueryGraphStep({
117124
entity: "order",
118125
fields: fieldsToRefreshOrderEdit,
@@ -194,6 +201,12 @@ export const orderEditUpdateItemQuantityWorkflow = createWorkflow(
194201
},
195202
})
196203

197-
return new WorkflowResponse(previewOrderChangeStep(input.order_id))
204+
const previewOrderChange = previewOrderChangeStep(input.order_id) as OrderPreviewDTO
205+
206+
releaseLockStep({
207+
key: input.order_id,
208+
})
209+
210+
return new WorkflowResponse(previewOrderChange)
198211
}
199212
)

packages/core/core-flows/src/order/workflows/order-edit/remove-order-edit-item-action.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
transform,
1515
} from "@medusajs/framework/workflows-sdk"
1616
import { useQueryGraphStep } from "../../../common"
17+
import { acquireLockStep, releaseLockStep } from "../../../locking"
1718
import {
1819
deleteOrderChangeActionsStep,
1920
previewOrderChangeStep,
@@ -128,6 +129,12 @@ export const removeItemOrderEditActionWorkflow = createWorkflow(
128129
function (
129130
input: WorkflowData<OrderWorkflow.DeleteOrderEditItemActionWorkflowInput>
130131
): WorkflowResponse<OrderPreviewDTO> {
132+
acquireLockStep({
133+
key: input.order_id,
134+
timeout: 2,
135+
ttl: 10,
136+
})
137+
131138
const orderResult = useQueryGraphStep({
132139
entity: "order",
133140
fields: fieldsToRefreshOrderEdit,
@@ -172,6 +179,12 @@ export const removeItemOrderEditActionWorkflow = createWorkflow(
172179
},
173180
})
174181

175-
return new WorkflowResponse(previewOrderChangeStep(order.id))
182+
const previewOrderChange = previewOrderChangeStep(order.id) as OrderPreviewDTO
183+
184+
releaseLockStep({
185+
key: input.order_id,
186+
})
187+
188+
return new WorkflowResponse(previewOrderChange)
176189
}
177190
)

packages/core/core-flows/src/order/workflows/order-edit/remove-order-edit-shipping-method.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
transform,
1515
} from "@medusajs/framework/workflows-sdk"
1616
import { useQueryGraphStep } from "../../../common"
17+
import { acquireLockStep, releaseLockStep } from "../../../locking"
1718
import { deleteOrderShippingMethods } from "../../steps"
1819
import { deleteOrderChangeActionsStep } from "../../steps/delete-order-change-actions"
1920
import { previewOrderChangeStep } from "../../steps/preview-order-change"
@@ -111,6 +112,12 @@ export const removeOrderEditShippingMethodWorkflow = createWorkflow(
111112
function (
112113
input: WorkflowData<OrderWorkflow.DeleteOrderEditShippingMethodWorkflowInput>
113114
): WorkflowResponse<OrderPreviewDTO> {
115+
acquireLockStep({
116+
key: input.order_id,
117+
timeout: 2,
118+
ttl: 10,
119+
})
120+
114121
const orderChangeResult = useQueryGraphStep({
115122
entity: "order_change",
116123
fields: ["id", "status", "version", "actions.*"],
@@ -151,6 +158,12 @@ export const removeOrderEditShippingMethodWorkflow = createWorkflow(
151158
deleteOrderShippingMethods({ ids: [dataToRemove.shippingMethodId] })
152159
)
153160

154-
return new WorkflowResponse(previewOrderChangeStep(input.order_id))
161+
const previewOrderChange = previewOrderChangeStep(input.order_id) as OrderPreviewDTO
162+
163+
releaseLockStep({
164+
key: input.order_id,
165+
})
166+
167+
return new WorkflowResponse(previewOrderChange)
155168
}
156169
)

packages/core/core-flows/src/order/workflows/order-edit/request-order-edit.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
transform,
1515
} from "@medusajs/framework/workflows-sdk"
1616
import { emitEventStep, useQueryGraphStep } from "../../../common"
17+
import { acquireLockStep, releaseLockStep } from "../../../locking"
1718
import { previewOrderChangeStep } from "../../steps"
1819
import { updateOrderChangesStep } from "../../steps/update-order-changes"
1920
import {
@@ -128,6 +129,12 @@ export const requestOrderEditRequestWorkflow = createWorkflow(
128129
function (
129130
input: OrderEditRequestWorkflowInput
130131
): WorkflowResponse<OrderPreviewDTO> {
132+
acquireLockStep({
133+
key: input.order_id,
134+
timeout: 2,
135+
ttl: 10,
136+
})
137+
131138
const orderResult = useQueryGraphStep({
132139
entity: "order",
133140
fields: fieldsToRefreshOrderEdit,
@@ -180,6 +187,12 @@ export const requestOrderEditRequestWorkflow = createWorkflow(
180187
data: eventData,
181188
})
182189

183-
return new WorkflowResponse(previewOrderChangeStep(order.id))
190+
const previewOrderChange = previewOrderChangeStep(order.id) as OrderPreviewDTO
191+
192+
releaseLockStep({
193+
key: input.order_id,
194+
})
195+
196+
return new WorkflowResponse(previewOrderChange)
184197
}
185198
)

0 commit comments

Comments
 (0)