1 parent
884428a1b5
commit
ede221d4f7
13 files changed
+199
-3
No files matched your search
@@ -0,0 +1,59 @@
|
|||||||
|
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",
|
||||||
|
})
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
@@ -7,6 +7,8 @@ import { getContainer } from "../../../../environment-helpers/use-container"
|
|||||||
import { initDb, useDb } from "../../../../environment-helpers/use-db"
|
import { initDb, useDb } from "../../../../environment-helpers/use-db"
|
||||||
import adminSeeder from "../../../../helpers/admin-seeder"
|
import adminSeeder from "../../../../helpers/admin-seeder"
|
||||||
|
|
||||||
|
jest.setTimeout(50000)
|
||||||
|
|
||||||
const env = { MEDUSA_FF_MEDUSA_V2: true }
|
const env = { MEDUSA_FF_MEDUSA_V2: true }
|
||||||
const adminHeaders = {
|
const adminHeaders = {
|
||||||
headers: { "x-medusa-access-token": "test_token" },
|
headers: { "x-medusa-access-token": "test_token" },
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import { getContainer } from "../../../../environment-helpers/use-container"
|
|||||||
import { initDb, useDb } from "../../../../environment-helpers/use-db"
|
import { initDb, useDb } from "../../../../environment-helpers/use-db"
|
||||||
import adminSeeder from "../../../../helpers/admin-seeder"
|
import adminSeeder from "../../../../helpers/admin-seeder"
|
||||||
|
|
||||||
|
jest.setTimeout(50000)
|
||||||
|
|
||||||
const env = { MEDUSA_FF_MEDUSA_V2: true }
|
const env = { MEDUSA_FF_MEDUSA_V2: true }
|
||||||
const adminHeaders = {
|
const adminHeaders = {
|
||||||
headers: { "x-medusa-access-token": "test_token" },
|
headers: { "x-medusa-access-token": "test_token" },
|
||||||
|
|||||||
+2
@@ -7,6 +7,8 @@ import { getContainer } from "../../../../environment-helpers/use-container"
|
|||||||
import { initDb, useDb } from "../../../../environment-helpers/use-db"
|
import { initDb, useDb } from "../../../../environment-helpers/use-db"
|
||||||
import adminSeeder from "../../../../helpers/admin-seeder"
|
import adminSeeder from "../../../../helpers/admin-seeder"
|
||||||
|
|
||||||
|
jest.setTimeout(50000)
|
||||||
|
|
||||||
const env = { MEDUSA_FF_MEDUSA_V2: true }
|
const env = { MEDUSA_FF_MEDUSA_V2: true }
|
||||||
const adminHeaders = {
|
const adminHeaders = {
|
||||||
headers: { "x-medusa-access-token": "test_token" },
|
headers: { "x-medusa-access-token": "test_token" },
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import { initModules } from "medusa-test-utils"
|
|||||||
import { MikroOrmWrapper } from "../../../utils"
|
import { MikroOrmWrapper } from "../../../utils"
|
||||||
import { getInitModuleConfig } from "../../../utils/get-init-module-config"
|
import { getInitModuleConfig } from "../../../utils/get-init-module-config"
|
||||||
|
|
||||||
jest.setTimeout(30000)
|
jest.setTimeout(50000)
|
||||||
|
|
||||||
describe("Cart Module Service", () => {
|
describe("Cart Module Service", () => {
|
||||||
let service: ICartModuleService
|
let service: ICartModuleService
|
||||||
|
|||||||
@@ -1 +1,4 @@
|
|||||||
export * from "./create-cart"
|
export * from "./create-cart"
|
||||||
|
export * from "./steps"
|
||||||
|
export * from "./workflows"
|
||||||
|
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
import { ModuleRegistrationName } from "@medusajs/modules-sdk"
|
||||||
|
import { CreateCartDTO, ICartModuleService } from "@medusajs/types"
|
||||||
|
import { StepResponse, createStep } from "@medusajs/workflows-sdk"
|
||||||
|
|
||||||
|
export const createCartsStepId = "create-carts"
|
||||||
|
export const createCartsStep = createStep(
|
||||||
|
createCartsStepId,
|
||||||
|
async (data: CreateCartDTO[], { container }) => {
|
||||||
|
const service = container.resolve<ICartModuleService>(
|
||||||
|
ModuleRegistrationName.CART
|
||||||
|
)
|
||||||
|
|
||||||
|
const createdCarts = await service.create(data)
|
||||||
|
|
||||||
|
return new StepResponse(
|
||||||
|
createdCarts,
|
||||||
|
createdCarts.map((cart) => cart.id)
|
||||||
|
)
|
||||||
|
},
|
||||||
|
async (createdCartsIds, { container }) => {
|
||||||
|
if (!createdCartsIds?.length) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
const service = container.resolve<ICartModuleService>(
|
||||||
|
ModuleRegistrationName.CART
|
||||||
|
)
|
||||||
|
|
||||||
|
await service.delete(createdCartsIds)
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
export * from "./create-carts";
|
||||||
|
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
import { CartDTO, CreateCartDTO } from "@medusajs/types"
|
||||||
|
import { WorkflowData, createWorkflow } from "@medusajs/workflows-sdk"
|
||||||
|
import { createCartsStep } from "../steps"
|
||||||
|
|
||||||
|
type WorkflowInput = { cartData: CreateCartDTO[] }
|
||||||
|
|
||||||
|
export const createCartsWorkflowId = "create-carts"
|
||||||
|
export const createCartsWorkflow = createWorkflow(
|
||||||
|
createCartsWorkflowId,
|
||||||
|
(input: WorkflowData<WorkflowInput>): WorkflowData<CartDTO[]> => {
|
||||||
|
return createCartsStep(input.cartData)
|
||||||
|
}
|
||||||
|
)
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
export * from "./create-carts";
|
||||||
|
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
import { transformQuery } from "../../../api/middlewares"
|
import { transformBody, transformQuery } from "../../../api/middlewares"
|
||||||
import { MiddlewareRoute } from "../../../loaders/helpers/routing/types"
|
import { MiddlewareRoute } from "../../../loaders/helpers/routing/types"
|
||||||
import * as QueryConfig from "./query-config"
|
import * as QueryConfig from "./query-config"
|
||||||
import { StoreGetCartsCartParams } from "./validators"
|
import { StoreGetCartsCartParams, StorePostCartReq } from "./validators"
|
||||||
|
|
||||||
export const storeCartRoutesMiddlewares: MiddlewareRoute[] = [
|
export const storeCartRoutesMiddlewares: MiddlewareRoute[] = [
|
||||||
{
|
{
|
||||||
@@ -14,4 +14,9 @@ export const storeCartRoutesMiddlewares: MiddlewareRoute[] = [
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
method: ["POST"],
|
||||||
|
matcher: "/store/carts",
|
||||||
|
middlewares: [transformBody(StorePostCartReq)],
|
||||||
|
},
|
||||||
]
|
]
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
import { createCartsWorkflow } from "@medusajs/core-flows"
|
||||||
|
import { CreateCartDTO } from "@medusajs/types"
|
||||||
|
import { MedusaRequest, MedusaResponse } from "../../../types/routing"
|
||||||
|
|
||||||
|
export const POST = async (req: MedusaRequest, res: MedusaResponse) => {
|
||||||
|
const createCartWorkflow = createCartsWorkflow(req.scope)
|
||||||
|
const cartData = [
|
||||||
|
{
|
||||||
|
...(req.validatedBody as CreateCartDTO),
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
const { result, errors } = await createCartWorkflow.run({
|
||||||
|
input: { cartData },
|
||||||
|
throwOnError: false,
|
||||||
|
})
|
||||||
|
|
||||||
|
if (Array.isArray(errors) && errors[0]) {
|
||||||
|
throw errors[0].error
|
||||||
|
}
|
||||||
|
|
||||||
|
res.status(200).json({ cart: result[0] })
|
||||||
|
}
|
||||||
@@ -1,3 +1,55 @@
|
|||||||
|
import { Type } from "class-transformer"
|
||||||
|
import {
|
||||||
|
IsArray,
|
||||||
|
IsInt,
|
||||||
|
IsNotEmpty,
|
||||||
|
IsObject,
|
||||||
|
IsOptional,
|
||||||
|
IsString,
|
||||||
|
ValidateNested,
|
||||||
|
} from "class-validator"
|
||||||
import { FindParams } from "../../../types/common"
|
import { FindParams } from "../../../types/common"
|
||||||
|
|
||||||
export class StoreGetCartsCartParams extends FindParams {}
|
export class StoreGetCartsCartParams extends FindParams {}
|
||||||
|
|
||||||
|
export class Item {
|
||||||
|
@IsNotEmpty()
|
||||||
|
@IsString()
|
||||||
|
variant_id: string
|
||||||
|
|
||||||
|
@IsNotEmpty()
|
||||||
|
@IsInt()
|
||||||
|
quantity: number
|
||||||
|
}
|
||||||
|
|
||||||
|
export class StorePostCartReq {
|
||||||
|
@IsOptional()
|
||||||
|
@IsString()
|
||||||
|
region_id?: string
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@IsString()
|
||||||
|
customer_id?: string
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@IsString()
|
||||||
|
email?: string
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@IsString()
|
||||||
|
currency_code?: string
|
||||||
|
|
||||||
|
@IsOptional()
|
||||||
|
@IsArray()
|
||||||
|
@ValidateNested({ each: true })
|
||||||
|
@Type(() => Item)
|
||||||
|
items?: Item[]
|
||||||
|
|
||||||
|
@IsString()
|
||||||
|
@IsOptional()
|
||||||
|
sales_channel_id?: string
|
||||||
|
|
||||||
|
@IsObject()
|
||||||
|
@IsOptional()
|
||||||
|
metadata?: Record<string, unknown>
|
||||||
|
}
|
||||||
Reference in new issue
Block a user