diff --git a/packages/medusa/src/api/routes/store/carts/add-shipping-method.js b/packages/medusa/src/api/routes/store/carts/add-shipping-method.js index 3476e6f628..db5702a01b 100644 --- a/packages/medusa/src/api/routes/store/carts/add-shipping-method.js +++ b/packages/medusa/src/api/routes/store/carts/add-shipping-method.js @@ -22,7 +22,7 @@ export default async (req, res) => { await cartService.addShippingMethod(id, value.option_id, value.data) let cart = await cartService.retrieve(id) - cart = await cartService.decorate(cart) + cart = await cartService.decorate(cart, [], ["region"]) res.status(200).json({ cart }) } catch (err) { diff --git a/packages/medusa/src/api/routes/store/carts/create-line-item.js b/packages/medusa/src/api/routes/store/carts/create-line-item.js index 1aaf5aeb82..2d28d5212e 100644 --- a/packages/medusa/src/api/routes/store/carts/create-line-item.js +++ b/packages/medusa/src/api/routes/store/carts/create-line-item.js @@ -26,7 +26,7 @@ export default async (req, res) => { await cartService.addLineItem(cart._id, lineItem) cart = await cartService.retrieve(cart._id) - cart = await cartService.decorate(cart) + cart = await cartService.decorate(cart, [], ["region"]) res.status(200).json({ cart }) } catch (err) { diff --git a/packages/medusa/src/api/routes/store/carts/create-payment-sessions.js b/packages/medusa/src/api/routes/store/carts/create-payment-sessions.js index 58df527807..72c594cf84 100644 --- a/packages/medusa/src/api/routes/store/carts/create-payment-sessions.js +++ b/packages/medusa/src/api/routes/store/carts/create-payment-sessions.js @@ -9,7 +9,7 @@ export default async (req, res) => { // return the updated cart let cart = await cartService.retrieve(id) - cart = await cartService.decorate(cart) + cart = await cartService.decorate(cart, [], ["region"]) res.status(200).json({ cart }) } catch (err) { diff --git a/packages/medusa/src/api/routes/store/carts/delete-line-item.js b/packages/medusa/src/api/routes/store/carts/delete-line-item.js new file mode 100644 index 0000000000..80cf633895 --- /dev/null +++ b/packages/medusa/src/api/routes/store/carts/delete-line-item.js @@ -0,0 +1,16 @@ +import { Validator, MedusaError } from "medusa-core-utils" + +export default async (req, res) => { + const { id, line_id } = req.params + + try { + const cartService = req.scope.resolve("cartService") + + let cart = await cartService.removeLineItem(id, line_id) + cart = await cartService.decorate(cart, [], ["region"]) + + res.status(200).json({ cart }) + } catch (err) { + throw err + } +} diff --git a/packages/medusa/src/api/routes/store/carts/index.js b/packages/medusa/src/api/routes/store/carts/index.js index f072db9dd4..b76417379b 100644 --- a/packages/medusa/src/api/routes/store/carts/index.js +++ b/packages/medusa/src/api/routes/store/carts/index.js @@ -20,6 +20,10 @@ export default app => { "/:id/line-items/:line_id", middlewares.wrap(require("./update-line-item").default) ) + route.delete( + "/:id/line-items/:line_id", + middlewares.wrap(require("./delete-line-item").default) + ) // Payment sessions route.post( diff --git a/packages/medusa/src/api/routes/store/carts/update-cart.js b/packages/medusa/src/api/routes/store/carts/update-cart.js index 64cc1158c5..dc06df901a 100644 --- a/packages/medusa/src/api/routes/store/carts/update-cart.js +++ b/packages/medusa/src/api/routes/store/carts/update-cart.js @@ -57,7 +57,7 @@ export default async (req, res) => { } let newCart = await cartService.retrieve(id) - const data = await cartService.decorate(newCart) + const data = await cartService.decorate(newCart, [], ["region"]) res.json({ cart: data }) } catch (err) { throw err diff --git a/packages/medusa/src/api/routes/store/carts/update-line-item.js b/packages/medusa/src/api/routes/store/carts/update-line-item.js index 7602afb6cc..c30578b3bb 100644 --- a/packages/medusa/src/api/routes/store/carts/update-line-item.js +++ b/packages/medusa/src/api/routes/store/carts/update-line-item.js @@ -24,10 +24,8 @@ export default async (req, res) => { cart.region_id ) - await cartService.updateLineItem(cart._id, line_id, lineItem) - - cart = await cartService.retrieve(cart._id) - cart = await cartService.decorate(cart) + cart = await cartService.updateLineItem(cart._id, line_id, lineItem) + cart = await cartService.decorate(cart, [], ["region"]) res.status(200).json({ cart }) } catch (err) { diff --git a/packages/medusa/src/api/routes/store/carts/update-payment-method.js b/packages/medusa/src/api/routes/store/carts/update-payment-method.js index fb4bf52dba..e5a6c13ab5 100644 --- a/packages/medusa/src/api/routes/store/carts/update-payment-method.js +++ b/packages/medusa/src/api/routes/store/carts/update-payment-method.js @@ -22,7 +22,7 @@ export default async (req, res) => { await cartService.setPaymentMethod(id, session) let cart = await cartService.retrieve(id) - cart = await cartService.decorate(cart) + cart = await cartService.decorate(cart, [], ["region"]) res.status(200).json({ cart }) } catch (err) { diff --git a/packages/medusa/src/api/routes/store/shipping-options/index.js b/packages/medusa/src/api/routes/store/shipping-options/index.js index ea3cbc1cad..e710b97798 100644 --- a/packages/medusa/src/api/routes/store/shipping-options/index.js +++ b/packages/medusa/src/api/routes/store/shipping-options/index.js @@ -6,7 +6,10 @@ const route = Router() export default app => { app.use("/shipping-options", route) - route.get("/", middlewares.wrap(require("./list-shipping-options").default)) + route.get( + "/:cart_id", + middlewares.wrap(require("./list-shipping-options").default) + ) return app } diff --git a/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js b/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js index e47a2f420a..193fdf66de 100644 --- a/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js +++ b/packages/medusa/src/api/routes/store/shipping-options/list-shipping-options.js @@ -2,10 +2,10 @@ import { Validator, MedusaError } from "medusa-core-utils" export default async (req, res) => { const schema = Validator.object().keys({ - cart_id: Validator.string(), + cart_id: Validator.string().required(), }) - const { value, error } = schema.validate(req.body) + const { value, error } = schema.validate(req.params) if (error) { throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details) } diff --git a/packages/medusa/src/models/order.js b/packages/medusa/src/models/order.js index 6ff8ec7cd3..3389a01ea3 100644 --- a/packages/medusa/src/models/order.js +++ b/packages/medusa/src/models/order.js @@ -5,7 +5,7 @@ import LineItemSchema from "./schemas/line-item" import PaymentMethodSchema from "./schemas/payment-method" import ShippingMethodSchema from "./schemas/shipping-method" import AddressSchema from "./schemas/address" -import DiscountModel from "./discount" +import DiscountSchema from "./schemas/discount" class OrderModel extends BaseModel { static modelName = "Order" @@ -23,8 +23,8 @@ class OrderModel extends BaseModel { shipping_address: { type: AddressSchema, required: true }, items: { type: [LineItemSchema], required: true }, region_id: { type: String, required: true }, - discounts: { type: [DiscountModel.schema], default: [] }, - customer_id: { type: String, required: true }, + discounts: { type: [DiscountSchema], default: [] }, + customer_id: { type: String }, payment_method: { type: PaymentMethodSchema, required: true }, shipping_methods: { type: [ShippingMethodSchema], required: true }, metadata: { type: mongoose.Schema.Types.Mixed, default: {} }, diff --git a/packages/medusa/src/services/cart.js b/packages/medusa/src/services/cart.js index 8eadf54049..5ecb368a34 100644 --- a/packages/medusa/src/services/cart.js +++ b/packages/medusa/src/services/cart.js @@ -226,6 +226,10 @@ class CartService extends BaseService { */ async decorate(cart, fields, expandFields = []) { const c = cart.toObject() + c.shipping_total = await this.totalsService_.getShippingTotal(cart) + c.discount_total = await this.totalsService_.getDiscountTotal(cart) + c.tax_total = await this.totalsService_.getTaxTotal(cart) + c.subtotal = await this.totalsService_.getSubtotal(cart) c.total = await this.totalsService_.getTotal(cart) if (expandFields.includes("region")) { c.region = await this.regionService_.retrieve(cart.region_id) @@ -241,10 +245,10 @@ class CartService extends BaseService { */ async removeLineItem(cartId, lineItemId) { const cart = await this.retrieve(cartId) - const itemToRemove = cart.items.find(line => line._id === lineItemId) + const itemToRemove = cart.items.find(line => line._id.equals(lineItemId)) if (!itemToRemove) { - return Promise.resolve() + return Promise.resolve(cart) } // If cart has more than one of those line items, we update the quantity @@ -739,7 +743,7 @@ class CartService extends BaseService { ) const status = await provider.getStatus(paymentMethod.data) - if (status !== "authorized") { + if (!(status === "authorized" || status === "succeeded")) { throw new MedusaError( MedusaError.Types.NOT_ALLOWED, `The payment method was not authorized` diff --git a/packages/medusa/src/services/line-item.js b/packages/medusa/src/services/line-item.js index 92c5e5ec0e..22ea8c321e 100644 --- a/packages/medusa/src/services/line-item.js +++ b/packages/medusa/src/services/line-item.js @@ -37,8 +37,12 @@ class LineItemService extends BaseService { const lineItemSchema = Validator.object({ title: Validator.string().required(), - description: Validator.string(), - thumbnail: Validator.string(), + description: Validator.string() + .allow("") + .optional(), + thumbnail: Validator.string() + .allow("") + .optional(), content: Validator.alternatives() .try(content, Validator.array().items(content)) .required(), @@ -46,7 +50,7 @@ class LineItemService extends BaseService { .integer() .min(1) .required(), - metadata: Validator.object(), + metadata: Validator.object().default({}), }) const { value, error } = lineItemSchema.validate(rawLineItem) diff --git a/packages/medusa/src/services/order.js b/packages/medusa/src/services/order.js index f58da00647..c9a1c62876 100644 --- a/packages/medusa/src/services/order.js +++ b/packages/medusa/src/services/order.js @@ -188,8 +188,20 @@ class OrderService extends BaseService { * @return {Promise} resolves to the creation result. */ async createFromCart(cart) { + const o = { + payment_method: cart.payment_method, + shipping_methods: cart.shipping_methods, + items: cart.items, + shipping_address: cart.shipping_address, + billing_address: cart.shipping_address, + region_id: cart.region_id, + email: cart.email, + customer_id: cart.customer_id, + cart_id: cart._id, + } + return this.orderModel_ - .create({ ...cart, metadata: { cart_id: cart._id } }) + .create(o) .then(result => { // Notify subscribers this.eventBus_.emit(OrderService.Events.PLACED, result) diff --git a/packages/medusa/src/services/shipping-option.js b/packages/medusa/src/services/shipping-option.js index db65235491..baea75d432 100644 --- a/packages/medusa/src/services/shipping-option.js +++ b/packages/medusa/src/services/shipping-option.js @@ -136,7 +136,8 @@ class ShippingOptionService extends BaseService { * @return {ShippingOption} the validated shipping option */ async validateCartOption(optionId, cart) { - let option = await this.retrieve(optionId) + const optionDoc = await this.retrieve(optionId) + let option = optionDoc.toObject() if (cart.region_id !== option.region_id) { throw new MedusaError( @@ -150,7 +151,7 @@ class ShippingOptionService extends BaseService { if (requirement.type === "max_subtotal") { return requirement.value > subtotal } else if (requirement.type === "min_subtotal") { - return requirement.value < subtotal + return requirement.value <= subtotal } return true // default to true