diff --git a/framework/ordercloud/api/endpoints/catalog/index.ts b/framework/ordercloud/api/endpoints/catalog/index.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/framework/ordercloud/api/endpoints/catalog/index.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/framework/ordercloud/api/endpoints/catalog/products.ts b/framework/ordercloud/api/endpoints/catalog/products.ts deleted file mode 100644 index 491bf0ac9..000000000 --- a/framework/ordercloud/api/endpoints/catalog/products.ts +++ /dev/null @@ -1 +0,0 @@ -export default function noopApi(...args: any[]): void {} diff --git a/framework/ordercloud/api/endpoints/catalog/products/get-products.ts b/framework/ordercloud/api/endpoints/catalog/products/get-products.ts new file mode 100644 index 000000000..e8be8b6fb --- /dev/null +++ b/framework/ordercloud/api/endpoints/catalog/products/get-products.ts @@ -0,0 +1,39 @@ + +import { normalize as normalizeProduct } from '@framework/utils/product' +import { ProductsEndpoint } from '.' + +// Get products for the product list page. Search and category filter implemented. Sort and brand filter not implemented. +const getProducts: ProductsEndpoint['handlers']['getProducts'] = async ({ + req, + res, + body: { search, categoryId, brandId, sort }, + config: { restBuyerFetch, cartCookie, tokenCookie }, +}) => { + //Use a dummy base as we only care about the relative path + const url = new URL('/me/products', 'http://a') + + if (search) { + url.searchParams.set('search', search) + } + if (categoryId) { + url.searchParams.set('categoryID', String(categoryId)) + } + + // Get token from cookies + const token = req.cookies[tokenCookie]; + + var rawProducts = await restBuyerFetch( + 'GET', + url.pathname + url.search, + null, + { token } + ); + + const products = rawProducts.Items.map(normalizeProduct); + const found = rawProducts?.Items?.length > 0; + + res.status(200).json({ data: { products, found } }) +} + +export default getProducts + diff --git a/framework/ordercloud/api/endpoints/catalog/products/index.ts b/framework/ordercloud/api/endpoints/catalog/products/index.ts new file mode 100644 index 000000000..71ad3cf1f --- /dev/null +++ b/framework/ordercloud/api/endpoints/catalog/products/index.ts @@ -0,0 +1,18 @@ +import { createEndpoint, GetAPISchema } from "@commerce/api" +import { ProductsSchema } from "@commerce/types/product" +import { OrdercloudAPI } from "@framework/api" +import getProducts from "./get-products"; +import productsEndpoint from '@commerce/api/endpoints/catalog/products' + +export type ProductsAPI = GetAPISchema + +export type ProductsEndpoint = ProductsAPI['endpoint'] + +export const handlers: ProductsEndpoint['handlers'] = { getProducts } + +const productsApi = createEndpoint({ + handler: productsEndpoint, + handlers, +}) + +export default productsApi diff --git a/framework/ordercloud/commerce.config.json b/framework/ordercloud/commerce.config.json index d93afa783..e329bd4c1 100644 --- a/framework/ordercloud/commerce.config.json +++ b/framework/ordercloud/commerce.config.json @@ -3,7 +3,7 @@ "features": { "wishlist": false, "cart": true, - "search": false, + "search": true, "customerAuth": false, "customCheckout": true } diff --git a/framework/ordercloud/product/use-search.tsx b/framework/ordercloud/product/use-search.tsx index 30e699537..4b39fefb4 100644 --- a/framework/ordercloud/product/use-search.tsx +++ b/framework/ordercloud/product/use-search.tsx @@ -1,17 +1,40 @@ import { SWRHook } from '@commerce/utils/types' import useSearch, { UseSearch } from '@commerce/product/use-search' +import { SearchProductsHook } from '@commerce/types/product' export default useSearch as UseSearch -export const handler: SWRHook = { +export const handler: SWRHook = { fetchOptions: { - query: '', + url: '/api/catalog/products', + method: 'GET', }, - async fetcher({ input, options, fetch }) {}, - useHook: () => () => { - return { - data: { - products: [], + fetcher({ input: { search, categoryId, brandId, sort }, options, fetch }) { + // Use a dummy base as we only care about the relative path + const url = new URL(options.url!, 'http://a') + + + if (search) url.searchParams.set('search', String(search)) + if (categoryId) url.searchParams.set('categoryId', String(categoryId)) + if (brandId) url.searchParams.set('brandId', String(brandId)) + if (sort) url.searchParams.set('sort', String(sort)) + + return fetch({ + url: url.pathname + url.search, + method: options.method, + }) + }, + useHook: ({ useData }) => (input = {}) => { + return useData({ + input: [ + ['search', input.search], + ['categoryId', input.categoryId], + ['brandId', input.brandId], + ['sort', input.sort] + ], + swrOptions: { + revalidateOnFocus: false, + ...input.swrOptions, }, - } + }) }, }