Vue Storefront is now Alokai! Learn More
GetCategories

GetCategories

Implements GetCategories Unified Method.

Source

import type { GetCategoriesArgs } from "@alokai/connect";
import { getNormalizers } from "@alokai/connect/integration-kit";
import type { CommercetoolsIntegrationContext } from "@vsf-enterprise/commercetools-api";

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

export const getCategories = defineApi.getCategories(async (context, args = {}) => {
  const categories = await fetchCategoriesInBatches(context, args);

  const { normalizeCategory } = getNormalizers(context);

  return categories.map((category) => normalizeCategory(category));
});

async function fetchCategoriesInBatches(
  context: CommercetoolsIntegrationContext,
  args: GetCategoriesArgs,
) {
  const batchSize = 200;
  const search = {
    catIds: args.ids,
    limit: batchSize,
    slugs: args.slugs,
  };

  const fetchBatch = async (offset: number) => {
    const { api } = await context.getApiClient();
    const response = await api.getFacetCategories({ ...search, offset });
    return response.data?.categories.results ?? [];
  };

  let offset = 0;

  let categories = await fetchBatch(offset);
  const allCategories = [...categories];

  while (categories.length === search.limit) {
    offset += search.limit;
    categories = await fetchBatch(offset);
    allCategories.push(...categories);
  }

  return allCategories;
}