Vue Storefront is now Alokai! Learn More
GetProductReviews

GetProductReviews

Implements GetProductReviews Unified Method.

Source

import "./extended";
import type { SfPagination } from "@alokai/connect";
import { getNormalizers } from "@alokai/connect/integration-kit";
import { getLogger } from "@alokai/connect/middleware";
import type { Review } from "@vsf-enterprise/sapcc-types";

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

export const getProductReviews = defineApi.getProductReviews(async (context, args) => {
  const { api } = await context.getApiClient();
  const logger = getLogger(context);
  const { currentPage, pageSize, productId } = args;
  let reviewsData: Review[] = [];
  const { normalizeProductReview } = getNormalizers(context);

  try {
    const { data: response } = await api.getProductReviews({
      productCode: productId,
    });
    reviewsData = response.reviews ?? [];
  } catch {
    logger.error("Error while fetching product reviews");
  }

  const { data, pagination } = paginatedResponse(reviewsData, currentPage, pageSize);

  return {
    pagination,
    reviews: data.map((review) => normalizeProductReview(review)),
  };
});

type PaginatedResponse<TData> = {
  data: TData[];
  pagination: SfPagination;
};

function paginatedResponse<TData>(
  data: TData[],
  currentPage = 0,
  pageSize = 0,
): PaginatedResponse<TData> {
  const totalPages = pageSize ? Math.ceil(data.length / pageSize) : 0;

  const start = currentPage * pageSize;
  const end = start + pageSize;

  return {
    data: data.slice(start, end),
    pagination: {
      currentPage,
      pageSize,
      totalPages,
      totalResults: data.length,
    },
  };
}