diff --git a/packages/sfcc/src/api/operations/get-all-product-paths.ts b/packages/sfcc/src/api/operations/get-all-product-paths.ts index fff24e791..b01d40ca8 100644 --- a/packages/sfcc/src/api/operations/get-all-product-paths.ts +++ b/packages/sfcc/src/api/operations/get-all-product-paths.ts @@ -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 { return Promise.resolve({ - products: data.products.map(({ path }) => ({ path })), + products: [], // TODO: SSG for products }) } diff --git a/packages/sfcc/src/api/operations/get-all-products.ts b/packages/sfcc/src/api/operations/get-all-products.ts index 72d325d9b..4fc86d55f 100644 --- a/packages/sfcc/src/api/operations/get-all-products.ts +++ b/packages/sfcc/src/api/operations/get-all-products.ts @@ -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 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 diff --git a/packages/sfcc/src/api/operations/get-product.ts b/packages/sfcc/src/api/operations/get-product.ts index 971a5c7be..c12c43758 100644 --- a/packages/sfcc/src/api/operations/get-product.ts +++ b/packages/sfcc/src/api/operations/get-product.ts @@ -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 } diff --git a/packages/sfcc/src/api/utils/normalise-product.ts b/packages/sfcc/src/api/utils/normalise-product.ts index ba6c54bdc..2c43aefd6 100644 --- a/packages/sfcc/src/api/utils/normalise-product.ts +++ b/packages/sfcc/src/api/utils/normalise-product.ts @@ -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: { @@ -21,4 +21,27 @@ export function normalizeProduct(product: SFCCProduct.ShopperProducts.Product): variants: [] 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 + })); + } \ No newline at end of file diff --git a/packages/sfcc/src/next.config.cjs b/packages/sfcc/src/next.config.cjs index 1b209f8eb..8c4d6c66f 100644 --- a/packages/sfcc/src/next.config.cjs +++ b/packages/sfcc/src/next.config.cjs @@ -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'], }, }