normalization + search

This commit is contained in:
Dom Sip 2022-04-06 12:13:17 +01:00
parent 16cbec52cb
commit d7de7dc62e
5 changed files with 48 additions and 10 deletions

View File

@ -1,4 +1,4 @@
import data from '../../data.json'
// import data from '../../data.json'
export type GetAllProductPathsResult = {
products: Array<{ path: string }>
@ -7,7 +7,7 @@ export type GetAllProductPathsResult = {
export default function getAllProductPathsOperation() {
function getAllProductPaths(): Promise<GetAllProductPathsResult> {
return Promise.resolve({
products: data.products.map(({ path }) => ({ path })),
products: [], // TODO: SSG for products
})
}

View File

@ -2,7 +2,7 @@ import { Product } from '@vercel/commerce/types/product'
import { GetAllProductsOperation } from '@vercel/commerce/types/product'
import type { OperationContext } from '@vercel/commerce/api/operations'
import type { SFCCConfig, Provider } from '../index'
import data from '../../data.json'
import { normalizeSearchProducts } from '../utils/normalise-product';
export default function getAllProductsOperation({
commerce,
@ -17,9 +17,26 @@ export default function getAllProductsOperation({
config?: Partial<SFCCConfig>
preview?: boolean
} = {}): Promise<{ products: Product[] | any[] }> {
console.log(" == API == operations == getAllProductsOperation: ", variables)
// TODO: support locale
const { sdk, locale } = commerce.getConfig(config) as SFCCConfig
const searchClient = await sdk.getSearchClient()
// use SDK search API for initial products
const searchResults = await searchClient.productSearch({
parameters: { q: "dress", limit: variables?.first },
});
let products = [] as Product[];
if (searchResults.total) {
products = normalizeSearchProducts(searchResults.hits)
} else {
// TODO: handle this better?
console.log("No results for search");
}
return {
products: data.products,
products: products
}
}
return getAllProducts

View File

@ -28,8 +28,6 @@ export default function getProductOperation({
// TODO: add dummy data
const singleProduct = staticData.products.find(({ slug }) => slug === "new-short-sleeve-t-shirt");
if (singleProduct) {
console.log(" == API == operations == getProductOperation = singleProduct: ", singleProduct)
// normalizedProduct['images'] = singleProduct['images']
normalizedProduct['variants'] = singleProduct['variants'] as any // TODO: variants
normalizedProduct['options'] = singleProduct['options'] // TODO: options
}

View File

@ -1,4 +1,4 @@
import { Product as SFCCProduct } from "commerce-sdk";
import { Product as SFCCProduct, Search } from "commerce-sdk";
import type { Product, ProductImage } from '@vercel/commerce/types/product'
// import type { RawProduct } from '../../types/product'
@ -6,8 +6,8 @@ import type { Product, ProductImage } from '@vercel/commerce/types/product'
export function normalizeProduct(product: SFCCProduct.ShopperProducts.Product): Product {
return {
id: product.id,
// TODO: use `name-ID` as a virtual slug (for search 1:1)
slug: product.id, // use product ID as a slug
// path: `/${product.id}`,
name: product.name!,
description: product.longDescription!,
price: {
@ -22,3 +22,26 @@ export function normalizeProduct(product: SFCCProduct.ShopperProducts.Product):
options: [] as any // TODO
};
}
export function normalizeSearchProducts(products: Search.ShopperSearch.ProductSearchHit[]): Product[] {
return products.map(product => ({
id: product.productId,
slug: product.productId, // use product ID as a slug
name: product.productName!,
description: '',
price: {
value: product.price!,
currencyCode: product.currency
},
images: [
{
url: product.image!.link,
altText: product.productName
} as ProductImage
],
variants: [] as any, // TODO
options: [] as any // TODO
}));
}

View File

@ -3,6 +3,6 @@ const commerce = require('./commerce.config.json')
module.exports = {
commerce,
images: {
domains: ['localhost', 'edge.disstg.commercecloud.salesforce.com'],
domains: ['localhost', 'edge.disstg.commercecloud.salesforce.com', 'zzte-053.sandbox.us02.dx.commercecloud.salesforce.com'],
},
}