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 = { export type GetAllProductPathsResult = {
products: Array<{ path: string }> products: Array<{ path: string }>
@ -7,7 +7,7 @@ export type GetAllProductPathsResult = {
export default function getAllProductPathsOperation() { export default function getAllProductPathsOperation() {
function getAllProductPaths(): Promise<GetAllProductPathsResult> { function getAllProductPaths(): Promise<GetAllProductPathsResult> {
return Promise.resolve({ 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 { GetAllProductsOperation } from '@vercel/commerce/types/product'
import type { OperationContext } from '@vercel/commerce/api/operations' import type { OperationContext } from '@vercel/commerce/api/operations'
import type { SFCCConfig, Provider } from '../index' import type { SFCCConfig, Provider } from '../index'
import data from '../../data.json' import { normalizeSearchProducts } from '../utils/normalise-product';
export default function getAllProductsOperation({ export default function getAllProductsOperation({
commerce, commerce,
@ -17,9 +17,26 @@ export default function getAllProductsOperation({
config?: Partial<SFCCConfig> config?: Partial<SFCCConfig>
preview?: boolean preview?: boolean
} = {}): Promise<{ products: Product[] | any[] }> { } = {}): 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 { return {
products: data.products, products: products
} }
} }
return getAllProducts return getAllProducts

View File

@ -28,8 +28,6 @@ export default function getProductOperation({
// TODO: add dummy data // TODO: add dummy data
const singleProduct = staticData.products.find(({ slug }) => slug === "new-short-sleeve-t-shirt"); const singleProduct = staticData.products.find(({ slug }) => slug === "new-short-sleeve-t-shirt");
if (singleProduct) { if (singleProduct) {
console.log(" == API == operations == getProductOperation = singleProduct: ", singleProduct)
// normalizedProduct['images'] = singleProduct['images']
normalizedProduct['variants'] = singleProduct['variants'] as any // TODO: variants normalizedProduct['variants'] = singleProduct['variants'] as any // TODO: variants
normalizedProduct['options'] = singleProduct['options'] // TODO: options 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 { Product, ProductImage } from '@vercel/commerce/types/product'
// import type { RawProduct } from '../../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 { export function normalizeProduct(product: SFCCProduct.ShopperProducts.Product): Product {
return { return {
id: product.id, id: product.id,
// TODO: use `name-ID` as a virtual slug (for search 1:1)
slug: product.id, // use product ID as a slug slug: product.id, // use product ID as a slug
// path: `/${product.id}`,
name: product.name!, name: product.name!,
description: product.longDescription!, description: product.longDescription!,
price: { price: {
@ -22,3 +22,26 @@ export function normalizeProduct(product: SFCCProduct.ShopperProducts.Product):
options: [] as any // TODO 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 = { module.exports = {
commerce, commerce,
images: { images: {
domains: ['localhost', 'edge.disstg.commercecloud.salesforce.com'], domains: ['localhost', 'edge.disstg.commercecloud.salesforce.com', 'zzte-053.sandbox.us02.dx.commercecloud.salesforce.com'],
}, },
} }