Vue Storefront is now Alokai! Learn More
GetProductDetails

GetProductDetails

Implements GetProductDetails Unified Method.

Source

import { assignToNormalizerContext, getNormalizers } from "@alokai/connect/integration-kit";
import { HttpStatusCode } from "@alokai/connect/middleware";

import { defineApi } from "@vsf-enterprise/unified-api-magento";
import type { Category, ProductWithTypeName } from "@vsf-enterprise/unified-api-magento/ecommerceTypes";

export const getProductDetails = defineApi.getProductDetails(async (context, args) => {
  const { api } = await context.getApiClient();
  const response = await api.productDetails({ filter: { sku: { eq: args.id } } });
  const { normalizeCategory, normalizeProduct } = getNormalizers(context);
  assignToNormalizerContext(context, { sku: args?.sku });

  const product = response.data.products?.items?.[0];
  if (!product) {
    throw context.createHttpError({
      message: `Product with sku ${args.id} not found`,
      statusCode: HttpStatusCode.NOT_FOUND,
    });
  }

  return {
    categoryHierarchy: ((product.categories ?? []) as Category[])
      .filter((value, index, categoriesArray) =>
        isValidBreadcrumbHierarchy(value, index, categoriesArray),
      )
      .map((category) => normalizeCategory(category)),
    product: normalizeProduct(product as ProductWithTypeName),
  };
});

function isValidBreadcrumbHierarchy(category: Category, index: number, categories: Category[]) {
  if (index === 0) return true;

  const previousCategory = categories[index - 1];

  return (
    category.url_path?.startsWith(previousCategory?.url_path ?? "") && category.breadcrumbs !== null
  );
}