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