feat(medusa): cart context (#201)

- Adds a context field to Cart
- context is automatically populated with ip + user agent
- context can be updated via POST /store/cart/:id or set when creating via POST /store/cart
This commit is contained in:
Sebastian Rindom
2021-03-12 11:48:51 +01:00
committed by GitHub
parent a031f1f338
commit dd7b306333
20 changed files with 3499 additions and 657 deletions
@@ -11,6 +11,9 @@ describe("POST /store/carts", () => {
subject = await request("POST", `/store/carts`, {
payload: {
region_id: IdMap.getId("testRegion"),
context: {
clientId: "test",
},
},
})
})
@@ -23,6 +26,11 @@ describe("POST /store/carts", () => {
expect(CartServiceMock.create).toHaveBeenCalledTimes(1)
expect(CartServiceMock.create).toHaveBeenCalledWith({
region_id: IdMap.getId("testRegion"),
context: {
ip: "::ffff:127.0.0.1",
user_agent: "node-superagent/3.8.3",
clientId: "test",
},
})
})
@@ -1,3 +1,4 @@
import reqIp from "request-ip"
import { Validator, MedusaError } from "medusa-core-utils"
import { defaultFields, defaultRelations } from "./"
@@ -31,6 +32,9 @@ import { defaultFields, defaultRelations } from "./"
* quantity:
* description: The quantity of the Product Variant to add
* type: integer
* context:
* description: "An optional object to provide context to the Cart. The `context` field is automatically populated with `ip` and `user_agent`"
* type: object
* tags:
* - Cart
* responses:
@@ -53,6 +57,7 @@ export default async (req, res) => {
quantity: Validator.number().required(),
})
.optional(),
context: Validator.object().optional(),
})
const { value, error } = schema.validate(req.body)
@@ -60,6 +65,11 @@ export default async (req, res) => {
throw new MedusaError(MedusaError.Types.INVALID_DATA, error.details)
}
const reqContext = {
ip: reqIp.getClientIp(req),
user_agent: req.get("user-agent"),
}
try {
const lineItemService = req.scope.resolve("lineItemService")
const cartService = req.scope.resolve("cartService")
@@ -77,6 +87,10 @@ export default async (req, res) => {
const toCreate = {
region_id: regionId,
context: {
...reqContext,
...value.context,
},
}
if (req.user && req.user.customer_id) {
@@ -51,6 +51,9 @@ import { defaultFields, defaultRelations } from "./"
* customer_id:
* description: "The id of the Customer to associate the Cart with."
* type: string
* context:
* description: "An optional object to provide context to the Cart."
* type: object
* tags:
* - Cart
* responses:
@@ -85,6 +88,7 @@ export default async (req, res) => {
})
.optional(),
customer_id: Validator.string().optional(),
context: Validator.object().optional(),
})
const { value, error } = schema.validate(req.body)