AddCartLineItem
Implements AddCartLineItem Unified Method.
Source
import { HttpStatusCode } from "@alokai/connect/middleware";
import type {
BigcommerceIntegrationContext,
Product,
ProductVariant,
} from "@vsf-enterprise/bigcommerce-api";
import { CartIncludeEnum } from "@vsf-enterprise/bigcommerce-api";
import { defineApi, getCartFromContext, getNormalizedCart } from "@vsf-enterprise/unified-api-bigcommerce";
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 cart = await getCartFromContext(context);
const cartId = cart.id as string;
const { productId, quantity = 1, sku } = args;
const { api } = await context.getApiClient();
const { data: product } = await api.getProductById({
entityId: Number(productId),
});
if (!product) {
throw context.createHttpError({
message: "Product not found",
statusCode: HttpStatusCode.NOT_FOUND,
});
}
const variant_id = await getVariantIdFromSku(context, product, sku);
const { data } = await api.addCartItems({
cartId,
data: {
line_items: [{ product_id: Number(productId), quantity, variant_id }],
},
include: CartIncludeEnum.LineItemsPhysicalItemsOptions,
});
return await getNormalizedCart(context, data);
});
async function getVariantIdFromSku(
context: BigcommerceIntegrationContext,
product: Product,
sku: null | string,
): Promise<number | undefined> {
const variants = product.variants ?? [];
if (!sku || product.sku === sku) {
return product.base_variant_id ?? variants[0]?.id;
}
if (variants.length > 0) {
return findVariant(context, variants, sku).id;
}
}
function findVariant(
context: BigcommerceIntegrationContext,
variants: ProductVariant[],
sku: string,
): ProductVariant {
const variantWithSpecifiedSku = variants.find((variant) => variant.sku === sku);
if (!variantWithSpecifiedSku) {
throw context.createHttpError({
message: "Variant with given sku not found",
statusCode: HttpStatusCode.NOT_FOUND,
});
}
return variantWithSpecifiedSku;
}