From cb727c8689a8d180501d380c51a7229f1aa1bdd7 Mon Sep 17 00:00:00 2001 From: Sebastian Rindom Date: Wed, 5 Feb 2020 10:20:58 +0100 Subject: [PATCH] cart service: updateShippingAddress, updateBillingAdress, updateEmail; address validator in core utils --- packages/medusa-core-utils/src/validator.js | 14 ++ packages/medusa/src/models/schemas/address.js | 4 +- .../medusa/src/services/__tests__/cart.js | 149 ++++++++++++++++++ packages/medusa/src/services/cart.js | 66 ++++++++ 4 files changed, 231 insertions(+), 2 deletions(-) diff --git a/packages/medusa-core-utils/src/validator.js b/packages/medusa-core-utils/src/validator.js index 8fe19cb022..54be1dec22 100644 --- a/packages/medusa-core-utils/src/validator.js +++ b/packages/medusa-core-utils/src/validator.js @@ -2,4 +2,18 @@ import Joi from "@hapi/joi" Joi.objectId = require("joi-objectid")(Joi) +Joi.address = () => { + return Joi.object().keys({ + first_name: Joi.string().required(), + last_name: Joi.string().required(), + address_1: Joi.string().required(), + address_2: Joi.string(), + city: Joi.string().required(), + country_code: Joi.string().required(), + province: Joi.string(), + postal_code: Joi.string().required(), + metadata: Joi.object() + }) +} + export default Joi diff --git a/packages/medusa/src/models/schemas/address.js b/packages/medusa/src/models/schemas/address.js index 8fff08669d..dec1249745 100644 --- a/packages/medusa/src/models/schemas/address.js +++ b/packages/medusa/src/models/schemas/address.js @@ -6,8 +6,8 @@ import mongoose from "mongoose" export default new mongoose.Schema({ first_name: { type: String, required: true }, last_name: { type: String, required: true }, - address1: { type: String, required: true }, - address2: { type: String }, + address_1: { type: String, required: true }, + address_2: { type: String }, city: { type: String, required: true }, country_code: { type: String, required: true }, province: { type: String }, diff --git a/packages/medusa/src/services/__tests__/cart.js b/packages/medusa/src/services/__tests__/cart.js index a0dcbb6b69..7c2384e677 100644 --- a/packages/medusa/src/services/__tests__/cart.js +++ b/packages/medusa/src/services/__tests__/cart.js @@ -256,4 +256,153 @@ describe("CartService", () => { } }) }) + + describe("updateEmail", () => { + const cartService = new CartService({ + cartModel: CartModelMock, + }) + + beforeEach(() => { + jest.clearAllMocks() + }) + + it("successfully updates an email", async () => { + await cartService.updateEmail( + IdMap.getId("emptyCart"), + "test@testdom.com" + ) + + expect(CartModelMock.updateOne).toHaveBeenCalledTimes(1) + expect(CartModelMock.updateOne).toHaveBeenCalledWith( + { + _id: IdMap.getId("emptyCart"), + }, + { + $set: { email: "test@testdom.com" }, + } + ) + }) + + it("throws on invalid email", async () => { + try { + await cartService.updateEmail(IdMap.getId("emptyCart"), "test@test") + } catch (err) { + expect(err.message).toEqual("The email is not valid") + } + + expect(CartModelMock.updateOne).toHaveBeenCalledTimes(0) + }) + }) + + describe("updateBillingAddress", () => { + const cartService = new CartService({ + cartModel: CartModelMock, + }) + + beforeEach(() => { + jest.clearAllMocks() + }) + + it("successfully updates billing address", async () => { + const address = { + first_name: "LeBron", + last_name: "James", + address_1: "24 Dunks Drive", + city: "Los Angeles", + country_code: "US", + province: "CA", + postal_code: "93011", + } + + await cartService.updateBillingAddress(IdMap.getId("emptyCart"), address) + + expect(CartModelMock.updateOne).toHaveBeenCalledTimes(1) + expect(CartModelMock.updateOne).toHaveBeenCalledWith( + { + _id: IdMap.getId("emptyCart"), + }, + { + $set: { billing_address: address }, + } + ) + }) + + it("throws on invalid address", async () => { + const address = { + last_name: "James", + address_1: "24 Dunks Drive", + city: "Los Angeles", + country_code: "US", + province: "CA", + postal_code: "93011", + } + + try { + await cartService.updateBillingAddress( + IdMap.getId("emptyCart"), + address + ) + } catch (err) { + expect(err.message).toEqual("The address is not valid") + } + + expect(CartModelMock.updateOne).toHaveBeenCalledTimes(0) + }) + }) + + describe("updateShippingAddress", () => { + const cartService = new CartService({ + cartModel: CartModelMock, + }) + + beforeEach(() => { + jest.clearAllMocks() + }) + + it("successfully updates billing address", async () => { + const address = { + first_name: "LeBron", + last_name: "James", + address_1: "24 Dunks Drive", + city: "Los Angeles", + country_code: "US", + province: "CA", + postal_code: "93011", + } + + await cartService.updateShippingAddress(IdMap.getId("emptyCart"), address) + + expect(CartModelMock.updateOne).toHaveBeenCalledTimes(1) + expect(CartModelMock.updateOne).toHaveBeenCalledWith( + { + _id: IdMap.getId("emptyCart"), + }, + { + $set: { shipping_address: address }, + } + ) + }) + + it("throws on invalid address", async () => { + const address = { + last_name: "James", + address_1: "24 Dunks Drive", + city: "Los Angeles", + country_code: "US", + province: "CA", + postal_code: "93011", + } + + try { + await cartService.updateShippingAddress( + IdMap.getId("emptyCart"), + address + ) + } catch (err) { + expect(err.message).toEqual("The address is not valid") + } + + expect(CartModelMock.updateOne).toHaveBeenCalledTimes(0) + }) + }) }) diff --git a/packages/medusa/src/services/cart.js b/packages/medusa/src/services/cart.js index b206f4eb63..f0b9ab3c40 100644 --- a/packages/medusa/src/services/cart.js +++ b/packages/medusa/src/services/cart.js @@ -240,6 +240,72 @@ class CartService extends BaseService { ) } + /** + * Sets the email of a cart + * @param {string} cartId - the id of the cart to add email to + * @param {string} email - the email to add to cart + * @return {Promise} the result of the update operation + */ + updateEmail(cartId, email) { + const schema = Validator.string() + .email() + .required() + const { value, error } = schema.validate(email) + if (error) { + throw new MedusaError( + MedusaError.Types.INVALID_DATA, + "The email is not valid" + ) + } + + return this.cartModel_.updateOne( + { + _id: cartId, + }, + { + $set: { email: value }, + } + ) + } + + updateBillingAddress(cartId, address) { + const { value, error } = Validator.address().validate(address) + if (error) { + throw new MedusaError( + MedusaError.Types.INVALID_DATA, + "The address is not valid" + ) + } + + return this.cartModel_.updateOne( + { + _id: cartId, + }, + { + $set: { billing_address: value }, + } + ) + } + + updateShippingAddress(cartId, address) { + const { value, error } = Validator.address().validate(address) + if (error) { + throw new MedusaError( + MedusaError.Types.INVALID_DATA, + "The address is not valid" + ) + } + + return this.cartModel_.updateOne( + { + _id: cartId, + }, + { + $set: { shipping_address: value }, + } + ) + } + /** * Dedicated method to set metadata for a cart. * To ensure that plugins does not overwrite each