fix(link-modules,core-flows): Carry over cart promotions to order promotions (#12920)

what:

- Carry over cart promotions to order promotions
This commit is contained in:
Riqwan Thamir authored and GitHub committed 2025-07-11 08:05:20 +00:00
1 parent 541e791b9b
commit 8c4228fc42
16 files changed
+200 -203

No files matched your search

+6
View File
@@ -0,0 +1,6 @@
---
"@medusajs/link-modules": patch
"@medusajs/core-flows": patch
---
fix(link-modules,core-flows): Carry over cart promotions to order promotions
@@ -1252,6 +1252,60 @@ medusaIntegrationTestRunner({
) )
}) })
it("should successfully complete cart with promotions", async () => {
const oldCart = (
await api.get(`/store/carts/${cart.id}`, storeHeaders)
).data.cart
createCartCreditLinesWorkflow.run({
input: [
{
cart_id: oldCart.id,
amount: oldCart.total,
currency_code: "usd",
reference: "test",
reference_id: "test",
},
],
container: appContainer,
})
const cartResponse = await api.post(
`/store/carts/${cart.id}/complete`,
{},
storeHeaders
)
const orderResponse = await api.get(
`/store/orders/${cartResponse.data.order.id}?fields=+promotions.*`,
storeHeaders
)
expect(cartResponse.status).toEqual(200)
expect(orderResponse.data.order).toEqual(
expect.objectContaining({
promotions: [
expect.objectContaining({
code: promotion.code,
}),
],
items: expect.arrayContaining([
expect.objectContaining({
unit_price: 1500,
compare_at_unit_price: null,
quantity: 1,
adjustments: expect.arrayContaining([
expect.objectContaining({
amount: 100,
code: promotion.code,
}),
]),
}),
]),
})
)
})
it("should successfully complete cart without shipping for digital products", async () => { it("should successfully complete cart without shipping for digital products", async () => {
/** /**
* Product has a shipping profile so cart item should not require shipping * Product has a shipping profile so cart item should not require shipping
@@ -36,6 +36,7 @@ export const cartFieldsForRefreshSteps = [
"shipping_methods.tax_lines.*", "shipping_methods.tax_lines.*",
"customer.*", "customer.*",
"customer.groups.*", "customer.groups.*",
"promotions.id",
"promotions.code", "promotions.code",
"payment_collection.id", "payment_collection.id",
"payment_collection.raw_amount", "payment_collection.raw_amount",
@@ -105,6 +106,7 @@ export const completeCartFields = [
"credit_lines.*", "credit_lines.*",
"payment_collection.*", "payment_collection.*",
"payment_collection.payment_sessions.*", "payment_collection.payment_sessions.*",
"promotions.id",
"items.variant.id", "items.variant.id",
"items.variant.product.id", "items.variant.product.id",
"items.variant.product.is_giftcard", "items.variant.product.is_giftcard",
@@ -1,6 +1,8 @@
import { import {
CartCreditLineDTO, CartCreditLineDTO,
CartWorkflowDTO, CartWorkflowDTO,
LinkDefinition,
PromotionDTO,
UsageComputedActions, UsageComputedActions,
} from "@medusajs/framework/types" } from "@medusajs/framework/types"
import { import {
@@ -326,13 +328,22 @@ export const completeCartWorkflow = createWorkflow(
const linksToCreate = transform( const linksToCreate = transform(
{ cart, createdOrder }, { cart, createdOrder },
({ cart, createdOrder }) => { ({ cart, createdOrder }) => {
const links: Record<string, any>[] = [ const links: LinkDefinition[] = [
{ {
[Modules.ORDER]: { order_id: createdOrder.id }, [Modules.ORDER]: { order_id: createdOrder.id },
[Modules.CART]: { cart_id: cart.id }, [Modules.CART]: { cart_id: cart.id },
}, },
] ]
if (cart.promotions?.length) {
cart.promotions.forEach((promotion: PromotionDTO) => {
links.push({
[Modules.ORDER]: { order_id: createdOrder.id },
[Modules.PROMOTION]: { promotion_id: promotion.id },
})
})
}
if (isDefined(cart.payment_collection?.id)) { if (isDefined(cart.payment_collection?.id)) {
links.push({ links.push({
[Modules.ORDER]: { order_id: createdOrder.id }, [Modules.ORDER]: { order_id: createdOrder.id },
@@ -27,10 +27,8 @@ export const draftOrderFieldsForRefreshSteps = [
"shipping_methods.tax_lines.*", "shipping_methods.tax_lines.*",
"customer.*", "customer.*",
"customer.groups.*", "customer.groups.*",
"promotion_link.*", "promotions.id",
"promotion_link.promotion", "promotions.code",
"promotion_link.promotion.id",
"promotion_link.promotion.code",
"subtotal", "subtotal",
"item_total", "item_total",
"total", "total",
@@ -27,24 +27,24 @@ export const addDraftOrderItemsWorkflowId = "add-draft-order-items"
/** /**
* This workflow adds items to a draft order. It's used by the * This workflow adds items to a draft order. It's used by the
* [Add Item to Draft Order Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersidedititems). * [Add Item to Draft Order Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersidedititems).
* *
* You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around adding items to * You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around adding items to
* a draft order. * a draft order.
* *
* @example * @example
* const { result } = await addDraftOrderItemsWorkflow(container) * const { result } = await addDraftOrderItemsWorkflow(container)
* .run({ * .run({
* input: { * input: {
* order_id: "order_123", * order_id: "order_123",
* items: [{ * items: [{
* variant_id: "variant_123", * variant_id: "variant_123",
* quantity: 1 * quantity: 1
* }] * }]
* } * }
* }) * })
* *
* @summary * @summary
* *
* Add items to a draft order. * Add items to a draft order.
*/ */
export const addDraftOrderItemsWorkflow = createWorkflow( export const addDraftOrderItemsWorkflow = createWorkflow(
@@ -52,13 +52,14 @@ export const addDraftOrderItemsWorkflow = createWorkflow(
function ( function (
input: WorkflowData<OrderWorkflow.OrderEditAddNewItemWorkflowInput> input: WorkflowData<OrderWorkflow.OrderEditAddNewItemWorkflowInput>
) { ) {
const order: OrderDTO = useRemoteQueryStep({ const order: OrderDTO & { promotions: { code: string }[] } =
entry_point: "orders", useRemoteQueryStep({
fields: draftOrderFieldsForRefreshSteps, entry_point: "orders",
variables: { id: input.order_id }, fields: draftOrderFieldsForRefreshSteps,
list: false, variables: { id: input.order_id },
throw_if_key_not_found: true, list: false,
}).config({ name: "order-query" }) throw_if_key_not_found: true,
}).config({ name: "order-query" })
const orderChange: OrderChangeDTO = useRemoteQueryStep({ const orderChange: OrderChangeDTO = useRemoteQueryStep({
entry_point: "order_change", entry_point: "order_change",
@@ -92,19 +93,10 @@ export const addDraftOrderItemsWorkflow = createWorkflow(
}, },
}) })
const appliedPromoCodes: string[] = transform(order, (order) => { const appliedPromoCodes: string[] = transform(
const promotionLink = (order as any).promotion_link order,
(order) => order.promotions?.map((promotion) => promotion.code) ?? []
if (!promotionLink) { )
return []
}
if (Array.isArray(promotionLink)) {
return promotionLink.map((promo) => promo.promotion.code)
}
return [promotionLink.promotion.code]
})
// If any the order has any promo codes, then we need to refresh the adjustments. // If any the order has any promo codes, then we need to refresh the adjustments.
when( when(
@@ -48,10 +48,10 @@ export interface AddDraftOrderShippingMethodsWorkflowInput {
/** /**
* This workflow adds shipping methods to a draft order. It's used by the * This workflow adds shipping methods to a draft order. It's used by the
* [Add Shipping Method to Draft Order Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersideditshippingmethods). * [Add Shipping Method to Draft Order Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersideditshippingmethods).
* *
* You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around adding shipping methods to * You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around adding shipping methods to
* a draft order. * a draft order.
* *
* @example * @example
* const { result } = await addDraftOrderShippingMethodsWorkflow(container) * const { result } = await addDraftOrderShippingMethodsWorkflow(container)
* .run({ * .run({
@@ -61,15 +61,19 @@ export interface AddDraftOrderShippingMethodsWorkflowInput {
* custom_amount: 10 * custom_amount: 10
* } * }
* }) * })
* *
* @summary * @summary
* *
* Add shipping methods to a draft order. * Add shipping methods to a draft order.
*/ */
export const addDraftOrderShippingMethodsWorkflow = createWorkflow( export const addDraftOrderShippingMethodsWorkflow = createWorkflow(
addDraftOrderShippingMethodsWorkflowId, addDraftOrderShippingMethodsWorkflowId,
function (input: WorkflowData<AddDraftOrderShippingMethodsWorkflowInput>) { function (input: WorkflowData<AddDraftOrderShippingMethodsWorkflowInput>) {
const order: OrderDTO = useRemoteQueryStep({ const order: OrderDTO & {
promotions: {
code: string
}[]
} = useRemoteQueryStep({
entry_point: "orders", entry_point: "orders",
fields: draftOrderFieldsForRefreshSteps, fields: draftOrderFieldsForRefreshSteps,
variables: { id: input.order_id }, variables: { id: input.order_id },
@@ -133,19 +137,10 @@ export const addDraftOrderShippingMethodsWorkflow = createWorkflow(
}, },
}) })
const appliedPromoCodes = transform(order, (order) => { const appliedPromoCodes: string[] = transform(
const promotionLink = (order as any).promotion_link order,
(order) => order.promotions?.map((promotion) => promotion.code) ?? []
if (!promotionLink) { )
return []
}
if (Array.isArray(promotionLink)) {
return promotionLink.map((promo) => promo.promotion.code)
}
return [promotionLink.promotion.code]
})
// If any the order has any promo codes, then we need to refresh the adjustments. // If any the order has any promo codes, then we need to refresh the adjustments.
when( when(
@@ -33,10 +33,10 @@ export interface CancelDraftOrderEditWorkflowInput {
/** /**
* This workflow cancels a draft order edit. It's used by the * This workflow cancels a draft order edit. It's used by the
* [Cancel Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_deletedraftordersidedit). * [Cancel Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_deletedraftordersidedit).
* *
* You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around * You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around
* cancelling a draft order edit. * cancelling a draft order edit.
* *
* @example * @example
* const { result } = await cancelDraftOrderEditWorkflow(container) * const { result } = await cancelDraftOrderEditWorkflow(container)
* .run({ * .run({
@@ -44,15 +44,19 @@ export interface CancelDraftOrderEditWorkflowInput {
* order_id: "order_123", * order_id: "order_123",
* } * }
* }) * })
* *
* @summary * @summary
* *
* Cancel a draft order edit. * Cancel a draft order edit.
*/ */
export const cancelDraftOrderEditWorkflow = createWorkflow( export const cancelDraftOrderEditWorkflow = createWorkflow(
cancelDraftOrderEditWorkflowId, cancelDraftOrderEditWorkflowId,
function (input: WorkflowData<CancelDraftOrderEditWorkflowInput>) { function (input: WorkflowData<CancelDraftOrderEditWorkflowInput>) {
const order: OrderDTO = useRemoteQueryStep({ const order: OrderDTO & {
promotions: {
code: string
}[]
} = useRemoteQueryStep({
entry_point: "orders", entry_point: "orders",
fields: ["version", ...draftOrderFieldsForRefreshSteps], fields: ["version", ...draftOrderFieldsForRefreshSteps],
variables: { id: input.order_id }, variables: { id: input.order_id },
@@ -125,18 +129,12 @@ export const cancelDraftOrderEditWorkflow = createWorkflow(
const promotionsToRefresh = transform( const promotionsToRefresh = transform(
{ order, promotionsToRemove, promotionsToRestore }, { order, promotionsToRemove, promotionsToRestore },
({ order, promotionsToRemove, promotionsToRestore }) => { ({ order, promotionsToRemove, promotionsToRestore }) => {
const promotionLink = (order as any).promotion_link const orderPromotions = order.promotions
const codes: Set<string> = new Set() const codes: Set<string> = new Set()
if (promotionLink) { orderPromotions?.forEach((promo) => {
if (Array.isArray(promotionLink)) { codes.add(promo.code)
promotionLink.forEach((promo) => { })
codes.add(promo.promotion.code)
})
} else {
codes.add(promotionLink.promotion.code)
}
}
for (const code of promotionsToRemove) { for (const code of promotionsToRemove) {
codes.delete(code) codes.delete(code)
@@ -163,9 +161,7 @@ export const cancelDraftOrderEditWorkflow = createWorkflow(
}, },
}) })
when(shippingToRestore, (methods) => { when(shippingToRestore, (methods) => !!methods?.length).then(() => {
return !!methods?.length
}).then(() => {
restoreDraftOrderShippingMethodsStep({ restoreDraftOrderShippingMethodsStep({
shippingMethods: shippingToRestore as any, shippingMethods: shippingToRestore as any,
}) })
@@ -28,10 +28,10 @@ export const removeDraftOrderActionItemWorkflowId =
/** /**
* This workflow removes an item that was added or updated in a draft order edit. It's used by the * This workflow removes an item that was added or updated in a draft order edit. It's used by the
* [Remove Item from Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_deletedraftordersidedititemsaction_id). * [Remove Item from Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_deletedraftordersidedititemsaction_id).
* *
* You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around * You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around
* removing an item from a draft order edit. * removing an item from a draft order edit.
* *
* @example * @example
* const { result } = await removeDraftOrderActionItemWorkflow(container) * const { result } = await removeDraftOrderActionItemWorkflow(container)
* .run({ * .run({
@@ -40,9 +40,9 @@ export const removeDraftOrderActionItemWorkflowId =
* action_id: "action_123", * action_id: "action_123",
* } * }
* }) * })
* *
* @summary * @summary
* *
* Remove an item from a draft order edit. * Remove an item from a draft order edit.
*/ */
export const removeDraftOrderActionItemWorkflow = createWorkflow( export const removeDraftOrderActionItemWorkflow = createWorkflow(
@@ -50,7 +50,11 @@ export const removeDraftOrderActionItemWorkflow = createWorkflow(
function ( function (
input: WorkflowData<OrderWorkflow.DeleteOrderEditItemActionWorkflowInput> input: WorkflowData<OrderWorkflow.DeleteOrderEditItemActionWorkflowInput>
): WorkflowResponse<OrderPreviewDTO> { ): WorkflowResponse<OrderPreviewDTO> {
const order: OrderDTO = useRemoteQueryStep({ const order: OrderDTO & {
promotions: {
code: string
}[]
} = useRemoteQueryStep({
entry_point: "orders", entry_point: "orders",
fields: ["id", "status", "is_draft_order", "canceled_at", "items.*"], fields: ["id", "status", "is_draft_order", "canceled_at", "items.*"],
variables: { id: input.order_id }, variables: { id: input.order_id },
@@ -89,19 +93,8 @@ export const removeDraftOrderActionItemWorkflow = createWorkflow(
const appliedPromoCodes: string[] = transform( const appliedPromoCodes: string[] = transform(
refetchedOrder, refetchedOrder,
(refetchedOrder) => { (refetchedOrder) =>
const promotionLink = (refetchedOrder as any).promotion_link refetchedOrder.promotions?.map((promotion) => promotion.code) ?? []
if (!promotionLink) {
return []
}
if (Array.isArray(promotionLink)) {
return promotionLink.map((promo) => promo.promotion.code)
}
return [promotionLink.promotion.code]
}
) )
// If any the order has any promo codes, then we need to refresh the adjustments. // If any the order has any promo codes, then we need to refresh the adjustments.
@@ -32,10 +32,10 @@ export const removeDraftOrderActionShippingMethodWorkflowId =
/** /**
* This workflow removes a shipping method that was added to an edited draft order. It's used by the * This workflow removes a shipping method that was added to an edited draft order. It's used by the
* [Remove Shipping Method from Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_deletedraftordersideditshippingmethodsaction_id). * [Remove Shipping Method from Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_deletedraftordersideditshippingmethodsaction_id).
* *
* You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around * You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around
* removing a shipping method from an edited draft order. * removing a shipping method from an edited draft order.
* *
* @example * @example
* const { result } = await removeDraftOrderActionShippingMethodWorkflow(container) * const { result } = await removeDraftOrderActionShippingMethodWorkflow(container)
* .run({ * .run({
@@ -44,9 +44,9 @@ export const removeDraftOrderActionShippingMethodWorkflowId =
* action_id: "action_123", * action_id: "action_123",
* } * }
* }) * })
* *
* @summary * @summary
* *
* Remove a shipping method from an edited draft order. * Remove a shipping method from an edited draft order.
*/ */
export const removeDraftOrderActionShippingMethodWorkflow = createWorkflow( export const removeDraftOrderActionShippingMethodWorkflow = createWorkflow(
@@ -100,19 +100,11 @@ export const removeDraftOrderActionShippingMethodWorkflow = createWorkflow(
order, order,
}) })
const appliedPromoCodes = transform(context, (context) => { const appliedPromoCodes: string[] = transform(
const promotionLink = (context as any).promotion_link context,
(context) =>
if (!promotionLink) { (context as any).promotions?.map((promotion) => promotion.code) ?? []
return [] )
}
if (Array.isArray(promotionLink)) {
return promotionLink.map((promo) => promo.promotion.code)
}
return [promotionLink.promotion.code]
})
when( when(
appliedPromoCodes, appliedPromoCodes,
@@ -41,10 +41,10 @@ export interface RemoveDraftOrderShippingMethodWorkflowInput {
/** /**
* This workflow removes an existing shipping method from a draft order edit. It's used by the * This workflow removes an existing shipping method from a draft order edit. It's used by the
* [Remove Shipping Method from Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_deletedraftordersideditshippingmethodsmethodmethod_id). * [Remove Shipping Method from Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_deletedraftordersideditshippingmethodsmethodmethod_id).
* *
* You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around * You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around
* removing a shipping method from a draft order edit. * removing a shipping method from a draft order edit.
* *
* @example * @example
* const { result } = await removeDraftOrderShippingMethodWorkflow(container) * const { result } = await removeDraftOrderShippingMethodWorkflow(container)
* .run({ * .run({
@@ -53,15 +53,19 @@ export interface RemoveDraftOrderShippingMethodWorkflowInput {
* shipping_method_id: "sm_123", * shipping_method_id: "sm_123",
* } * }
* }) * })
* *
* @summary * @summary
* *
* Remove an existing shipping method from a draft order edit. * Remove an existing shipping method from a draft order edit.
*/ */
export const removeDraftOrderShippingMethodWorkflow = createWorkflow( export const removeDraftOrderShippingMethodWorkflow = createWorkflow(
removeDraftOrderShippingMethodWorkflowId, removeDraftOrderShippingMethodWorkflowId,
function (input: WorkflowData<RemoveDraftOrderShippingMethodWorkflowInput>) { function (input: WorkflowData<RemoveDraftOrderShippingMethodWorkflowInput>) {
const order: OrderDTO = useRemoteQueryStep({ const order: OrderDTO & {
promotions: {
code: string
}[]
} = useRemoteQueryStep({
entry_point: "orders", entry_point: "orders",
fields: draftOrderFieldsForRefreshSteps, fields: draftOrderFieldsForRefreshSteps,
variables: { id: input.order_id }, variables: { id: input.order_id },
@@ -89,19 +93,10 @@ export const removeDraftOrderShippingMethodWorkflow = createWorkflow(
}, },
}) })
const appliedPromoCodes = transform(order, (order) => { const appliedPromoCodes: string[] = transform(
const promotionLink = (order as any).promotion_link order,
(order) => order.promotions?.map((promotion) => promotion.code) ?? []
if (!promotionLink) { )
return []
}
if (Array.isArray(promotionLink)) {
return promotionLink.map((promo) => promo.promotion.code)
}
return [promotionLink.promotion.code]
})
// If any the order has any promo codes, then we need to refresh the adjustments. // If any the order has any promo codes, then we need to refresh the adjustments.
when( when(
@@ -28,10 +28,10 @@ export const updateDraftOrderActionItemId = "update-draft-order-action-item"
/** /**
* This workflow updates a new item that was added to a draft order edit. It's used by the * This workflow updates a new item that was added to a draft order edit. It's used by the
* [Update New Item in Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersidedititemsaction_id). * [Update New Item in Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersidedititemsaction_id).
* *
* You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around * You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around
* updating a new item in a draft order edit. * updating a new item in a draft order edit.
* *
* @example * @example
* const { result } = await updateDraftOrderActionItemWorkflow(container) * const { result } = await updateDraftOrderActionItemWorkflow(container)
* .run({ * .run({
@@ -43,9 +43,9 @@ export const updateDraftOrderActionItemId = "update-draft-order-action-item"
* } * }
* } * }
* }) * })
* *
* @summary * @summary
* *
* Update a new item in a draft order edit. * Update a new item in a draft order edit.
*/ */
export const updateDraftOrderActionItemWorkflow = createWorkflow( export const updateDraftOrderActionItemWorkflow = createWorkflow(
@@ -53,7 +53,11 @@ export const updateDraftOrderActionItemWorkflow = createWorkflow(
function ( function (
input: WorkflowData<OrderWorkflow.UpdateOrderEditAddNewItemWorkflowInput> input: WorkflowData<OrderWorkflow.UpdateOrderEditAddNewItemWorkflowInput>
) { ) {
const order: OrderDTO = useRemoteQueryStep({ const order: OrderDTO & {
promotions: {
code: string
}[]
} = useRemoteQueryStep({
entry_point: "orders", entry_point: "orders",
fields: draftOrderFieldsForRefreshSteps, fields: draftOrderFieldsForRefreshSteps,
variables: { id: input.order_id }, variables: { id: input.order_id },
@@ -112,19 +116,11 @@ export const updateDraftOrderActionItemWorkflow = createWorkflow(
order, order,
}) })
const appliedPromoCodes: string[] = transform(context, (context) => { const appliedPromoCodes: string[] = transform(
const promotionLink = (context as any).promotion_link context,
(context) =>
if (!promotionLink) { (context as any).promotions?.map((promotion) => promotion.code) ?? []
return [] )
}
if (Array.isArray(promotionLink)) {
return promotionLink.map((promo) => promo.promotion.code)
}
return [promotionLink.promotion.code]
})
// If any the order has any promo codes, then we need to refresh the adjustments. // If any the order has any promo codes, then we need to refresh the adjustments.
when( when(
@@ -33,10 +33,10 @@ export const updateDraftOrderActionShippingMethodWorkflowId =
/** /**
* This workflow updates a new shipping method that was added to a draft order edit. It's used by the * This workflow updates a new shipping method that was added to a draft order edit. It's used by the
* [Update New Shipping Method in Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersideditshippingmethodsaction_id). * [Update New Shipping Method in Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersideditshippingmethodsaction_id).
* *
* You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around * You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around
* updating a new shipping method in a draft order edit. * updating a new shipping method in a draft order edit.
* *
* @example * @example
* const { result } = await updateDraftOrderActionShippingMethodWorkflow(container) * const { result } = await updateDraftOrderActionShippingMethodWorkflow(container)
* .run({ * .run({
@@ -48,9 +48,9 @@ export const updateDraftOrderActionShippingMethodWorkflowId =
* } * }
* } * }
* }) * })
* *
* @summary * @summary
* *
* Update a new shipping method in a draft order edit. * Update a new shipping method in a draft order edit.
*/ */
export const updateDraftOrderActionShippingMethodWorkflow = createWorkflow( export const updateDraftOrderActionShippingMethodWorkflow = createWorkflow(
@@ -142,19 +142,11 @@ export const updateDraftOrderActionShippingMethodWorkflow = createWorkflow(
order, order,
}) })
const appliedPromoCodes = transform(context, (context) => { const appliedPromoCodes: string[] = transform(
const promotionLink = (context as any).promotion_link context,
(context) =>
if (!promotionLink) { (context as any).promotions?.map((promotion) => promotion.code) ?? []
return [] )
}
if (Array.isArray(promotionLink)) {
return promotionLink.map((promo) => promo.promotion.code)
}
return [promotionLink.promotion.code]
})
when( when(
appliedPromoCodes, appliedPromoCodes,
@@ -33,10 +33,10 @@ export const updateDraftOrderItemWorkflowId = "update-draft-order-item"
/** /**
* This workflow updates an item in a draft order edit. It's used by the * This workflow updates an item in a draft order edit. It's used by the
* [Update Item in Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersidedititemsitemitem_id). * [Update Item in Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersidedititemsitemitem_id).
* *
* You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around * You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around
* updating an item in a draft order edit. * updating an item in a draft order edit.
* *
* @example * @example
* const { result } = await updateDraftOrderItemWorkflow(container) * const { result } = await updateDraftOrderItemWorkflow(container)
* .run({ * .run({
@@ -45,9 +45,9 @@ export const updateDraftOrderItemWorkflowId = "update-draft-order-item"
* items: [{ id: "orli_123", quantity: 2 }], * items: [{ id: "orli_123", quantity: 2 }],
* } * }
* }) * })
* *
* @summary * @summary
* *
* Update an item in a draft order edit. * Update an item in a draft order edit.
*/ */
export const updateDraftOrderItemWorkflow = createWorkflow( export const updateDraftOrderItemWorkflow = createWorkflow(
@@ -115,19 +115,11 @@ export const updateDraftOrderItemWorkflow = createWorkflow(
order, order,
}) })
const appliedPromoCodes: string[] = transform(context, (context) => { const appliedPromoCodes: string[] = transform(
const promotionLink = (context as any).promotion_link context,
(context) =>
if (!promotionLink) { (context as any).promotions?.map((promotion) => promotion.code) ?? []
return [] )
}
if (Array.isArray(promotionLink)) {
return promotionLink.map((promo) => promo.promotion.code)
}
return [promotionLink.promotion.code]
})
// If any the order has any promo codes, then we need to refresh the adjustments. // If any the order has any promo codes, then we need to refresh the adjustments.
when( when(
@@ -56,10 +56,10 @@ export interface UpdateDraftOrderShippingMethodWorkflowInput {
/** /**
* This workflow updates an existing shipping method in a draft order edit. It's used by the * This workflow updates an existing shipping method in a draft order edit. It's used by the
* [Update Shipping Method in Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersideditshippingmethodsmethodmethod_id). * [Update Shipping Method in Draft Order Edit Admin API Route](https://docs.medusajs.com/api/admin#draft-orders_postdraftordersideditshippingmethodsmethodmethod_id).
* *
* You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around * You can use this workflow within your customizations or your own custom workflows, allowing you to wrap custom logic around
* updating an existing shipping method in a draft order edit. * updating an existing shipping method in a draft order edit.
* *
* @example * @example
* const { result } = await updateDraftOrderShippingMethodWorkflow(container) * const { result } = await updateDraftOrderShippingMethodWorkflow(container)
* .run({ * .run({
@@ -71,9 +71,9 @@ export interface UpdateDraftOrderShippingMethodWorkflowInput {
* } * }
* } * }
* }) * })
* *
* @summary * @summary
* *
* Update an existing shipping method in a draft order edit. * Update an existing shipping method in a draft order edit.
*/ */
export const updateDraftOrderShippingMethodWorkflow = createWorkflow( export const updateDraftOrderShippingMethodWorkflow = createWorkflow(
@@ -123,19 +123,11 @@ export const updateDraftOrderShippingMethodWorkflow = createWorkflow(
throw_if_key_not_found: true, throw_if_key_not_found: true,
}).config({ name: "refetched-order-query" }) }).config({ name: "refetched-order-query" })
const appliedPromoCodes = transform(refetchedOrder, (refetchedOrder) => { const appliedPromoCodes = transform(
const promotionLink = (refetchedOrder as any).promotion_link refetchedOrder,
(refetchedOrder) =>
if (!promotionLink) { refetchedOrder.promotions?.map((promotion) => promotion.code) ?? []
return [] )
}
if (Array.isArray(promotionLink)) {
return promotionLink.map((promo) => promo.promotion.code)
}
return [promotionLink.promotion.code]
})
when( when(
appliedPromoCodes, appliedPromoCodes,
@@ -32,7 +32,7 @@ export const OrderPromotion: ModuleJoinerConfig = {
entity: "Promotion", entity: "Promotion",
primaryKey: "id", primaryKey: "id",
foreignKey: "promotion_id", foreignKey: "promotion_id",
alias: "promotion", alias: "promotions",
args: { args: {
methodSuffix: "Promotions", methodSuffix: "Promotions",
}, },
@@ -44,8 +44,8 @@ export const OrderPromotion: ModuleJoinerConfig = {
serviceName: Modules.ORDER, serviceName: Modules.ORDER,
entity: "Order", entity: "Order",
fieldAlias: { fieldAlias: {
promotion: { promotions: {
path: "promotion_link.promotion", path: "promotion_link.promotions",
isList: true, isList: true,
}, },
}, },
@@ -54,16 +54,7 @@ export const OrderPromotion: ModuleJoinerConfig = {
primaryKey: "order_id", primaryKey: "order_id",
foreignKey: "id", foreignKey: "id",
alias: "promotion_link", alias: "promotion_link",
}, isList: true,
},
{
serviceName: Modules.PROMOTION,
entity: "Promotion",
relationship: {
serviceName: LINKS.OrderPromotion,
primaryKey: "promotion_id",
foreignKey: "id",
alias: "order_link",
}, },
}, },
], ],