mirror of
https://github.com/vercel/commerce.git
synced 2025-05-17 23:16:59 +00:00
normalization + search
This commit is contained in:
parent
16cbec52cb
commit
d7de7dc62e
@ -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
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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: {
|
||||||
@ -21,4 +21,27 @@ export function normalizeProduct(product: SFCCProduct.ShopperProducts.Product):
|
|||||||
variants: [] as any, // TODO
|
variants: [] as any, // TODO
|
||||||
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
|
||||||
|
}));
|
||||||
|
|
||||||
}
|
}
|
@ -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'],
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user