add update-line-item on draft orders
This commit is contained in:
1 parent
862f8282c4
commit
e79b8f6494
7 files changed
+892
-888
No files matched your search
@@ -263,7 +263,7 @@ describe("/admin/draft-orders", () => {
|
|||||||
|
|
||||||
// register system payment for draft order
|
// register system payment for draft order
|
||||||
const orderResponse = await api.post(
|
const orderResponse = await api.post(
|
||||||
`/admin/draft-orders/test-draft-order/register-payment`,
|
`/admin/draft-orders/test-draft-order/pay`,
|
||||||
{},
|
{},
|
||||||
{
|
{
|
||||||
headers: {
|
headers: {
|
||||||
@@ -431,12 +431,14 @@ describe("/admin/draft-orders", () => {
|
|||||||
await manager.query(`DELETE FROM "product"`);
|
await manager.query(`DELETE FROM "product"`);
|
||||||
await manager.query(`DELETE FROM "shipping_method"`);
|
await manager.query(`DELETE FROM "shipping_method"`);
|
||||||
await manager.query(`DELETE FROM "shipping_option"`);
|
await manager.query(`DELETE FROM "shipping_option"`);
|
||||||
|
await manager.query(`UPDATE "discount" SET rule_id=NULL`);
|
||||||
await manager.query(`DELETE FROM "discount"`);
|
await manager.query(`DELETE FROM "discount"`);
|
||||||
|
await manager.query(`DELETE FROM "discount_rule"`);
|
||||||
await manager.query(`DELETE FROM "payment_provider"`);
|
await manager.query(`DELETE FROM "payment_provider"`);
|
||||||
await manager.query(`DELETE FROM "payment_session"`);
|
await manager.query(`DELETE FROM "payment_session"`);
|
||||||
await manager.query(`UPDATE "payment" SET order_id=NULL`);
|
await manager.query(`UPDATE "payment" SET order_id=NULL`);
|
||||||
await manager.query(`DELETE FROM "order"`);
|
|
||||||
await manager.query(`UPDATE "draft_order" SET order_id=NULL`);
|
await manager.query(`UPDATE "draft_order" SET order_id=NULL`);
|
||||||
|
await manager.query(`DELETE FROM "order"`);
|
||||||
await manager.query(`DELETE FROM "draft_order"`);
|
await manager.query(`DELETE FROM "draft_order"`);
|
||||||
await manager.query(`DELETE FROM "cart"`);
|
await manager.query(`DELETE FROM "cart"`);
|
||||||
await manager.query(`DELETE FROM "payment"`);
|
await manager.query(`DELETE FROM "payment"`);
|
||||||
@@ -475,4 +477,218 @@ describe("/admin/draft-orders", () => {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe("POST /admin/draft-orders/:id/line-items/:line_id", () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
try {
|
||||||
|
await adminSeeder(dbConnection);
|
||||||
|
await draftOrderSeeder(dbConnection, { status: "open" });
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
const manager = dbConnection.manager;
|
||||||
|
await manager.query(`DELETE FROM "line_item"`);
|
||||||
|
await manager.query(`DELETE FROM "money_amount"`);
|
||||||
|
await manager.query(`DELETE FROM "product_variant"`);
|
||||||
|
await manager.query(`DELETE FROM "product"`);
|
||||||
|
await manager.query(`DELETE FROM "shipping_method"`);
|
||||||
|
await manager.query(`DELETE FROM "shipping_option"`);
|
||||||
|
await manager.query(`UPDATE "discount" SET rule_id=NULL`);
|
||||||
|
await manager.query(`DELETE FROM "discount"`);
|
||||||
|
await manager.query(`DELETE FROM "discount_rule"`);
|
||||||
|
await manager.query(`DELETE FROM "payment_provider"`);
|
||||||
|
await manager.query(`DELETE FROM "payment_session"`);
|
||||||
|
await manager.query(`UPDATE "payment" SET order_id=NULL`);
|
||||||
|
await manager.query(`UPDATE "draft_order" SET order_id=NULL`);
|
||||||
|
await manager.query(`DELETE FROM "order"`);
|
||||||
|
await manager.query(`DELETE FROM "draft_order"`);
|
||||||
|
await manager.query(`DELETE FROM "cart"`);
|
||||||
|
await manager.query(`DELETE FROM "payment"`);
|
||||||
|
await manager.query(`DELETE FROM "customer"`);
|
||||||
|
await manager.query(`DELETE FROM "address"`);
|
||||||
|
|
||||||
|
await manager.query(
|
||||||
|
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'us'`
|
||||||
|
);
|
||||||
|
await manager.query(
|
||||||
|
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'de'`
|
||||||
|
);
|
||||||
|
await manager.query(`DELETE FROM "region"`);
|
||||||
|
await manager.query(`DELETE FROM "user"`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("updates a line item on the draft order", async () => {
|
||||||
|
const api = useApi();
|
||||||
|
|
||||||
|
const response = await api
|
||||||
|
.post(
|
||||||
|
"/admin/draft-orders/test-draft-order/line-items/test-item",
|
||||||
|
{
|
||||||
|
title: "Update title",
|
||||||
|
unit_price: 1000,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: "Bearer test_token",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(response.status).toEqual(200);
|
||||||
|
|
||||||
|
const updatedDraftOrder = await api.get(
|
||||||
|
`/admin/draft-orders/test-draft-order`,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: "Bearer test_token",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const item = updatedDraftOrder.data.draft_order.cart.items[0];
|
||||||
|
|
||||||
|
expect(item.title).toEqual("Update title");
|
||||||
|
expect(item.unit_price).toEqual(1000);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("removes the line item, if quantity is 0", async () => {
|
||||||
|
const api = useApi();
|
||||||
|
|
||||||
|
const response = await api
|
||||||
|
.post(
|
||||||
|
"/admin/draft-orders/test-draft-order/line-items/test-item",
|
||||||
|
{
|
||||||
|
title: "Update title",
|
||||||
|
quantity: 0,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: "Bearer test_token",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(response.status).toEqual(200);
|
||||||
|
|
||||||
|
const updatedDraftOrder = await api.get(
|
||||||
|
`/admin/draft-orders/test-draft-order`,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: "Bearer test_token",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const items = updatedDraftOrder.data.draft_order.cart.items;
|
||||||
|
|
||||||
|
expect(items).toEqual([]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe("POST /admin/draft-orders/:id", () => {
|
||||||
|
beforeEach(async () => {
|
||||||
|
try {
|
||||||
|
await adminSeeder(dbConnection);
|
||||||
|
await draftOrderSeeder(dbConnection, { status: "open" });
|
||||||
|
} catch (err) {
|
||||||
|
throw err;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
afterEach(async () => {
|
||||||
|
const manager = dbConnection.manager;
|
||||||
|
await manager.query(`DELETE FROM "line_item"`);
|
||||||
|
await manager.query(`DELETE FROM "money_amount"`);
|
||||||
|
await manager.query(`DELETE FROM "product_variant"`);
|
||||||
|
await manager.query(`DELETE FROM "product"`);
|
||||||
|
await manager.query(`DELETE FROM "shipping_method"`);
|
||||||
|
await manager.query(`DELETE FROM "shipping_option"`);
|
||||||
|
await manager.query(`UPDATE "discount" SET rule_id=NULL`);
|
||||||
|
await manager.query(`DELETE FROM "discount"`);
|
||||||
|
await manager.query(`DELETE FROM "discount_rule"`);
|
||||||
|
await manager.query(`DELETE FROM "payment_provider"`);
|
||||||
|
await manager.query(`DELETE FROM "payment_session"`);
|
||||||
|
await manager.query(`UPDATE "payment" SET order_id=NULL`);
|
||||||
|
await manager.query(`UPDATE "draft_order" SET order_id=NULL`);
|
||||||
|
await manager.query(`DELETE FROM "order"`);
|
||||||
|
await manager.query(`DELETE FROM "draft_order"`);
|
||||||
|
await manager.query(`DELETE FROM "cart"`);
|
||||||
|
await manager.query(`DELETE FROM "payment"`);
|
||||||
|
await manager.query(`DELETE FROM "customer"`);
|
||||||
|
await manager.query(`DELETE FROM "address"`);
|
||||||
|
|
||||||
|
await manager.query(
|
||||||
|
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'us'`
|
||||||
|
);
|
||||||
|
await manager.query(
|
||||||
|
`UPDATE "country" SET region_id=NULL WHERE iso_2 = 'de'`
|
||||||
|
);
|
||||||
|
await manager.query(`DELETE FROM "region"`);
|
||||||
|
await manager.query(`DELETE FROM "user"`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("updates a line item on the draft order", async () => {
|
||||||
|
const api = useApi();
|
||||||
|
|
||||||
|
const response = await api
|
||||||
|
.post(
|
||||||
|
"/admin/draft-orders/test-draft-order",
|
||||||
|
{
|
||||||
|
email: "lebron@james.com",
|
||||||
|
billing_address: {
|
||||||
|
first_name: "lebron",
|
||||||
|
last_name: "james",
|
||||||
|
address_1: "hollywood boulevard 1",
|
||||||
|
city: "hollywood",
|
||||||
|
country_code: "us",
|
||||||
|
postal_code: "2100",
|
||||||
|
},
|
||||||
|
shipping_address: {
|
||||||
|
first_name: "lebron",
|
||||||
|
last_name: "james",
|
||||||
|
address_1: "hollywood boulevard 1",
|
||||||
|
city: "hollywood",
|
||||||
|
country_code: "us",
|
||||||
|
postal_code: "2100",
|
||||||
|
},
|
||||||
|
discounts: [{ code: "TEST" }],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: "Bearer test_token",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
)
|
||||||
|
.catch((err) => {
|
||||||
|
console.log(err);
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(response.status).toEqual(200);
|
||||||
|
|
||||||
|
const updatedDraftOrder = await api.get(
|
||||||
|
`/admin/draft-orders/test-draft-order`,
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Authorization: "Bearer test_token",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const dorder = updatedDraftOrder.data.draft_order;
|
||||||
|
|
||||||
|
expect(dorder.cart.email).toEqual("lebron@james.com");
|
||||||
|
expect(dorder.cart.billing_address.first_name).toEqual("lebron");
|
||||||
|
expect(dorder.cart.shipping_address.last_name).toEqual("james");
|
||||||
|
expect(dorder.cart.discounts[0].code).toEqual("TEST");
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
@@ -200,8 +200,6 @@ module.exports = async (connection, data = {}) => {
|
|||||||
status: "pending",
|
status: "pending",
|
||||||
});
|
});
|
||||||
|
|
||||||
// await manager.save(cart);
|
|
||||||
|
|
||||||
const draftOrder = manager.create(DraftOrder, {
|
const draftOrder = manager.create(DraftOrder, {
|
||||||
id: "test-draft-order",
|
id: "test-draft-order",
|
||||||
status: "awaiting",
|
status: "awaiting",
|
||||||
@@ -223,6 +221,7 @@ module.exports = async (connection, data = {}) => {
|
|||||||
email: "oli@test.dk",
|
email: "oli@test.dk",
|
||||||
region_id: "test-region",
|
region_id: "test-region",
|
||||||
discounts: [],
|
discounts: [],
|
||||||
|
...data,
|
||||||
});
|
});
|
||||||
|
|
||||||
await manager.save(draftOrder);
|
await manager.save(draftOrder);
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
"@babel/cli": "^7.12.10",
|
"@babel/cli": "^7.12.10",
|
||||||
"@babel/core": "^7.12.10",
|
"@babel/core": "^7.12.10",
|
||||||
"@babel/node": "^7.12.10",
|
"@babel/node": "^7.12.10",
|
||||||
"babel-preset-medusa-package": "1.1.3-dev-1622110840148",
|
"babel-preset-medusa-package": "1.1.3-dev-1622807663631",
|
||||||
"jest": "^26.6.3"
|
"jest": "^26.6.3"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+544
-879
File diff suppressed because it is too large.
Load diff
@@ -29,10 +29,15 @@ export default app => {
|
|||||||
middlewares.wrap(require("./create-line-item").default)
|
middlewares.wrap(require("./create-line-item").default)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
route.post(
|
||||||
|
"/:id/line-items/:line_id",
|
||||||
|
middlewares.wrap(require("./update-line-item").default)
|
||||||
|
)
|
||||||
|
|
||||||
route.post("/", middlewares.wrap(require("./create-draft-order").default))
|
route.post("/", middlewares.wrap(require("./create-draft-order").default))
|
||||||
|
|
||||||
route.post(
|
route.post(
|
||||||
"/:id/register-payment",
|
"/:id/pay",
|
||||||
middlewares.wrap(require("./register-payment").default)
|
middlewares.wrap(require("./register-payment").default)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -16,9 +16,6 @@ import { defaultCartFields, defaultCartRelations, defaultFields } from "."
|
|||||||
* region_id:
|
* region_id:
|
||||||
* type: string
|
* type: string
|
||||||
* description: The id of the Region to create the Draft Order in.
|
* description: The id of the Region to create the Draft Order in.
|
||||||
* country_code:
|
|
||||||
* type: string
|
|
||||||
* description: "The 2 character ISO country code to create the Draft Order in."
|
|
||||||
* email:
|
* email:
|
||||||
* type: string
|
* type: string
|
||||||
* description: "An email to be used on the Draft Order."
|
* description: "An email to be used on the Draft Order."
|
||||||
@@ -70,6 +67,11 @@ export default async (req, res) => {
|
|||||||
code: Validator.string(),
|
code: Validator.string(),
|
||||||
})
|
})
|
||||||
.optional(),
|
.optional(),
|
||||||
|
gift_cards: Validator.array()
|
||||||
|
.items({
|
||||||
|
code: Validator.string(),
|
||||||
|
})
|
||||||
|
.optional(),
|
||||||
customer_id: Validator.string().optional(),
|
customer_id: Validator.string().optional(),
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,117 @@
|
|||||||
|
import { MedusaError, Validator } from "medusa-core-utils"
|
||||||
|
import { defaultCartFields, defaultCartRelations, defaultFields } from "."
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @oas [post] /draft-orders/{id}/line-items/{line_id}
|
||||||
|
* operationId: "PostDraftOrdersDraftOrderLineItemsItem"
|
||||||
|
* summary: "Update a Line Item for a Draft Order"
|
||||||
|
* description: "Updates a Line Item for a Draft Order"
|
||||||
|
* requestBody:
|
||||||
|
* content:
|
||||||
|
* application/json:
|
||||||
|
* schema:
|
||||||
|
* properties:
|
||||||
|
* unit_price:
|
||||||
|
* description: The potential custom price of the item.
|
||||||
|
* type: integer
|
||||||
|
* title:
|
||||||
|
* description: The potential custom title of the item.
|
||||||
|
* type: string
|
||||||
|
* quantity:
|
||||||
|
* description: The quantity of the Line Item.
|
||||||
|
* type: integer
|
||||||
|
* metadata:
|
||||||
|
* description: The optional key-value map with additional details about the Line Item.
|
||||||
|
* type: object
|
||||||
|
* tags:
|
||||||
|
* - Draft Order
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: OK
|
||||||
|
* content:
|
||||||
|
* application/json:
|
||||||
|
* schema:
|
||||||
|
* properties:
|
||||||
|
* draft_order:
|
||||||
|
* $ref: "#/components/schemas/draft-order"
|
||||||
|
*/
|
||||||
|
|
||||||
|
export default async (req, res) => {
|
||||||
|
const { id, line_id } = req.params
|
||||||
|
|
||||||
|
const schema = Validator.object().keys({
|
||||||
|
title: Validator.string().optional(),
|
||||||
|
unit_price: Validator.number().optional(),
|
||||||
|
quantity: Validator.number().optional(),
|
||||||
|
metadata: Validator.object().optional(),
|
||||||
|
})
|
||||||
|
|
||||||
|
const { value, error } = schema.validate(req.body)
|
||||||
|
if (error) {
|
||||||
|
throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
const draftOrderService = req.scope.resolve("draftOrderService")
|
||||||
|
const cartService = req.scope.resolve("cartService")
|
||||||
|
const entityManager = req.scope.resolve("manager")
|
||||||
|
|
||||||
|
await entityManager.transaction(async manager => {
|
||||||
|
const draftOrder = await draftOrderService
|
||||||
|
.withTransaction(manager)
|
||||||
|
.retrieve(id, {
|
||||||
|
select: defaultFields,
|
||||||
|
relations: ["cart", "cart.items"],
|
||||||
|
})
|
||||||
|
|
||||||
|
if (
|
||||||
|
draftOrder.status === "completed" ||
|
||||||
|
draftOrder.status === "awaiting"
|
||||||
|
) {
|
||||||
|
throw new MedusaError(
|
||||||
|
MedusaError.Types.NOT_ALLOWED,
|
||||||
|
"You are only allowed to update open draft orders"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (value.quantity === 0) {
|
||||||
|
await cartService
|
||||||
|
.withTransaction(manager)
|
||||||
|
.removeLineItem(draftOrder.cart.id, line_id)
|
||||||
|
} else {
|
||||||
|
const existing = draftOrder.cart.items.find(i => i.id === line_id)
|
||||||
|
|
||||||
|
if (!existing) {
|
||||||
|
throw new MedusaError(
|
||||||
|
MedusaError.Types.INVALID_DATA,
|
||||||
|
"Could not find the line item"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const lineItemUpdate = {
|
||||||
|
...value,
|
||||||
|
region_id: draftOrder.cart.region_id,
|
||||||
|
}
|
||||||
|
|
||||||
|
if (existing.variant_id) {
|
||||||
|
lineItemUpdate.variant_id = existing.variant_id
|
||||||
|
}
|
||||||
|
|
||||||
|
await cartService
|
||||||
|
.withTransaction(manager)
|
||||||
|
.updateLineItem(draftOrder.cart_id, line_id, lineItemUpdate)
|
||||||
|
}
|
||||||
|
|
||||||
|
draftOrder.cart = await cartService
|
||||||
|
.withTransaction(manager)
|
||||||
|
.retrieve(draftOrder.cart_id, {
|
||||||
|
relations: defaultCartRelations,
|
||||||
|
select: defaultCartFields,
|
||||||
|
})
|
||||||
|
|
||||||
|
res.status(200).json({ draft_order: draftOrder })
|
||||||
|
})
|
||||||
|
} catch (err) {
|
||||||
|
throw err
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user