Vue Storefront is now Alokai! Learn More
GetProductDetails

GetProductDetails

Implements GetProductDetails Unified Method.

Source

import "./extended";
import { getNormalizers } from "@alokai/connect/integration-kit";
import type { SFCCIntegrationContext } from "@vsf-enterprise/sfcc-api";
import type { Category, Product } from "@vsf-enterprise/sfcc-types";

import { defineApi } from "@vsf-enterprise/unified-api-sfcc";

export const getProductDetails = defineApi.getProductDetails(async (context, args) => {
  const { api } = await context.getApiClient();
  const { id, sku } = args;
  const productId = sku || id;
  const product = await api.getProduct({ id: productId, perPricebook: true });

  const rootCategoryId = await getPrimaryCategoryId(context, product);
  const productCategory = rootCategoryId
    ? await api.getCategory({ id: rootCategoryId })
    : undefined;

  const { normalizeCategory, normalizeProduct } = getNormalizers(context);

  return {
    categoryHierarchy:
      productCategory?.parentCategoryTree?.map((category) =>
        normalizeCategory(category as Category),
      ) ?? [],
    product: normalizeProduct(product),
  };
});

async function getPrimaryCategoryId(context: SFCCIntegrationContext, product: Product) {
  const { api } = await context.getApiClient();
  if (product?.primaryCategoryId) {
    return product.primaryCategoryId;
  }
  const masterId = product.master?.masterId;
  if (!masterId) {
    return;
  }
  const masterProduct = await api.getProduct({ id: masterId });
  return masterProduct?.primaryCategoryId;
}