Loan Laux 254659e7c0
normalize data output in use-customer
Signed-off-by: Loan Laux <loan@outgrow.io>
2021-04-28 21:16:50 +04:00

96 lines
2.7 KiB
TypeScript

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 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,
REACTION_CART_ID_COOKIE,
REACTION_CUSTOMER_TOKEN_COOKIE,
} from '@framework/const.ts'
import { normalizeCart } from '@framework/utils'
// Return current cart info
const getCart: CartHandlers['getCart'] = async ({ req, res, config }) => {
const {
cookies: {
[REACTION_ANONYMOUS_CART_TOKEN_COOKIE]: anonymousCartToken,
[REACTION_CART_ID_COOKIE]: cartId,
[REACTION_CUSTOMER_TOKEN_COOKIE]: reactionCustomerToken,
},
} = req
let normalizedCart
if (cartId && anonymousCartToken && reactionCustomerToken) {
const rawReconciledCart = await reconcileCarts({
config,
cartId,
anonymousCartToken,
reactionCustomerToken,
})
normalizedCart = normalizeCart(rawReconciledCart)
// Clear the anonymous cart token cookie and update cart ID cookie
res.setHeader('Set-Cookie', [
getCartCookie(config.anonymousCartTokenCookie),
getCartCookie(config.cartIdCookie, normalizedCart.id, 999),
])
} else if (cartId && anonymousCartToken) {
const {
data: { cart: rawAnonymousCart },
} = await config.fetch(getAnomymousCartQuery, {
variables: {
cartId,
cartToken: anonymousCartToken,
},
})
normalizedCart = normalizeCart(rawAnonymousCart)
} else if (reactionCustomerToken && !anonymousCartToken) {
const accountId = await getViewerId({
customerToken: reactionCustomerToken,
config,
})
const {
data: { cart: rawAccountCart },
} = await config.fetch(
accountCartByAccountIdQuery,
{
variables: {
accountId,
shopId: config.shopId,
},
},
{
headers: {
Authorization: `Bearer ${reactionCustomerToken}`,
},
}
)
normalizedCart = normalizeCart(rawAccountCart)
if (cartId !== normalizedCart.id) {
res.setHeader(
'Set-Cookie',
getCartCookie(config.cartIdCookie, rawAccountCart._id, 999)
)
}
} else {
// If there's no cart for now, store a dummy cart ID to keep Next Commerce happy
res.setHeader(
'Set-Cookie',
getCartCookie(config.cartIdCookie, config.dummyEmptyCartId, 999)
)
}
res.status(200).json({ data: normalizedCart ?? null })
}
export default getCart