From 3113d8024fdeb09230675c2053fcefe811e575fd Mon Sep 17 00:00:00 2001 From: josetr <37419832+josetr@users.noreply.github.com> Date: Tue, 20 Dec 2022 17:37:42 +0000 Subject: [PATCH] feat(medusa): Allow creating DraftOrders without items (#2719) --- .changeset/good-needles-shave.md | 5 ++++ .../admin/draft-order/draft-order.js | 24 +++++++++++++++++++ .../admin/draft-orders/create-draft-order.ts | 4 ++-- .../src/services/__tests__/draft-order.js | 17 +++++-------- packages/medusa/src/services/draft-order.ts | 9 +------ packages/medusa/src/types/draft-orders.ts | 2 +- 6 files changed, 39 insertions(+), 22 deletions(-) create mode 100644 .changeset/good-needles-shave.md diff --git a/.changeset/good-needles-shave.md b/.changeset/good-needles-shave.md new file mode 100644 index 0000000000..54b4eb1b26 --- /dev/null +++ b/.changeset/good-needles-shave.md @@ -0,0 +1,5 @@ +--- +"@medusajs/medusa": patch +--- + +feat(medusa): Create draft orders without items diff --git a/integration-tests/api/__tests__/admin/draft-order/draft-order.js b/integration-tests/api/__tests__/admin/draft-order/draft-order.js index a2150696e3..695f647a32 100644 --- a/integration-tests/api/__tests__/admin/draft-order/draft-order.js +++ b/integration-tests/api/__tests__/admin/draft-order/draft-order.js @@ -381,6 +381,30 @@ describe("/admin/draft-orders", () => { expect(response.status).toEqual(200) }) + it("creates a draft order without a single item", async () => { + const api = useApi() + + const payload = { + email: "oli@test.dk", + shipping_address: "oli-shipping", + region_id: "test-region", + customer_id: "oli-test", + shipping_methods: [ + { + option_id: "test-option", + }, + ], + } + + const response = await api.post( + "/admin/draft-orders", + payload, + adminReqConfig + ) + expect(response.data.draft_order.cart.items).toEqual([]) + expect(response.status).toEqual(200) + }) + it("creates a draft order with product variant with custom price and custom item price set to 0", async () => { const api = useApi() diff --git a/packages/medusa/src/api/routes/admin/draft-orders/create-draft-order.ts b/packages/medusa/src/api/routes/admin/draft-orders/create-draft-order.ts index faa7489f13..f80521f24a 100644 --- a/packages/medusa/src/api/routes/admin/draft-orders/create-draft-order.ts +++ b/packages/medusa/src/api/routes/admin/draft-orders/create-draft-order.ts @@ -39,7 +39,6 @@ import { IsType } from "../../../../utils/validators/is-type" * type: object * required: * - email - * - items * - region_id * - shipping_methods * properties: @@ -270,7 +269,8 @@ export class AdminPostDraftOrdersReq { @Type(() => Item) @IsNotEmpty() @ValidateNested({ each: true }) - items: Item[] + @IsOptional() + items?: Item[] @IsString() region_id: string diff --git a/packages/medusa/src/services/__tests__/draft-order.js b/packages/medusa/src/services/__tests__/draft-order.js index 9dec9c3bf1..2ade8a28a3 100644 --- a/packages/medusa/src/services/__tests__/draft-order.js +++ b/packages/medusa/src/services/__tests__/draft-order.js @@ -209,17 +209,12 @@ describe("DraftOrderService", () => { } }) - it("fails on missing items", async () => { - try { - await draftOrderService.create({ - region_id: "test-region", - items: [], - }) - } catch (error) { - expect(error.message).toEqual( - `Items are required to create a draft order` - ) - } + it("creating a draft order without items is allowed", async () => { + await draftOrderService.create({ + region_id: "test-region", + items: [], + shipping_methods: [] + }) }) }) diff --git a/packages/medusa/src/services/draft-order.ts b/packages/medusa/src/services/draft-order.ts index 58a7451c41..21ba6e2628 100644 --- a/packages/medusa/src/services/draft-order.ts +++ b/packages/medusa/src/services/draft-order.ts @@ -259,13 +259,6 @@ class DraftOrderService extends TransactionBaseService { ) } - if (!data.items || !data.items.length) { - throw new MedusaError( - MedusaError.Types.INVALID_DATA, - `Items are required to create a draft order` - ) - } - const { shipping_methods, no_notification_order, @@ -310,7 +303,7 @@ class DraftOrderService extends TransactionBaseService { const lineItemServiceTx = this.lineItemService_.withTransaction(transactionManager) - for (const item of items) { + for (const item of (items || [])) { if (item.variant_id) { const line = await lineItemServiceTx.generate( item.variant_id, diff --git a/packages/medusa/src/types/draft-orders.ts b/packages/medusa/src/types/draft-orders.ts index 0d449cbb81..533ff102d1 100644 --- a/packages/medusa/src/types/draft-orders.ts +++ b/packages/medusa/src/types/draft-orders.ts @@ -9,7 +9,7 @@ export type DraftOrderCreateProps = { billing_address?: Partial shipping_address_id?: string shipping_address?: Partial - items: Item[] + items?: Item[] region_id: string discounts?: Discount[] customer_id?: string