From 1071296236d84b70b3b31034eb95984445feb020 Mon Sep 17 00:00:00 2001 From: William Bouchard <46496014+willbouch@users.noreply.github.com> Date: Wed, 17 Sep 2025 13:20:02 -0400 Subject: [PATCH] feat(core-flows): hook to set shipping opt context when listing (#13468) * feat(core-flows): add hook to set shipping option context when listing them * changeset * add integration test * add it to other workflow * missing hook in workflow response * rework workflow * rework workflow * typing issue * comment from oli * cursor the goat * tests * save lines * move code around * missing additional params in many places * smal fix * smal fix --- .changeset/strange-badgers-fly.md | 5 + .../cart/store/cart.workflows.spec.ts | 156 ++++++++++++++++++ .../steps/validate-cart-shipping-options.ts | 67 +++++--- .../core/core-flows/src/cart/utils/schemas.ts | 1 + .../workflows/add-shipping-method-to-cart.ts | 17 +- .../src/cart/workflows/add-to-cart.ts | 2 +- ...-shipping-options-for-cart-with-pricing.ts | 27 ++- .../list-shipping-options-for-cart.ts | 32 +++- .../src/cart/workflows/refresh-cart-items.ts | 19 +-- .../refresh-cart-shipping-methods.ts | 4 +- .../cart/workflows/transfer-cart-customer.ts | 5 +- .../src/cart/workflows/update-cart.ts | 19 +-- .../workflows/update-line-item-in-cart.ts | 5 +- .../line-item/workflows/delete-line-items.ts | 7 +- .../api/store/carts/[id]/customer/route.ts | 5 +- .../carts/[id]/line-items/[line_id]/route.ts | 10 +- .../api/store/carts/[id]/line-items/route.ts | 4 +- .../medusa/src/api/store/carts/[id]/route.ts | 1 + .../carts/[id]/shipping-methods/route.ts | 5 +- 19 files changed, 301 insertions(+), 90 deletions(-) create mode 100644 .changeset/strange-badgers-fly.md diff --git a/.changeset/strange-badgers-fly.md b/.changeset/strange-badgers-fly.md new file mode 100644 index 0000000000..3ab9aa301d --- /dev/null +++ b/.changeset/strange-badgers-fly.md @@ -0,0 +1,5 @@ +--- +"@medusajs/core-flows": patch +--- + +feat(core-flows): hook to set shipping opt context when listing diff --git a/integration-tests/modules/__tests__/cart/store/cart.workflows.spec.ts b/integration-tests/modules/__tests__/cart/store/cart.workflows.spec.ts index 256af175ac..a36e052ed7 100644 --- a/integration-tests/modules/__tests__/cart/store/cart.workflows.spec.ts +++ b/integration-tests/modules/__tests__/cart/store/cart.workflows.spec.ts @@ -8,6 +8,7 @@ import { deleteLineItemsStepId, deleteLineItemsWorkflow, findOrCreateCustomerStepId, + listShippingOptionsForCartWithPricingWorkflow, listShippingOptionsForCartWorkflow, refreshPaymentCollectionForCartWorkflow, updateCartWorkflow, @@ -71,6 +72,7 @@ medusaIntegrationTestRunner({ let defaultRegion let customer, storeHeadersWithCustomer let setPricingContextHook: any + let setShippingOptionsContextHook: any beforeAll(async () => { appContainer = getContainer() @@ -114,6 +116,22 @@ medusaIntegrationTestRunner({ }, () => {} ) + listShippingOptionsForCartWorkflow.hooks.setShippingOptionsContext( + (input) => { + if (setShippingOptionsContextHook) { + return setShippingOptionsContextHook(input) + } + }, + () => {} + ) + listShippingOptionsForCartWithPricingWorkflow.hooks.setShippingOptionsContext( + (input) => { + if (setShippingOptionsContextHook) { + return setShippingOptionsContextHook(input) + } + }, + () => {} + ) }) beforeEach(async () => { @@ -3539,6 +3557,74 @@ medusaIntegrationTestRunner({ ) }) + it("should add shipping method to cart using custom rules to fetch", async () => { + const shippingOption = ( + await api.post( + `/admin/shipping-options`, + { + name: "Test shipping option 1", + service_zone_id: fulfillmentSet.service_zones[0].id, + shipping_profile_id: shippingProfile.id, + provider_id: "manual_test-provider", + price_type: "flat", + type: { + label: "Test type", + description: "Test description", + code: "test-code", + }, + prices: [{ amount: 3_000, currency_code: "usd" }], + rules: [ + { + operator: RuleOperator.EQ, + attribute: "is_return", + value: "false", + }, + { + operator: RuleOperator.EQ, + attribute: "enabled_in_store", + value: "true", + }, + { + operator: RuleOperator.EQ, + attribute: "customer_status", + value: "vip", + }, + ], + }, + adminHeaders + ) + ).data.shipping_option + + setShippingOptionsContextHook = function () { + return new StepResponse({ + customer_status: "vip", + }) + } + + await addShippingMethodToCartWorkflow(appContainer).run({ + input: { + options: [{ id: shippingOption.id }], + cart_id: cart.id, + }, + }) + + cart = (await api.get(`/store/carts/${cart.id}`, storeHeaders)).data + .cart + + expect(cart).toEqual( + expect.objectContaining({ + id: cart.id, + currency_code: "usd", + shipping_methods: [ + expect.objectContaining({ + amount: 3_000, + is_tax_inclusive: true, + }), + ], + }) + ) + }) + it("should throw error when shipping option is not valid", async () => { const shippingOption = ( await api.post( @@ -4167,6 +4253,76 @@ medusaIntegrationTestRunner({ ]) }) }) + + describe("setShippingOptionsContext hook", () => { + it("should use context provided by the hook", async () => { + const shippingOption = ( + await api.post( + `/admin/shipping-options`, + { + name: "Test shipping option", + service_zone_id: fulfillmentSet.service_zones[0].id, + shipping_profile_id: shippingProfile.id, + provider_id: "manual_test-provider", + price_type: "flat", + type: { + label: "Test type", + description: "Test description", + code: "test-code", + }, + prices: [ + { + amount: 3000, + currency_code: "usd", + }, + ], + rules: [ + { + operator: RuleOperator.EQ, + attribute: "is_return", + value: "false", + }, + { + operator: RuleOperator.EQ, + attribute: "enabled_in_store", + value: "true", + }, + { + operator: RuleOperator.EQ, + attribute: "customer_status", + value: "vip", + }, + ], + }, + adminHeaders + ) + ).data.shipping_option + + cart = (await api.get(`/store/carts/${cart.id}`, storeHeaders)).data + .cart + + setShippingOptionsContextHook = function () { + return new StepResponse({ + customer_status: "vip", + }) + } + + const { result: result1 } = await listShippingOptionsForCartWorkflow( + appContainer + ).run({ input: { cart_id: cart.id } }) + + expect(result1).toHaveLength(1) + expect(result1[0].name).toEqual(shippingOption.name) + + setShippingOptionsContextHook = undefined + + const { result: result2 } = await listShippingOptionsForCartWorkflow( + appContainer + ).run({ input: { cart_id: cart.id } }) + + expect(result2).toHaveLength(0) + }) + }) }) describe("updateTaxLinesWorkflow", () => { diff --git a/packages/core/core-flows/src/cart/steps/validate-cart-shipping-options.ts b/packages/core/core-flows/src/cart/steps/validate-cart-shipping-options.ts index e39e845eaa..e62a972f01 100644 --- a/packages/core/core-flows/src/cart/steps/validate-cart-shipping-options.ts +++ b/packages/core/core-flows/src/cart/steps/validate-cart-shipping-options.ts @@ -1,10 +1,6 @@ import { CartDTO, IFulfillmentModuleService } from "@medusajs/framework/types" -import { - MedusaError, - Modules, - arrayDifference, -} from "@medusajs/framework/utils" -import { StepResponse, createStep } from "@medusajs/framework/workflows-sdk" +import { arrayDifference, MedusaError, Modules, } from "@medusajs/framework/utils" +import { createStep, StepResponse } from "@medusajs/framework/workflows-sdk" /** * The details of the cart and its shipping options context. @@ -13,11 +9,11 @@ export interface ValidateCartShippingOptionsStepInput { /** * The cart to validate shipping options for. */ - cart: CartDTO + cart?: CartDTO /** * The context to validate the shipping options. */ - shippingOptionsContext: { + shippingOptionsContext?: { /** * Validate whether the shipping options are enabled in the store. */ @@ -31,6 +27,11 @@ export interface ValidateCartShippingOptionsStepInput { * The IDs of the shipping options to validate. */ option_ids: string[] + /** + * Pre-fetched shipping options. If provided, validation will be done against these + * instead of querying the database. + */ + prefetched_shipping_options?: { id: string }[] } export const validateCartShippingOptionsStepId = @@ -51,32 +52,46 @@ export const validateCartShippingOptionsStepId = export const validateCartShippingOptionsStep = createStep( validateCartShippingOptionsStepId, async (data: ValidateCartShippingOptionsStepInput, { container }) => { - const { option_ids: optionIds = [], cart, shippingOptionsContext } = data + const { option_ids: optionIds = [], cart, shippingOptionsContext, prefetched_shipping_options: prefetchedShippingOptions } = data if (!optionIds.length) { return new StepResponse(void 0) } - const fulfillmentModule = container.resolve( - Modules.FULFILLMENT - ) + let validShippingOptionIds: string[] + if (!prefetchedShippingOptions) { + if (!cart || !shippingOptionsContext) { + throw new MedusaError( + MedusaError.Types.INVALID_DATA, + `Cart and shippingOptionsContext need to be defined if prefetchedShippingOptions is not.` + ) + } - const validShippingOptions = - await fulfillmentModule.listShippingOptionsForContext( - { - id: optionIds, - context: shippingOptionsContext, - address: { - country_code: cart.shipping_address?.country_code, - province_code: cart.shipping_address?.province, - city: cart.shipping_address?.city, - postal_expression: cart.shipping_address?.postal_code, - }, - }, - { relations: ["rules"] } + // Legacy behavior: query the database + const fulfillmentModule = container.resolve( + Modules.FULFILLMENT ) - const validShippingOptionIds = validShippingOptions.map((o) => o.id) + const validShippingOptions = + await fulfillmentModule.listShippingOptionsForContext( + { + id: optionIds, + context: shippingOptionsContext, + address: { + country_code: cart.shipping_address?.country_code, + province_code: cart.shipping_address?.province, + city: cart.shipping_address?.city, + postal_expression: cart.shipping_address?.postal_code, + }, + }, + { relations: ["rules"] } + ) + + validShippingOptionIds = validShippingOptions.map((o) => o.id) + } else { + validShippingOptionIds = prefetchedShippingOptions.map((o) => o.id) + } + const invalidOptionIds = arrayDifference(optionIds, validShippingOptionIds) if (invalidOptionIds.length) { diff --git a/packages/core/core-flows/src/cart/utils/schemas.ts b/packages/core/core-flows/src/cart/utils/schemas.ts index 053b8f216b..0de2fea0ac 100644 --- a/packages/core/core-flows/src/cart/utils/schemas.ts +++ b/packages/core/core-flows/src/cart/utils/schemas.ts @@ -1,2 +1,3 @@ import z from "zod" export const pricingContextResult = z.record(z.string(), z.any()).optional() +export const shippingOptionsContextResult = z.record(z.string(), z.any()).optional() diff --git a/packages/core/core-flows/src/cart/workflows/add-shipping-method-to-cart.ts b/packages/core/core-flows/src/cart/workflows/add-shipping-method-to-cart.ts index f0efa838d1..60d194919f 100644 --- a/packages/core/core-flows/src/cart/workflows/add-shipping-method-to-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/add-shipping-method-to-cart.ts @@ -20,6 +20,7 @@ import { validateCartShippingOptionsPriceStep } from "../steps/validate-shipping import { cartFieldsForRefreshSteps } from "../utils/fields" import { listShippingOptionsForCartWithPricingWorkflow } from "./list-shipping-options-for-cart-with-pricing" import { refreshCartItemsWorkflow } from "./refresh-cart-items" +import { AdditionalData } from "@medusajs/types" /** * The data to add a shipping method to a cart. @@ -80,7 +81,7 @@ export const addShippingMethodToCartWorkflowId = "add-shipping-method-to-cart" */ export const addShippingMethodToCartWorkflow = createWorkflow( addShippingMethodToCartWorkflowId, - (input: WorkflowData) => { + (input: WorkflowData) => { const cart = useRemoteQueryStep({ entry_point: "cart", fields: cartFieldsForRefreshSteps, @@ -100,21 +101,21 @@ export const addShippingMethodToCartWorkflow = createWorkflow( return (data.input.options ?? []).map((i) => i.id) }) - validateCartShippingOptionsStep({ - option_ids: optionIds, - cart, - shippingOptionsContext: { is_return: "false", enabled_in_store: "true" }, - }) - const shippingOptions = listShippingOptionsForCartWithPricingWorkflow.runAsStep({ input: { options: input.options, cart_id: cart.id, is_return: false, + additional_data: input.additional_data, }, }) + validateCartShippingOptionsStep({ + option_ids: optionIds, + prefetched_shipping_options: shippingOptions, + }) + validateCartShippingOptionsPriceStep({ shippingOptions }) const validateShippingMethodsDataInput = transform( @@ -200,7 +201,7 @@ export const addShippingMethodToCartWorkflow = createWorkflow( ) refreshCartItemsWorkflow.runAsStep({ - input: { cart_id: cart.id, shipping_methods: createdShippingMethods }, + input: { cart_id: cart.id, shipping_methods: createdShippingMethods, additional_data: input.additional_data }, }) return new WorkflowResponse(void 0, { diff --git a/packages/core/core-flows/src/cart/workflows/add-to-cart.ts b/packages/core/core-flows/src/cart/workflows/add-to-cart.ts index d80c7eb30c..1481ca7d66 100644 --- a/packages/core/core-flows/src/cart/workflows/add-to-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/add-to-cart.ts @@ -313,7 +313,7 @@ export const addToCartWorkflow = createWorkflow( ) refreshCartItemsWorkflow.runAsStep({ - input: { cart_id: cart.id, items: allItems }, + input: { cart_id: cart.id, items: allItems, additional_data: input.additional_data }, }) parallelize( diff --git a/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart-with-pricing.ts b/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart-with-pricing.ts index 600138fd90..9da621d95e 100644 --- a/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart-with-pricing.ts +++ b/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart-with-pricing.ts @@ -1,5 +1,6 @@ import { isDefined, ShippingOptionPriceType } from "@medusajs/framework/utils" import { + createHook, createWorkflow, parallelize, transform, @@ -7,6 +8,7 @@ import { WorkflowResponse, } from "@medusajs/framework/workflows-sdk" import { + AdditionalData, CalculateShippingOptionPriceDTO, ListShippingOptionsForCartWithPricingWorkflowInput, } from "@medusajs/types" @@ -15,6 +17,7 @@ import { useQueryGraphStep, validatePresenceOfStep } from "../../common" import { useRemoteQueryStep } from "../../common/steps/use-remote-query" import { calculateShippingOptionsPricesStep } from "../../fulfillment" import { cartFieldsForCalculateShippingOptionsPrices } from "../utils/fields" +import { shippingOptionsContextResult } from "../utils/schemas" const COMMON_OPTIONS_FIELDS = [ "id", @@ -75,7 +78,7 @@ export const listShippingOptionsForCartWithPricingWorkflowId = */ export const listShippingOptionsForCartWithPricingWorkflow = createWorkflow( listShippingOptionsForCartWithPricingWorkflowId, - (input: WorkflowData) => { + (input: WorkflowData) => { const optionIds = transform({ input }, ({ input }) => (input.options ?? []).map(({ id }) => id) ) @@ -137,10 +140,24 @@ export const listShippingOptionsForCartWithPricingWorkflow = createWorkflow( } ) + const setShippingOptionsContext = createHook( + "setShippingOptionsContext", + { + cart: cart, + fulfillmentSetIds, + additional_data: input.additional_data, + }, + { + resultValidator: shippingOptionsContextResult, + } + ) + const setShippingOptionsContextResult = setShippingOptionsContext.getResult() + const commonOptions = transform( - { input, cart, fulfillmentSetIds }, - ({ input, cart, fulfillmentSetIds }) => ({ + { input, cart, fulfillmentSetIds, setShippingOptionsContextResult }, + ({ input, cart, fulfillmentSetIds, setShippingOptionsContextResult }) => ({ context: { + ...(setShippingOptionsContextResult ? setShippingOptionsContextResult : {}), is_return: input.is_return ? "true" : "false", enabled_in_store: !isDefined(input.enabled_in_store) ? "true" @@ -310,6 +327,8 @@ export const listShippingOptionsForCartWithPricingWorkflow = createWorkflow( } ) - return new WorkflowResponse(shippingOptionsWithPrice) + return new WorkflowResponse(shippingOptionsWithPrice, { + hooks: [setShippingOptionsContext] as const, + }) } ) diff --git a/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts b/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts index e9aafe49b8..4ea6540a5b 100644 --- a/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/list-shipping-options-for-cart.ts @@ -5,15 +5,21 @@ import { WorkflowData, WorkflowResponse, } from "@medusajs/framework/workflows-sdk" -import { useQueryGraphStep, validatePresenceOfStep } from "../../common" -import { useRemoteQueryStep } from "../../common/steps/use-remote-query" +import { + useQueryGraphStep, + useRemoteQueryStep, + validatePresenceOfStep, +} from "../../common" import { cartFieldsForPricingContext } from "../utils/fields" import { AdditionalData, ListShippingOptionsForCartWorkflowInput, } from "@medusajs/types" import { filterObjectByKeys, isDefined } from "@medusajs/framework/utils" -import { pricingContextResult } from "../utils/schemas" +import { + pricingContextResult, + shippingOptionsContextResult, +} from "../utils/schemas" export const listShippingOptionsForCartWorkflowId = "list-shipping-options-for-cart" @@ -153,13 +159,27 @@ export const listShippingOptionsForCartWorkflow = createWorkflow( ) const setPricingContextResult = setPricingContext.getResult() + const setShippingOptionsContext = createHook( + "setShippingOptionsContext", + { + cart: cart, + fulfillmentSetIds, + additional_data: input.additional_data, + }, + { + resultValidator: shippingOptionsContextResult, + } + ) + const setShippingOptionsContextResult = setShippingOptionsContext.getResult() + const queryVariables = transform( - { input, fulfillmentSetIds, cart, setPricingContextResult }, - ({ input, fulfillmentSetIds, cart, setPricingContextResult }) => { + { input, fulfillmentSetIds, cart, setPricingContextResult, setShippingOptionsContextResult }, + ({ input, fulfillmentSetIds, cart, setPricingContextResult, setShippingOptionsContextResult }) => { return { id: input.option_ids, context: { + ...(setShippingOptionsContextResult ? setShippingOptionsContextResult : {}), is_return: input.is_return ? "true" : "false", enabled_in_store: !isDefined(input.enabled_in_store) ? "true" @@ -270,7 +290,7 @@ export const listShippingOptionsForCartWorkflow = createWorkflow( ) return new WorkflowResponse(shippingOptionsWithPrice, { - hooks: [setPricingContext] as const, + hooks: [setPricingContext, setShippingOptionsContext] as const, }) } ) diff --git a/packages/core/core-flows/src/cart/workflows/refresh-cart-items.ts b/packages/core/core-flows/src/cart/workflows/refresh-cart-items.ts index e61d95ffe8..885df1f5fd 100644 --- a/packages/core/core-flows/src/cart/workflows/refresh-cart-items.ts +++ b/packages/core/core-flows/src/cart/workflows/refresh-cart-items.ts @@ -1,8 +1,4 @@ -import { - filterObjectByKeys, - isDefined, - PromotionActions, -} from "@medusajs/framework/utils" +import { filterObjectByKeys, isDefined, PromotionActions, } from "@medusajs/framework/utils" import { createHook, createWorkflow, @@ -17,15 +13,8 @@ import { useRemoteQueryStep } from "../../common/steps/use-remote-query" import { acquireLockStep, releaseLockStep } from "../../locking" import { getVariantPriceSetsStep, updateLineItemsStep } from "../steps" import { validateVariantPricesStep } from "../steps/validate-variant-prices" -import { - cartFieldsForPricingContext, - cartFieldsForRefreshSteps, - productVariantsFields, -} from "../utils/fields" -import { - prepareLineItemData, - PrepareLineItemDataInput, -} from "../utils/prepare-line-item-data" +import { cartFieldsForPricingContext, cartFieldsForRefreshSteps, productVariantsFields, } from "../utils/fields" +import { prepareLineItemData, PrepareLineItemDataInput, } from "../utils/prepare-line-item-data" import { pricingContextResult } from "../utils/schemas" import { refreshCartShippingMethodsWorkflow } from "./refresh-cart-shipping-methods" import { refreshPaymentCollectionForCartWorkflow } from "./refresh-payment-collection" @@ -272,7 +261,7 @@ export const refreshCartItemsWorkflow = createWorkflow( }).config({ name: "refetch–cart" }) refreshCartShippingMethodsWorkflow.runAsStep({ - input: { cart: refetchedCart }, + input: { cart: refetchedCart, additional_data: input.additional_data }, }) when("force-refresh-update-tax-lines", { input }, ({ input }) => { diff --git a/packages/core/core-flows/src/cart/workflows/refresh-cart-shipping-methods.ts b/packages/core/core-flows/src/cart/workflows/refresh-cart-shipping-methods.ts index dd34731805..62dbc5bbcf 100644 --- a/packages/core/core-flows/src/cart/workflows/refresh-cart-shipping-methods.ts +++ b/packages/core/core-flows/src/cart/workflows/refresh-cart-shipping-methods.ts @@ -13,6 +13,7 @@ import { acquireLockStep, releaseLockStep } from "../../locking" import { removeShippingMethodFromCartStep } from "../steps" import { updateShippingMethodsStep } from "../steps/update-shipping-methods" import { listShippingOptionsForCartWithPricingWorkflow } from "./list-shipping-options-for-cart-with-pricing" +import { AdditionalData } from "@medusajs/types" /** * The details of the cart to refresh. @@ -55,7 +56,7 @@ export const refreshCartShippingMethodsWorkflow = createWorkflow( name: refreshCartShippingMethodsWorkflowId, idempotent: false, }, - (input: WorkflowData) => { + (input: WorkflowData) => { const shouldExecute = transform({ input }, ({ input }) => { return ( !!input.cart_id || @@ -133,6 +134,7 @@ export const refreshCartShippingMethodsWorkflow = createWorkflow( options: listShippingOptionsInput, cart_id: cart.id, is_return: false, + additional_data: input.additional_data }, }) diff --git a/packages/core/core-flows/src/cart/workflows/transfer-cart-customer.ts b/packages/core/core-flows/src/cart/workflows/transfer-cart-customer.ts index 975d5e64d0..d6c5e7fa75 100644 --- a/packages/core/core-flows/src/cart/workflows/transfer-cart-customer.ts +++ b/packages/core/core-flows/src/cart/workflows/transfer-cart-customer.ts @@ -12,6 +12,7 @@ import { emitEventStep, useQueryGraphStep } from "../../common" import { acquireLockStep, releaseLockStep } from "../../locking" import { updateCartsStep } from "../steps" import { refreshCartItemsWorkflow } from "./refresh-cart-items" +import { AdditionalData } from "@medusajs/types" /** * The cart ownership transfer details. @@ -55,7 +56,7 @@ export const transferCartCustomerWorkflow = createWorkflow( name: transferCartCustomerWorkflowId, idempotent: false, }, - (input: WorkflowData) => { + (input: WorkflowData) => { const cartQuery = useQueryGraphStep({ entity: "cart", filters: { id: input.id }, @@ -121,7 +122,7 @@ export const transferCartCustomerWorkflow = createWorkflow( updateCartsStep(cartInput) refreshCartItemsWorkflow.runAsStep({ - input: { cart_id: input.id, force_refresh: true }, + input: { cart_id: input.id, force_refresh: true, additional_data: input.additional_data }, }) parallelize( diff --git a/packages/core/core-flows/src/cart/workflows/update-cart.ts b/packages/core/core-flows/src/cart/workflows/update-cart.ts index e62214bf61..c55c627566 100644 --- a/packages/core/core-flows/src/cart/workflows/update-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/update-cart.ts @@ -1,13 +1,5 @@ -import { - AdditionalData, - CartDTO, - UpdateCartWorkflowInputDTO, -} from "@medusajs/framework/types" -import { - CartWorkflowEvents, - isDefined, - MedusaError, -} from "@medusajs/framework/utils" +import { AdditionalData, CartDTO, UpdateCartWorkflowInputDTO, } from "@medusajs/framework/types" +import { CartWorkflowEvents, isDefined, MedusaError, } from "@medusajs/framework/utils" import { createHook, createWorkflow, @@ -20,11 +12,7 @@ import { import { emitEventStep, useQueryGraphStep } from "../../common" import { deleteLineItemsStep } from "../../line-item" import { acquireLockStep, releaseLockStep } from "../../locking" -import { - findOrCreateCustomerStep, - findSalesChannelStep, - updateCartsStep, -} from "../steps" +import { findOrCreateCustomerStep, findSalesChannelStep, updateCartsStep, } from "../steps" import { validateSalesChannelStep } from "../steps/validate-sales-channel" import { refreshCartItemsWorkflow } from "./refresh-cart-items" @@ -309,6 +297,7 @@ export const updateCartWorkflow = createWorkflow( cart_id: cartInput.id, promo_codes: input.promo_codes, force_refresh: !!newRegion, + additional_data: input.additional_data, }, }) diff --git a/packages/core/core-flows/src/cart/workflows/update-line-item-in-cart.ts b/packages/core/core-flows/src/cart/workflows/update-line-item-in-cart.ts index ddd8c7085a..dfe24218c5 100644 --- a/packages/core/core-flows/src/cart/workflows/update-line-item-in-cart.ts +++ b/packages/core/core-flows/src/cart/workflows/update-line-item-in-cart.ts @@ -10,9 +10,9 @@ import { deduplicate, filterObjectByKeys, isDefined, + MathBN, MedusaError, QueryContext, - MathBN, } from "@medusajs/framework/utils" import { createHook, @@ -205,6 +205,7 @@ export const updateLineItemInCartWorkflow = createWorkflow( input: { cart_id: input.cart_id, ids: [input.item_id], + additional_data: input.additional_data, }, }) }) @@ -303,7 +304,7 @@ export const updateLineItemInCartWorkflow = createWorkflow( updateLineItemsStepWithSelector(lineItemUpdate) refreshCartItemsWorkflow.runAsStep({ - input: { cart_id: input.cart_id }, + input: { cart_id: input.cart_id, additional_data: input.additional_data }, }) }) diff --git a/packages/core/core-flows/src/line-item/workflows/delete-line-items.ts b/packages/core/core-flows/src/line-item/workflows/delete-line-items.ts index b8637ea523..1d95ac43ea 100644 --- a/packages/core/core-flows/src/line-item/workflows/delete-line-items.ts +++ b/packages/core/core-flows/src/line-item/workflows/delete-line-items.ts @@ -1,7 +1,8 @@ -import { WorkflowData, createWorkflow } from "@medusajs/framework/workflows-sdk" +import { createWorkflow, WorkflowData } from "@medusajs/framework/workflows-sdk" import { refreshCartItemsWorkflow } from "../../cart/workflows/refresh-cart-items" import { acquireLockStep, releaseLockStep } from "../../locking" import { deleteLineItemsStep } from "../steps/delete-line-items" +import { AdditionalData } from "@medusajs/types" /** * The data to delete line items from a cart. @@ -43,7 +44,7 @@ export const deleteLineItemsWorkflow = createWorkflow( name: deleteLineItemsWorkflowId, idempotent: false, }, - (input: WorkflowData) => { + (input: WorkflowData) => { acquireLockStep({ key: input.cart_id, timeout: 2, @@ -54,7 +55,7 @@ export const deleteLineItemsWorkflow = createWorkflow( deleteLineItemsStep(input.ids) refreshCartItemsWorkflow.runAsStep({ - input: { cart_id: input.cart_id }, + input: { cart_id: input.cart_id, additional_data: input.additional_data }, }) releaseLockStep({ diff --git a/packages/medusa/src/api/store/carts/[id]/customer/route.ts b/packages/medusa/src/api/store/carts/[id]/customer/route.ts index 04921567b7..a9c66b8505 100644 --- a/packages/medusa/src/api/store/carts/[id]/customer/route.ts +++ b/packages/medusa/src/api/store/carts/[id]/customer/route.ts @@ -7,9 +7,11 @@ import { } from "@medusajs/framework/http" import { Modules } from "@medusajs/framework/utils" import { refetchCart } from "../../helpers" +import { StoreUpdateCartCustomerType } from "../../validators" +import { AdditionalData } from "@medusajs/types" export const POST = async ( - req: AuthenticatedMedusaRequest, + req: AuthenticatedMedusaRequest, res: MedusaResponse ) => { const we = req.scope.resolve(Modules.WORKFLOW_ENGINE) @@ -18,6 +20,7 @@ export const POST = async ( input: { id: req.params.id, customer_id: req.auth_context?.actor_id, + additional_data: req.validatedBody.additional_data, }, transactionId: "cart-transfer-customer-" + req.params.id, }) diff --git a/packages/medusa/src/api/store/carts/[id]/line-items/[line_id]/route.ts b/packages/medusa/src/api/store/carts/[id]/line-items/[line_id]/route.ts index 852e4081df..d83353ee9b 100644 --- a/packages/medusa/src/api/store/carts/[id]/line-items/[line_id]/route.ts +++ b/packages/medusa/src/api/store/carts/[id]/line-items/[line_id]/route.ts @@ -3,13 +3,13 @@ import { updateLineItemInCartWorkflowId, } from "@medusajs/core-flows" import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { HttpTypes } from "@medusajs/framework/types" +import { AdditionalData, HttpTypes } from "@medusajs/framework/types" import { Modules } from "@medusajs/framework/utils" import { refetchCart } from "../../../helpers" import { StoreUpdateCartLineItemType } from "../../../validators" export const POST = async ( - req: MedusaRequest, + req: MedusaRequest, res: MedusaResponse ) => { const we = req.scope.resolve(Modules.WORKFLOW_ENGINE) @@ -18,6 +18,7 @@ export const POST = async ( cart_id: req.params.id, item_id: req.params.line_id, update: req.validatedBody, + additional_data: req.validatedBody.additional_data, }, transactionId: "cart-update-item-" + req.params.id, }) @@ -39,7 +40,10 @@ export const DELETE = async ( const we = req.scope.resolve(Modules.WORKFLOW_ENGINE) await we.run(deleteLineItemsWorkflowId, { - input: { cart_id: req.params.id, ids: [id] }, + input: { + cart_id: req.params.id, + ids: [id], + }, transactionId: "cart-delete-item-" + req.params.id, }) diff --git a/packages/medusa/src/api/store/carts/[id]/line-items/route.ts b/packages/medusa/src/api/store/carts/[id]/line-items/route.ts index 69e6253c1c..18007534ca 100644 --- a/packages/medusa/src/api/store/carts/[id]/line-items/route.ts +++ b/packages/medusa/src/api/store/carts/[id]/line-items/route.ts @@ -4,9 +4,10 @@ import { HttpTypes } from "@medusajs/framework/types" import { Modules } from "@medusajs/utils" import { refetchCart } from "../../helpers" import { StoreAddCartLineItemType } from "../../validators" +import { AdditionalData } from "@medusajs/types" export const POST = async ( - req: MedusaRequest, + req: MedusaRequest, res: MedusaResponse ) => { const we = req.scope.resolve(Modules.WORKFLOW_ENGINE) @@ -14,6 +15,7 @@ export const POST = async ( input: { cart_id: req.params.id, items: [req.validatedBody], + additional_data: req.validatedBody.additional_data, }, transactionId: "cart-add-item-" + req.params.id, }) diff --git a/packages/medusa/src/api/store/carts/[id]/route.ts b/packages/medusa/src/api/store/carts/[id]/route.ts index d2fc6bbd9a..819d511132 100644 --- a/packages/medusa/src/api/store/carts/[id]/route.ts +++ b/packages/medusa/src/api/store/carts/[id]/route.ts @@ -34,6 +34,7 @@ export const POST = async ( input: { ...req.validatedBody, id: req.params.id, + additional_data: req.validatedBody.additional_data, }, transactionId: "cart-update-" + req.params.id, }) diff --git a/packages/medusa/src/api/store/carts/[id]/shipping-methods/route.ts b/packages/medusa/src/api/store/carts/[id]/shipping-methods/route.ts index ff3a4579a6..741424d4ab 100644 --- a/packages/medusa/src/api/store/carts/[id]/shipping-methods/route.ts +++ b/packages/medusa/src/api/store/carts/[id]/shipping-methods/route.ts @@ -1,11 +1,11 @@ import { addShippingMethodToCartWorkflow } from "@medusajs/core-flows" import { MedusaRequest, MedusaResponse } from "@medusajs/framework/http" -import { HttpTypes } from "@medusajs/framework/types" +import { AdditionalData, HttpTypes } from "@medusajs/framework/types" import { refetchCart } from "../../helpers" import { StoreAddCartShippingMethodsType } from "../../validators" export const POST = async ( - req: MedusaRequest, + req: MedusaRequest, res: MedusaResponse ) => { const payload = req.validatedBody @@ -14,6 +14,7 @@ export const POST = async ( input: { options: [{ id: payload.option_id, data: payload.data }], cart_id: req.params.id, + additional_data: payload.additional_data, }, })