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