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);
}