diff --git a/.changeset/violet-masks-do.md b/.changeset/violet-masks-do.md new file mode 100644 index 0000000000000..2ee85a5c83f35 --- /dev/null +++ b/.changeset/violet-masks-do.md @@ -0,0 +1,9 @@ +--- +"@medusajs/medusa": patch +"@medusajs/core-flows": patch +"@medusajs/link-modules": patch +"@medusajs/modules-sdk": patch +"@medusajs/types": patch +--- + +feat: CartRegion link, definition + workflow diff --git a/integration-tests/plugins/__tests__/cart/store/create-cart.spec.ts b/integration-tests/plugins/__tests__/cart/store/create-cart.spec.ts new file mode 100644 index 0000000000000..4a1ef297a2ff0 --- /dev/null +++ b/integration-tests/plugins/__tests__/cart/store/create-cart.spec.ts @@ -0,0 +1,166 @@ +import { ModuleRegistrationName } from "@medusajs/modules-sdk" +import { ICartModuleService, IRegionModuleService } from "@medusajs/types" +import path from "path" +import { startBootstrapApp } from "../../../../environment-helpers/bootstrap-app" +import { useApi } from "../../../../environment-helpers/use-api" +import { getContainer } from "../../../../environment-helpers/use-container" +import { initDb, useDb } from "../../../../environment-helpers/use-db" +import adminSeeder from "../../../../helpers/admin-seeder" + +jest.setTimeout(50000) + +const env = { MEDUSA_FF_MEDUSA_V2: true } + +describe("POST /store/carts", () => { + let dbConnection + let appContainer + let shutdownServer + let cartModuleService: ICartModuleService + let regionModuleService: IRegionModuleService + + beforeAll(async () => { + const cwd = path.resolve(path.join(__dirname, "..", "..", "..")) + dbConnection = await initDb({ cwd, env } as any) + shutdownServer = await startBootstrapApp({ cwd, env }) + appContainer = getContainer() + cartModuleService = appContainer.resolve(ModuleRegistrationName.CART) + regionModuleService = appContainer.resolve(ModuleRegistrationName.REGION) + }) + + afterAll(async () => { + const db = useDb() + await db.shutdown() + await shutdownServer() + }) + + beforeEach(async () => { + await adminSeeder(dbConnection) + + // @ts-ignore + await regionModuleService.createDefaultCountriesAndCurrencies() + }) + + afterEach(async () => { + const db = useDb() + await db.teardown() + }) + + it("should create a cart", async () => { + const region = await regionModuleService.create({ + name: "US", + currency_code: "usd", + }) + + const api = useApi() as any + const response = await api.post(`/store/carts`, { + email: "tony@stark.com", + currency_code: "usd", + region_id: region.id, + }) + + expect(response.status).toEqual(200) + expect(response.data.cart).toEqual( + expect.objectContaining({ + id: response.data.cart.id, + currency_code: "usd", + email: "tony@stark.com", + region: expect.objectContaining({ + id: region.id, + currency_code: "usd", + }), + }) + ) + }) + + it("should use any region", async () => { + await regionModuleService.create({ + name: "US", + currency_code: "usd", + }) + + const api = useApi() as any + const response = await api.post(`/store/carts`, { + email: "tony@stark.com", + currency_code: "usd", + }) + + expect(response.status).toEqual(200) + expect(response.data.cart).toEqual( + expect.objectContaining({ + id: response.data.cart.id, + currency_code: "usd", + email: "tony@stark.com", + region: expect.objectContaining({ + id: expect.any(String), + }), + }) + ) + }) + + it("should use region currency code", async () => { + await regionModuleService.create({ + name: "US", + currency_code: "usd", + }) + + const api = useApi() as any + const response = await api.post(`/store/carts`, { + email: "tony@stark.com", + }) + + expect(response.status).toEqual(200) + expect(response.data.cart).toEqual( + expect.objectContaining({ + id: response.data.cart.id, + currency_code: "usd", + email: "tony@stark.com", + region: expect.objectContaining({ + id: expect.any(String), + }), + }) + ) + }) + + it("should throw when no regions exist", async () => { + const api = useApi() as any + + await expect( + api.post(`/store/carts`, { + email: "tony@stark.com", + currency_code: "usd", + }) + ).rejects.toThrow() + }) + + it("should create a cart", async () => { + const region = await regionModuleService.create({ + name: "US", + currency_code: "usd", + }) + + await regionModuleService.create({ + name: "Europe", + currency_code: "eur", + }) + + const api = useApi() as any + const response = await api.post(`/store/carts`, { + email: "tony@stark.com", + currency_code: "usd", + region_id: region.id, + }) + + expect(response.status).toEqual(200) + expect(response.data.cart).toEqual( + expect.objectContaining({ + id: response.data.cart.id, + currency_code: "usd", + email: "tony@stark.com", + region: expect.objectContaining({ + id: region.id, + currency_code: "usd", + }), + }) + ) + }) +}) diff --git a/integration-tests/plugins/__tests__/cart/store/create-cart.ts b/integration-tests/plugins/__tests__/cart/store/create-cart.ts deleted file mode 100644 index b41e3c8a9cd44..0000000000000 --- a/integration-tests/plugins/__tests__/cart/store/create-cart.ts +++ /dev/null @@ -1,59 +0,0 @@ -import { ModuleRegistrationName } from "@medusajs/modules-sdk" -import { ICartModuleService } from "@medusajs/types" -import path from "path" -import { startBootstrapApp } from "../../../../environment-helpers/bootstrap-app" -import { useApi } from "../../../../environment-helpers/use-api" -import { getContainer } from "../../../../environment-helpers/use-container" -import { initDb, useDb } from "../../../../environment-helpers/use-db" -import adminSeeder from "../../../../helpers/admin-seeder" - -jest.setTimeout(50000) - -const env = { MEDUSA_FF_MEDUSA_V2: true } - -describe("POST /store/carts", () => { - let dbConnection - let appContainer - let shutdownServer - let cartModuleService: ICartModuleService - - beforeAll(async () => { - const cwd = path.resolve(path.join(__dirname, "..", "..", "..")) - dbConnection = await initDb({ cwd, env } as any) - shutdownServer = await startBootstrapApp({ cwd, env }) - appContainer = getContainer() - cartModuleService = appContainer.resolve(ModuleRegistrationName.CART) - }) - - afterAll(async () => { - const db = useDb() - await db.shutdown() - await shutdownServer() - }) - - beforeEach(async () => { - await adminSeeder(dbConnection) - }) - - afterEach(async () => { - const db = useDb() - await db.teardown() - }) - - it("should create a cart", async () => { - const api = useApi() as any - const response = await api.post(`/store/carts`, { - email: "tony@stark.com", - currency_code: "usd", - }) - - expect(response.status).toEqual(200) - expect(response.data.cart).toEqual( - expect.objectContaining({ - id: response.data.cart.id, - currency_code: "usd", - email: "tony@stark.com", - }) - ) - }) -}) diff --git a/integration-tests/plugins/__tests__/link-modules/cart-region.spec.ts b/integration-tests/plugins/__tests__/link-modules/cart-region.spec.ts new file mode 100644 index 0000000000000..ae25bc10a745d --- /dev/null +++ b/integration-tests/plugins/__tests__/link-modules/cart-region.spec.ts @@ -0,0 +1,96 @@ +import { ModuleRegistrationName } from "@medusajs/modules-sdk" +import { ICartModuleService, IRegionModuleService } from "@medusajs/types" +import path from "path" +import { startBootstrapApp } from "../../../environment-helpers/bootstrap-app" +import { getContainer } from "../../../environment-helpers/use-container" +import { initDb, useDb } from "../../../environment-helpers/use-db" + +jest.setTimeout(50000) + +const env = { MEDUSA_FF_MEDUSA_V2: true } + +describe("Link: Cart Region", () => { + let dbConnection + let appContainer + let shutdownServer + let cartModuleService: ICartModuleService + let regionModule: IRegionModuleService + let remoteQuery + + beforeAll(async () => { + const cwd = path.resolve(path.join(__dirname, "..", "..")) + dbConnection = await initDb({ cwd, env } as any) + shutdownServer = await startBootstrapApp({ cwd, env }) + appContainer = getContainer() + cartModuleService = appContainer.resolve(ModuleRegistrationName.CART) + regionModule = appContainer.resolve(ModuleRegistrationName.REGION) + remoteQuery = appContainer.resolve("remoteQuery") + }) + + afterAll(async () => { + const db = useDb() + await db.shutdown() + await shutdownServer() + }) + + beforeEach(async () => { + // @ts-ignore + await regionModule.createDefaultCountriesAndCurrencies() + }) + + afterEach(async () => { + const db = useDb() + await db.teardown() + }) + + it("should query carts and regions with remote query", async () => { + const region = await regionModule.create({ + name: "Region", + currency_code: "usd", + }) + + const cart = await cartModuleService.create({ + email: "tony@stark.com", + currency_code: "usd", + region_id: region.id, + }) + + const carts = await remoteQuery({ + cart: { + fields: ["id"], + region: { + fields: ["id"], + }, + }, + }) + + const regions = await remoteQuery({ + region: { + fields: ["id"], + carts: { + fields: ["id"], + }, + }, + }) + + expect(carts).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: cart.id, + region: expect.objectContaining({ id: region.id }), + }), + ]) + ) + + expect(regions).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + id: region.id, + carts: expect.arrayContaining([ + expect.objectContaining({ id: cart.id }), + ]), + }), + ]) + ) + }) +}) diff --git a/packages/core-flows/src/definition/cart/steps/find-one-or-any-region.ts b/packages/core-flows/src/definition/cart/steps/find-one-or-any-region.ts new file mode 100644 index 0000000000000..0398236b0c5b6 --- /dev/null +++ b/packages/core-flows/src/definition/cart/steps/find-one-or-any-region.ts @@ -0,0 +1,27 @@ +import { ModuleRegistrationName } from "@medusajs/modules-sdk" +import { IRegionModuleService } from "@medusajs/types" +import { StepResponse, createStep } from "@medusajs/workflows-sdk" + +export const findOneOrAnyRegionStepId = "find-one-or-any-region" +export const findOneOrAnyRegionStep = createStep( + findOneOrAnyRegionStepId, + async (data: { regionId?: string }, { container }) => { + const service = container.resolve<IRegionModuleService>( + ModuleRegistrationName.REGION + ) + + if (!data.regionId) { + const regions = await service.list({}) + + if (!regions?.length) { + throw Error("No regions found") + } + + return new StepResponse(regions[0]) + } + + const region = await service.retrieve(data.regionId) + + return new StepResponse(region) + } +) diff --git a/packages/core-flows/src/definition/cart/steps/index.ts b/packages/core-flows/src/definition/cart/steps/index.ts index 92c4628406e3a..f4cf25ebf73d8 100644 --- a/packages/core-flows/src/definition/cart/steps/index.ts +++ b/packages/core-flows/src/definition/cart/steps/index.ts @@ -1,3 +1,4 @@ export * from "./create-carts" +export * from "./find-one-or-any-region" export * from "./update-carts" diff --git a/packages/core-flows/src/definition/cart/workflows/create-carts.ts b/packages/core-flows/src/definition/cart/workflows/create-carts.ts index ce991eead80f0..8c6c3dfd01a5c 100644 --- a/packages/core-flows/src/definition/cart/workflows/create-carts.ts +++ b/packages/core-flows/src/definition/cart/workflows/create-carts.ts @@ -1,13 +1,31 @@ -import { CartDTO, CreateCartDTO } from "@medusajs/types" -import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk" -import { createCartsStep } from "../steps" +import { CartDTO, CreateCartWorkflowInputDTO } from "@medusajs/types" +import { + WorkflowData, + createWorkflow, + transform, +} from "@medusajs/workflows-sdk" +import { createCartsStep, findOneOrAnyRegionStep } from "../steps" -type WorkflowInput = { cartData: CreateCartDTO[] } +type WorkflowInput = CreateCartWorkflowInputDTO -export const createCartsWorkflowId = "create-carts" -export const createCartsWorkflow = createWorkflow( - createCartsWorkflowId, +export const createCartWorkflowId = "create-cart" +export const createCartWorkflow = createWorkflow( + createCartWorkflowId, (input: WorkflowData<WorkflowInput>): WorkflowData<CartDTO[]> => { - return createCartsStep(input.cartData) + const region = findOneOrAnyRegionStep({ + regionId: input.region_id, + }) + + const cartInput = transform({ input, region }, (data) => { + return { + ...data.input, + currency_code: data?.input.currency_code || data.region.currency_code, + region_id: data.region.id, + } + }) + + const cart = createCartsStep([cartInput]) + + return cart } ) diff --git a/packages/link-modules/src/definitions/cart-region.ts b/packages/link-modules/src/definitions/cart-region.ts new file mode 100644 index 0000000000000..7cf54ca1258ff --- /dev/null +++ b/packages/link-modules/src/definitions/cart-region.ts @@ -0,0 +1,28 @@ +import { Modules } from "@medusajs/modules-sdk" +import { ModuleJoinerConfig } from "@medusajs/types" + +export const CartRegion: ModuleJoinerConfig = { + isLink: true, + isReadOnlyLink: true, + extends: [ + { + serviceName: Modules.CART, + relationship: { + serviceName: Modules.REGION, + primaryKey: "id", + foreignKey: "region_id", + alias: "region", + }, + }, + { + serviceName: Modules.REGION, + relationship: { + serviceName: Modules.CART, + primaryKey: "region_id", + foreignKey: "id", + alias: "carts", + isList: true, + }, + }, + ], +} diff --git a/packages/link-modules/src/definitions/index.ts b/packages/link-modules/src/definitions/index.ts index 4c75b587b227b..8bf0ea9e94a5b 100644 --- a/packages/link-modules/src/definitions/index.ts +++ b/packages/link-modules/src/definitions/index.ts @@ -1,8 +1,10 @@ +export * from "./cart-region" +export * from "./cart-sales-channel" export * from "./inventory-level-stock-location" +export * from "./order-sales-channel" +export * from "./product-sales-channel" +export * from "./product-shipping-profile" export * from "./product-variant-inventory-item" export * from "./product-variant-price-set" -export * from "./product-shipping-profile" -export * from "./product-sales-channel" -export * from "./cart-sales-channel" -export * from "./order-sales-channel" export * from "./publishable-api-key-sales-channel" + diff --git a/packages/medusa/src/api-v2/store/carts/[id]/route.ts b/packages/medusa/src/api-v2/store/carts/[id]/route.ts index 42d78120cac9e..be3965c8b3b47 100644 --- a/packages/medusa/src/api-v2/store/carts/[id]/route.ts +++ b/packages/medusa/src/api-v2/store/carts/[id]/route.ts @@ -11,12 +11,11 @@ export const GET = async (req: MedusaRequest, res: MedusaResponse) => { const query = { cart: { - __args: variables, ...defaultStoreCartRemoteQueryObject, }, } - const [cart] = await remoteQuery(query) + const [cart] = await remoteQuery(query, { cart: variables }) res.json({ cart }) } diff --git a/packages/medusa/src/api-v2/store/carts/query-config.ts b/packages/medusa/src/api-v2/store/carts/query-config.ts index dbe313b6812cc..ffc8fb5f8be6d 100644 --- a/packages/medusa/src/api-v2/store/carts/query-config.ts +++ b/packages/medusa/src/api-v2/store/carts/query-config.ts @@ -9,6 +9,7 @@ export const defaultStoreCartFields = [ export const defaultStoreCartRelations = [ "items", + "region", "shipping_address", "billing_address", "shipping_methods", @@ -61,4 +62,7 @@ export const defaultStoreCartRemoteQueryObject = { "phone", ], }, + region: { + fields: ["id", "name", "currency_code"], + }, } diff --git a/packages/medusa/src/api-v2/store/carts/route.ts b/packages/medusa/src/api-v2/store/carts/route.ts index ff46b02506bd1..b32824702e231 100644 --- a/packages/medusa/src/api-v2/store/carts/route.ts +++ b/packages/medusa/src/api-v2/store/carts/route.ts @@ -1,17 +1,13 @@ -import { createCartsWorkflow } from "@medusajs/core-flows" +import { createCartWorkflow } from "@medusajs/core-flows" import { CreateCartDTO } from "@medusajs/types" import { MedusaRequest, MedusaResponse } from "../../../types/routing" +import { defaultStoreCartRemoteQueryObject } from "../carts/query-config" export const POST = async (req: MedusaRequest, res: MedusaResponse) => { - const createCartWorkflow = createCartsWorkflow(req.scope) - const cartData = [ - { - ...(req.validatedBody as CreateCartDTO), - }, - ] + const workflow = createCartWorkflow(req.scope) - const { result, errors } = await createCartWorkflow.run({ - input: { cartData }, + const { result, errors } = await workflow.run({ + input: req.validatedBody as CreateCartDTO, throwOnError: false, }) @@ -19,5 +15,17 @@ export const POST = async (req: MedusaRequest, res: MedusaResponse) => { throw errors[0].error } - res.status(200).json({ cart: result[0] }) + const remoteQuery = req.scope.resolve("remoteQuery") + + const variables = { id: result[0].id } + + const query = { + cart: { + ...defaultStoreCartRemoteQueryObject, + }, + } + + const [cart] = await remoteQuery(query, { cart: variables }) + + res.status(200).json({ cart }) } diff --git a/packages/medusa/src/api/routes/store/carts/create-cart.ts b/packages/medusa/src/api/routes/store/carts/create-cart.ts index 32e471fbb8ced..8b97b3eac11d4 100644 --- a/packages/medusa/src/api/routes/store/carts/create-cart.ts +++ b/packages/medusa/src/api/routes/store/carts/create-cart.ts @@ -1,7 +1,3 @@ -import { - createCart as createCartWorkflow, - Workflows, -} from "@medusajs/core-flows" import { IsArray, IsInt, @@ -10,7 +6,7 @@ import { IsString, ValidateNested, } from "class-validator" -import { isDefined, MedusaError } from "medusa-core-utils" +import { MedusaError, isDefined } from "medusa-core-utils" import { defaultStoreCartFields, defaultStoreCartRelations } from "." import { CartService, @@ -19,7 +15,6 @@ import { RegionService, } from "../../../../services" -import { MedusaContainer } from "@medusajs/modules-sdk" import { FlagRouter } from "@medusajs/utils" import { Type } from "class-transformer" import reqIp from "request-ip" @@ -122,129 +117,95 @@ export default async (req, res) => { user_agent: req.get("user-agent"), } - const isWorkflowEnabled = featureFlagRouter.isFeatureEnabled({ - workflows: Workflows.CreateCart, - }) - - let cart + const lineItemService: LineItemService = req.scope.resolve("lineItemService") + const regionService: RegionService = req.scope.resolve("regionService") - if (isWorkflowEnabled) { - const cartWorkflow = createCartWorkflow(req.scope as MedusaContainer) - const input = { - ...validated, - publishableApiKeyScopes: req.publishableApiKeyScopes, - context: { - ...reqContext, - ...validated.context, - }, - } - const { result, errors } = await cartWorkflow.run({ - input, - context: { - manager: entityManager, - }, - throwOnError: false, - }) - - if (Array.isArray(errors)) { - if (isDefined(errors[0])) { - throw errors[0].error - } - } - - cart = result + let regionId!: string + if (isDefined(validated.region_id)) { + regionId = validated.region_id as string } else { - const lineItemService: LineItemService = - req.scope.resolve("lineItemService") - const regionService: RegionService = req.scope.resolve("regionService") + const regions = await regionService.list({}) - let regionId!: string - if (isDefined(validated.region_id)) { - regionId = validated.region_id as string - } else { - const regions = await regionService.list({}) + if (!regions?.length) { + throw new MedusaError( + MedusaError.Types.INVALID_DATA, + `A region is required to create a cart` + ) + } - if (!regions?.length) { - throw new MedusaError( - MedusaError.Types.INVALID_DATA, - `A region is required to create a cart` - ) - } + regionId = regions[0].id + } - regionId = regions[0].id - } + const toCreate: Partial<CartCreateProps> = { + region_id: regionId, + sales_channel_id: validated.sales_channel_id, + context: { + ...reqContext, + ...validated.context, + }, + } - const toCreate: Partial<CartCreateProps> = { - region_id: regionId, - sales_channel_id: validated.sales_channel_id, - context: { - ...reqContext, - ...validated.context, - }, - } + if (req.user && req.user.customer_id) { + const customerService = req.scope.resolve("customerService") + const customer = await customerService.retrieve(req.user.customer_id) + toCreate["customer_id"] = customer.id + toCreate["email"] = customer.email + } - if (req.user && req.user.customer_id) { - const customerService = req.scope.resolve("customerService") - const customer = await customerService.retrieve(req.user.customer_id) - toCreate["customer_id"] = customer.id - toCreate["email"] = customer.email + if (validated.country_code) { + toCreate["shipping_address"] = { + country_code: validated.country_code.toLowerCase(), } + } - if (validated.country_code) { - toCreate["shipping_address"] = { - country_code: validated.country_code.toLowerCase(), - } + if ( + !toCreate.sales_channel_id && + req.publishableApiKeyScopes?.sales_channel_ids.length + ) { + if (req.publishableApiKeyScopes.sales_channel_ids.length > 1) { + throw new MedusaError( + MedusaError.Types.UNEXPECTED_STATE, + "The PublishableApiKey provided in the request header has multiple associated sales channels." + ) } - if ( - !toCreate.sales_channel_id && - req.publishableApiKeyScopes?.sales_channel_ids.length - ) { - if (req.publishableApiKeyScopes.sales_channel_ids.length > 1) { - throw new MedusaError( - MedusaError.Types.UNEXPECTED_STATE, - "The PublishableApiKey provided in the request header has multiple associated sales channels." - ) - } + toCreate.sales_channel_id = req.publishableApiKeyScopes.sales_channel_ids[0] + } - toCreate.sales_channel_id = - req.publishableApiKeyScopes.sales_channel_ids[0] + let cart = await entityManager.transaction(async (manager) => { + const cartServiceTx = cartService.withTransaction(manager) + const lineItemServiceTx = lineItemService.withTransaction(manager) + + const createdCart = await cartServiceTx.create(toCreate) + + if (validated.items?.length) { + const generateInputData = validated.items.map((item) => { + return { + variantId: item.variant_id, + quantity: item.quantity, + } + }) + const generatedLineItems: LineItem[] = await lineItemServiceTx.generate( + generateInputData, + { + region_id: regionId, + customer_id: req.user?.customer_id, + } + ) + + await cartServiceTx.addOrUpdateLineItems( + createdCart.id, + generatedLineItems, + { + validateSalesChannels: + featureFlagRouter.isFeatureEnabled("sales_channels"), + } + ) } - cart = await entityManager.transaction(async (manager) => { - const cartServiceTx = cartService.withTransaction(manager) - const lineItemServiceTx = lineItemService.withTransaction(manager) - - const createdCart = await cartServiceTx.create(toCreate) - - if (validated.items?.length) { - const generateInputData = validated.items.map((item) => { - return { - variantId: item.variant_id, - quantity: item.quantity, - } - }) - const generatedLineItems: LineItem[] = await lineItemServiceTx.generate( - generateInputData, - { - region_id: regionId, - customer_id: req.user?.customer_id, - } - ) - - await cartServiceTx.addOrUpdateLineItems( - createdCart.id, - generatedLineItems, - { - validateSalesChannels: - featureFlagRouter.isFeatureEnabled("sales_channels"), - } - ) - } - - return createdCart - }) - } + return createdCart + }) + // } cart = await cartService.retrieveWithTotals(cart!.id, { select: defaultStoreCartFields, diff --git a/packages/modules-sdk/src/medusa-app.ts b/packages/modules-sdk/src/medusa-app.ts index ce372e6c49800..124b899078d8c 100644 --- a/packages/modules-sdk/src/medusa-app.ts +++ b/packages/modules-sdk/src/medusa-app.ts @@ -293,16 +293,13 @@ async function MedusaApp_({ allowUnregistered: true, }) - const { - remoteLink, - linkResolution, - runMigrations: linkModuleMigration, - } = await initializeLinks({ - config: linkModuleOptions, - linkModules, - injectedDependencies, - moduleExports: isMedusaModule(linkModule) ? linkModule : undefined, - }) + const { remoteLink, runMigrations: linkModuleMigration } = + await initializeLinks({ + config: linkModuleOptions, + linkModules, + injectedDependencies, + moduleExports: isMedusaModule(linkModule) ? linkModule : undefined, + }) const loadedSchema = getLoadedSchema() const { schema, notFound } = cleanAndMergeSchema(loadedSchema) diff --git a/packages/region/src/module-definition.ts b/packages/region/src/module-definition.ts index cc36daff1d97a..8fc1cafe54e47 100644 --- a/packages/region/src/module-definition.ts +++ b/packages/region/src/module-definition.ts @@ -1,5 +1,5 @@ import { ModuleExports } from "@medusajs/types" -import { RegionModuleService } from "@services" +import { RegionModuleService } from "./services" import { Modules } from "@medusajs/modules-sdk" import { ModulesSdkUtils } from "@medusajs/utils" diff --git a/packages/types/src/cart/index.ts b/packages/types/src/cart/index.ts index a83c8a61ef6d7..dfae9af8a2f1f 100644 --- a/packages/types/src/cart/index.ts +++ b/packages/types/src/cart/index.ts @@ -1,4 +1,4 @@ export * from "./common" export * from "./mutations" export * from "./service" - +export * from "./workflows" diff --git a/packages/types/src/cart/workflows.ts b/packages/types/src/cart/workflows.ts new file mode 100644 index 0000000000000..41df8d2d62d06 --- /dev/null +++ b/packages/types/src/cart/workflows.ts @@ -0,0 +1,20 @@ +import { + CreateAddressDTO, + CreateLineItemDTO, + UpdateAddressDTO, +} from "./mutations" + +export interface CreateCartWorkflowInputDTO { + region_id?: string + customer_id?: string + sales_channel_id?: string + email?: string + currency_code: string + shipping_address_id?: string + billing_address_id?: string + shipping_address?: CreateAddressDTO | UpdateAddressDTO + billing_address?: CreateAddressDTO | UpdateAddressDTO + metadata?: Record<string, unknown> + + items?: CreateLineItemDTO[] +}