From ea9cfe9c0263bd6fcfce6aa99bc36422f796e1e2 Mon Sep 17 00:00:00 2001 From: Loan Laux Date: Tue, 27 Apr 2021 20:16:53 +0400 Subject: [PATCH] reconcile carts on add-item if needed Signed-off-by: Loan Laux --- .../api/cart/handlers/add-item.ts | 34 +++++++++++++++---- .../api/cart/handlers/get-cart.ts | 29 ++++------------ .../api/utils/reconcile-carts.ts | 34 +++++++++++++++++++ 3 files changed, 68 insertions(+), 29 deletions(-) create mode 100644 framework/reactioncommerce/api/utils/reconcile-carts.ts diff --git a/framework/reactioncommerce/api/cart/handlers/add-item.ts b/framework/reactioncommerce/api/cart/handlers/add-item.ts index b2b61736a..5bdc377e6 100644 --- a/framework/reactioncommerce/api/cart/handlers/add-item.ts +++ b/framework/reactioncommerce/api/cart/handlers/add-item.ts @@ -4,6 +4,7 @@ import { createCartMutation, } from '@framework/utils/mutations' import getCartCookie from '@framework/api/utils/get-cart-cookie' +import reconcileCarts from '@framework/api/utils/reconcile-carts' import { REACTION_ANONYMOUS_CART_TOKEN_COOKIE, REACTION_CART_ID_COOKIE, @@ -11,13 +12,7 @@ import { } from '@framework/const' const addItem: CartHandlers['addItem'] = async ({ - req: { - cookies: { - [REACTION_ANONYMOUS_CART_TOKEN_COOKIE]: anonymousCartToken, - [REACTION_CART_ID_COOKIE]: cartId, - [REACTION_CUSTOMER_TOKEN_COOKIE]: reactionCustomerToken, - }, - }, + req: { cookies }, res, body: { item }, config, @@ -25,6 +20,13 @@ const addItem: CartHandlers['addItem'] = async ({ console.log('add-item API', item.productId) console.log('variantId', item.variantId) + const { + [REACTION_ANONYMOUS_CART_TOKEN_COOKIE]: anonymousCartToken, + [REACTION_CUSTOMER_TOKEN_COOKIE]: reactionCustomerToken, + } = cookies + + let { [REACTION_CART_ID_COOKIE]: cartId } = cookies + if (!cartId) { return res.status(400).json({ data: null, @@ -74,6 +76,7 @@ const addItem: CartHandlers['addItem'] = async ({ 999 ), ]) + return res.status(200).json(createdCart.data) } @@ -90,6 +93,23 @@ const addItem: CartHandlers['addItem'] = async ({ ] = `Bearer ${reactionCustomerToken}` } + if (anonymousCartToken && reactionCustomerToken) { + console.log('reconciliating carts')( + ({ _id: cartId } = await reconcileCarts({ + config, + anonymousCartId: cartId, + cartToken: anonymousCartToken, + reactionCustomerToken, + })) + ) + + // Clear the anonymous cart token cookie and update cart ID cookie + res.setHeader('Set-Cookie', [ + getCartCookie(config.anonymousCartTokenCookie), + getCartCookie(config.cartIdCookie, cartId, 999), + ]) + } + const updatedCart = await config.fetch( addCartItemsMutation, { diff --git a/framework/reactioncommerce/api/cart/handlers/get-cart.ts b/framework/reactioncommerce/api/cart/handlers/get-cart.ts index e4664313f..caa06edbb 100644 --- a/framework/reactioncommerce/api/cart/handlers/get-cart.ts +++ b/framework/reactioncommerce/api/cart/handlers/get-cart.ts @@ -2,8 +2,8 @@ import type { Cart } from '../../../types' import type { CartHandlers } from '../' import getAnomymousCartQuery from '@framework/utils/queries/get-anonymous-cart' import accountCartByAccountIdQuery from '@framework/utils/queries/account-cart-by-account-id' -import reconcileCartsMutation from '@framework/utils/mutations/reconcile-carts' import getCartCookie from '@framework/api/utils/get-cart-cookie' +import reconcileCarts from '@framework/api/utils/reconcile-carts' import getViewerId from '@framework/customer/get-viewer-id' import { REACTION_ANONYMOUS_CART_TOKEN_COOKIE, @@ -25,27 +25,12 @@ const getCart: CartHandlers['getCart'] = async ({ req, res, config }) => { let normalizedCart if (cartId && anonymousCartToken && reactionCustomerToken) { - const { - data: { - reconcileCarts: { cart: rawReconciledCart }, - }, - } = await config.fetch( - reconcileCartsMutation, - { - variables: { - input: { - anonymousCartId: cartId, - cartToken: anonymousCartToken, - shopId: config.shopId, - }, - }, - }, - { - headers: { - Authorization: `Bearer ${reactionCustomerToken}`, - }, - } - ) + const rawReconciledCart = await reconcileCarts({ + config, + anonymousCartId, + cartToken, + reactionCustomerToken, + }) normalizedCart = normalizeCart(rawReconciledCart) diff --git a/framework/reactioncommerce/api/utils/reconcile-carts.ts b/framework/reactioncommerce/api/utils/reconcile-carts.ts new file mode 100644 index 000000000..ea749e78f --- /dev/null +++ b/framework/reactioncommerce/api/utils/reconcile-carts.ts @@ -0,0 +1,34 @@ +import reconcileCartsMutation from '@framework/utils/mutations/reconcile-carts' + +async function reconcileCarts({ + config, + anonymousCartId, + cartToken, + reactionCustomerToken, +}) { + const { + data: { + reconcileCarts: { cart: rawReconciledCart }, + }, + } = await config.fetch( + reconcileCartsMutation, + { + variables: { + input: { + anonymousCartId: cartId, + cartToken: anonymousCartToken, + shopId: config.shopId, + }, + }, + }, + { + headers: { + Authorization: `Bearer ${reactionCustomerToken}`, + }, + } + ) + + return rawReconciledCart +} + +export default reconcileCarts