Vue Storefront is now Alokai! Learn More
AddCartLineItem

AddCartLineItem

Implements AddCartLineItem Unified Method.

Source

import type { AddCartLineItemArgs } from "@alokai/connect";
import { getNormalizers } from "@alokai/connect/integration-kit";
import { HttpStatusCode } from "@alokai/connect/middleware";
import type { CommercetoolsIntegrationContext } from "@vsf-enterprise/commercetools-api";

import { defineApi, getCartVersion } from "@vsf-enterprise/unified-api-commercetools";
import { getProduct } from "@vsf-enterprise/unified-api-commercetools";

export const addCartLineItem = defineApi.addCartLineItem(async (context, args) => {
  if (args?.cartId != null) {
    throw context.createHttpError({
      message: "Multiple carts feature is not available.",
      statusCode: HttpStatusCode.BAD_REQUEST,
    });
  }
  const [variant, cartVersion] = await Promise.all([
    getProductVariant(context, args),
    getCartVersion(context),
  ]);

  if (!variant) {
    throw context.createHttpError({
      message: "Variant not found",
      statusCode: HttpStatusCode.NOT_FOUND,
    });
  }

  const { api } = await context.getApiClient();
  const updatedCart = await api.addToCart(cartVersion, {
    product: variant,
    quantity: args.quantity || 1,
  });

  const { normalizeCart } = getNormalizers(context);

  return normalizeCart(updatedCart.cart);
});

async function getProductVariant(
  context: CommercetoolsIntegrationContext,
  args: AddCartLineItemArgs,
) {
  const product = await getProduct(context, { id: args.productId, sku: args.sku || undefined });
  const { allVariants, masterVariant } = product.masterData.current || {};

  if (!args.sku) {
    return masterVariant;
  }

  return allVariants?.find((variant) => variant.sku === args.sku);
}