SearchProducts
Implements SearchProducts
Unified Method.
Source
/* eslint-disable no-secrets/no-secrets */
/* eslint-disable max-statements */
import { defineApi } from "@vsf-enterprise/unified-api-sapcc";
import type { SapccIntegrationContext } from "@vsf-enterprise/sapcc-api";
import {
type SearchProducts,
type SearchProductsArgs,
getNormalizers,
assignToNormalizerContext,
} from "@vue-storefront/unified-data-model";
import { buildFilters, buildProductsResponse } from "./helpers";
import "./extended.d";
export const searchProducts = defineApi.searchProducts(async (context, args) => {
try {
return await searchProductsByQuery(context, args);
} catch (error) {
console.error("/searchProducts", error);
return {
products: [],
pagination: {
currentPage: 0,
pageSize: 0,
totalResults: 0,
totalPages: 0,
},
facets: [],
};
}
});
function translateSort(sortBy: SearchProductsArgs["sortBy"]) {
switch (sortBy) {
case "relevant": {
return "relevance";
}
case "price-low-to-high": {
return "price-asc";
}
case "price-high-to-low": {
return "price-desc";
}
default: {
return sortBy;
}
}
}
async function searchProductsByQuery(
context: SapccIntegrationContext,
{ search, sortBy, facets: facetsQuery, category, currentPage = 1, pageSize }: SearchProductsArgs,
): ReturnType<SearchProducts> {
const filters = buildFilters({ category, facets: facetsQuery });
const { filterFacets = () => true } = context.config.unified;
const { normalizePagination, normalizeFacet } = getNormalizers(context);
const searchProductResponse = await context.api.searchProduct({
currentPage: Math.max(currentPage - 1, 0),
pageSize: pageSize,
searchTerm: search,
filters,
sort: translateSort(sortBy),
});
const {
facets: rawFacets = [],
products: rawProducts = [],
pagination: rawPagination = {},
currentQuery,
} = searchProductResponse;
assignToNormalizerContext(context, {
currentQuery,
});
return {
pagination: normalizePagination(rawPagination),
facets: rawFacets
.filter((facet) => filterFacets(facet))
.map((facet) => normalizeFacet(facet))
.filter(Boolean),
...buildProductsResponse(context, rawProducts),
};
}