From 28a3f9a3dff743c32291835983c0ebacffb10687 Mon Sep 17 00:00:00 2001 From: Stevche Radevski Date: Mon, 27 May 2024 09:37:10 +0200 Subject: [PATCH] feat: Add list cart option typings, make region optional on update cart (#7455) --- .../cart/store/cart.workflows.spec.ts | 6 ++--- .../cart/steps/find-one-or-any-region.ts | 11 ++++++---- .../definition/cart/workflows/create-carts.ts | 9 ++++++++ .../definition/cart/workflows/update-cart.ts | 9 +++++++- .../src/order/workflows/create-orders.ts | 6 ++++- packages/core/js-sdk/src/store/index.ts | 5 +++-- .../core/types/src/http/fulfillment/index.ts | 1 + .../types/src/http/fulfillment/store/index.ts | 22 +++++++++++++++++++ .../src/api/store/orders/query-config.ts | 3 +++ 9 files changed, 60 insertions(+), 12 deletions(-) create mode 100644 packages/core/types/src/http/fulfillment/store/index.ts 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 77f3e0e573..d6e202cbc9 100644 --- a/integration-tests/modules/__tests__/cart/store/cart.workflows.spec.ts +++ b/integration-tests/modules/__tests__/cart/store/cart.workflows.spec.ts @@ -325,11 +325,9 @@ medusaIntegrationTestRunner({ }) expect(errors).toEqual([ - { - action: "find-one-or-any-region", - handlerType: "invoke", + expect.objectContaining({ error: expect.objectContaining({ message: "No regions found" }), - }, + }), ]) }) diff --git a/packages/core/core-flows/src/definition/cart/steps/find-one-or-any-region.ts b/packages/core/core-flows/src/definition/cart/steps/find-one-or-any-region.ts index 3acce38620..ee428dd2e6 100644 --- a/packages/core/core-flows/src/definition/cart/steps/find-one-or-any-region.ts +++ b/packages/core/core-flows/src/definition/cart/steps/find-one-or-any-region.ts @@ -16,9 +16,12 @@ export const findOneOrAnyRegionStep = createStep( ) if (data.regionId) { - const region = await service.retrieve(data.regionId) - - return new StepResponse(region) + try { + const region = await service.retrieve(data.regionId) + return new StepResponse(region) + } catch (error) { + return new StepResponse(null) + } } const [store] = await storeModule.list() @@ -32,7 +35,7 @@ export const findOneOrAnyRegionStep = createStep( }) if (!region) { - throw new MedusaError(MedusaError.Types.INVALID_DATA, "No regions found") + return new StepResponse(null) } return new StepResponse(region) diff --git a/packages/core/core-flows/src/definition/cart/workflows/create-carts.ts b/packages/core/core-flows/src/definition/cart/workflows/create-carts.ts index 5e63eef5c8..1802ba773b 100644 --- a/packages/core/core-flows/src/definition/cart/workflows/create-carts.ts +++ b/packages/core/core-flows/src/definition/cart/workflows/create-carts.ts @@ -20,6 +20,7 @@ import { productVariantsFields } from "../utils/fields" import { prepareLineItemData } from "../utils/prepare-line-item-data" import { confirmVariantInventoryWorkflow } from "./confirm-variant-inventory" import { refreshPaymentCollectionForCartStep } from "./refresh-payment-collection" +import { MedusaError } from "@medusajs/utils" // TODO: The createCartWorkflow are missing the following steps: // - Refresh/delete shipping methods (fulfillment module) @@ -49,6 +50,10 @@ export const createCartWorkflow = createWorkflow( const pricingContext = transform( { input, region, customerData }, (data) => { + if (!data.region) { + throw new MedusaError(MedusaError.Types.NOT_FOUND, "No regions found") + } + return { currency_code: data.input.currency_code ?? data.region.currency_code, region_id: data.region.id, @@ -87,6 +92,10 @@ export const createCartWorkflow = createWorkflow( const cartInput = transform( { input, region, customerData, salesChannel }, (data) => { + if (!data.region) { + throw new MedusaError(MedusaError.Types.NOT_FOUND, "No regions found") + } + const data_ = { ...data.input, currency_code: data.input.currency_code ?? data.region.currency_code, diff --git a/packages/core/core-flows/src/definition/cart/workflows/update-cart.ts b/packages/core/core-flows/src/definition/cart/workflows/update-cart.ts index f6db99a12f..bcc438b7b2 100644 --- a/packages/core/core-flows/src/definition/cart/workflows/update-cart.ts +++ b/packages/core/core-flows/src/definition/cart/workflows/update-cart.ts @@ -1,5 +1,5 @@ import { UpdateCartWorkflowInputDTO } from "@medusajs/types" -import { PromotionActions, isPresent } from "@medusajs/utils" +import { MedusaError, PromotionActions, isPresent } from "@medusajs/utils" import { WorkflowData, createWorkflow, @@ -43,6 +43,13 @@ export const updateCartWorkflow = createWorkflow( const data_ = { ...updateCartData } if (isPresent(updateCartData.region_id)) { + if (!data.region) { + throw new MedusaError( + MedusaError.Types.NOT_FOUND, + "Region not found" + ) + } + data_.currency_code = data.region.currency_code data_.region_id = data.region.id } diff --git a/packages/core/core-flows/src/order/workflows/create-orders.ts b/packages/core/core-flows/src/order/workflows/create-orders.ts index d0bbb1e237..f4aa99e88f 100644 --- a/packages/core/core-flows/src/order/workflows/create-orders.ts +++ b/packages/core/core-flows/src/order/workflows/create-orders.ts @@ -1,5 +1,5 @@ import { CreateOrderDTO, OrderDTO } from "@medusajs/types" -import { MathBN } from "@medusajs/utils" +import { MathBN, MedusaError } from "@medusajs/utils" import { WorkflowData, createWorkflow, @@ -95,6 +95,10 @@ export const createOrdersWorkflow = createWorkflow( const pricingContext = transform( { input, region, customerData }, (data) => { + if (!data.region) { + throw new MedusaError(MedusaError.Types.NOT_FOUND, "Region not found") + } + return { currency_code: data.input.currency_code ?? data.region.currency_code, region_id: data.region.id, diff --git a/packages/core/js-sdk/src/store/index.ts b/packages/core/js-sdk/src/store/index.ts index 7b408824be..c574887baf 100644 --- a/packages/core/js-sdk/src/store/index.ts +++ b/packages/core/js-sdk/src/store/index.ts @@ -252,12 +252,13 @@ export class Store { } public fulfillment = { - // TODO: Finalize typings for list options listCartOptions: async ( query?: FindParams & { cart_id: string }, headers?: ClientHeaders ) => { - return this.client.fetch(`/store/shipping-options`, { + return this.client.fetch<{ + shipping_options: HttpTypes.StoreCartShippingOption[] + }>(`/store/shipping-options`, { headers, query, }) diff --git a/packages/core/types/src/http/fulfillment/index.ts b/packages/core/types/src/http/fulfillment/index.ts index 26b8eb9dad..3bd2bd2cc0 100644 --- a/packages/core/types/src/http/fulfillment/index.ts +++ b/packages/core/types/src/http/fulfillment/index.ts @@ -1 +1,2 @@ export * from "./admin" +export * from "./store" diff --git a/packages/core/types/src/http/fulfillment/store/index.ts b/packages/core/types/src/http/fulfillment/store/index.ts new file mode 100644 index 0000000000..dd787d11a4 --- /dev/null +++ b/packages/core/types/src/http/fulfillment/store/index.ts @@ -0,0 +1,22 @@ +// TODO: The way the cart shipping options are listed now differs from most other endpoints as it is fetched in a workflow. +// We should consider refactoring this to be more consistent with other endpoints. +export interface StoreCartShippingOption { + id: string + name: string + price_type: string + service_zone_id: string + shipping_profile_id: string + provider_id: string + data: Record | null + type: { + id: string + label: string + description: string + code: string + } + provider: { + id: string + is_enabled: boolean + } + amount: number +} diff --git a/packages/medusa/src/api/store/orders/query-config.ts b/packages/medusa/src/api/store/orders/query-config.ts index be9103ff5e..2da1b075f9 100644 --- a/packages/medusa/src/api/store/orders/query-config.ts +++ b/packages/medusa/src/api/store/orders/query-config.ts @@ -5,6 +5,9 @@ export const defaultStoreOrderFields = [ "status", "version", "summary", + "display_id", + "total", + "currency_code", "metadata", "created_at", "updated_at",