Vue Storefront is now Alokai! Learn More
GetProductDetails

GetProductDetails

Implements GetProductDetails Unified Method.

Source

import type { SfCategory } from "@alokai/connect";
import { assignToNormalizerContext, getNormalizers } from "@alokai/connect/integration-kit";
import { getLogger, HttpStatusCode } from "@alokai/connect/middleware";
import type {
  BigcommerceIntegrationContext,
  CurrencyCode,
  Product,
} from "@vsf-enterprise/bigcommerce-api";

import { defineApi } from "@vsf-enterprise/unified-api-bigcommerce";
import { methods } from "@vsf-enterprise/unified-api-bigcommerce";
const { getCategories } = methods;

export const getProductDetails = defineApi.getProductDetails(async (context, args) => {
  const logger = getLogger(context);
  assignToNormalizerContext(context, { sku: args?.sku });
  const { currency } = context.config.normalizerContext;
  const { api } = await context.getApiClient();
  const products = await api.getProductById({
    currencyCode: currency as CurrencyCode,
    entityId: Number.parseInt(args.id),
  });
  const product = products.data;
  const { normalizeProduct } = getNormalizers(context);

  if (!product) {
    logger.error("/getProductDetails - Product not found", { args });
    throw context.createHttpError({
      message: "Product not found",
      statusCode: HttpStatusCode.NOT_FOUND,
    });
  }

  const categoryHierarchy = await getCategoriesForProduct(context, product);

  return {
    categoryHierarchy,
    product: normalizeProduct(product),
  };
});

async function getCategoriesForProduct(
  context: BigcommerceIntegrationContext,
  product: Product,
): Promise<SfCategory[]> {
  let categoryHierarchy: SfCategory[] = [];
  const tailCategoryId = product.categories.at(-1);

  if (tailCategoryId != null) {
    categoryHierarchy = await getCategories(context, {
      ids: [tailCategoryId.toString()],
    });
  }

  return categoryHierarchy;
}