From c2c43b76aa42510ab0b2948bfeab7b0f8027d88a Mon Sep 17 00:00:00 2001 From: Loan Laux Date: Wed, 7 Jul 2021 19:16:45 +0300 Subject: [PATCH] refactor category and brand filtering logic Signed-off-by: Loan Laux --- .../api/endpoints/catalog/get-products.ts | 14 +++++++++++++ .../api/operations/get-site-info.ts | 5 ++--- .../{ => api}/utils/get-categories.ts | 12 +++++------ .../{ => api}/utils/get-search-variables.ts | 9 +++++++- .../{ => api}/utils/get-sort-variables.ts | 0 .../{ => api}/utils/get-vendors.ts | 6 +++--- .../reactioncommerce/product/use-search.tsx | 21 ++++++++----------- framework/reactioncommerce/utils/index.ts | 4 ---- 8 files changed, 42 insertions(+), 29 deletions(-) rename framework/reactioncommerce/{ => api}/utils/get-categories.ts (63%) rename framework/reactioncommerce/{ => api}/utils/get-search-variables.ts (79%) rename framework/reactioncommerce/{ => api}/utils/get-sort-variables.ts (100%) rename framework/reactioncommerce/{ => api}/utils/get-vendors.ts (79%) diff --git a/framework/reactioncommerce/api/endpoints/catalog/get-products.ts b/framework/reactioncommerce/api/endpoints/catalog/get-products.ts index a97a8ea50..167f5c020 100644 --- a/framework/reactioncommerce/api/endpoints/catalog/get-products.ts +++ b/framework/reactioncommerce/api/endpoints/catalog/get-products.ts @@ -1,16 +1,30 @@ import catalogItemsQuery from '@framework/utils/queries/catalog-items-query' import { normalizeProduct } from '@framework/utils' import type { ProductsEndpoint } from './products' +import getSearchVariables from '../../utils/get-search-variables' const getCart: ProductsEndpoint['handlers']['getProducts'] = async ({ req, res, config, }) => { + const { + brandId, + categoryId, + search, + sort, + } = req.query + const { data: { catalogItems }, } = await config.fetch(catalogItemsQuery, { variables: { + ...getSearchVariables({ + brandId, + categoryId, + search, + sort, + }), shopIds: [config.shopId], }, }) diff --git a/framework/reactioncommerce/api/operations/get-site-info.ts b/framework/reactioncommerce/api/operations/get-site-info.ts index d09965dc8..2b688f407 100644 --- a/framework/reactioncommerce/api/operations/get-site-info.ts +++ b/framework/reactioncommerce/api/operations/get-site-info.ts @@ -1,10 +1,9 @@ import { Provider, ReactionCommerceConfig } from '../' -import { GetCollectionsQuery } from '../../schema' import getCollectionsQuery from '../../utils/queries/get-all-collections-query' import { OperationContext } from '@commerce/api/operations' import { Category } from '@commerce/types/site' -import getCategories from '../../utils/get-categories' -import getVendors from '../../utils/get-vendors' +import getCategories from '../utils/get-categories' +import getVendors from '../utils/get-vendors' export type GetSiteInfoResult< T extends { categories: any[]; brands: any[] } = { diff --git a/framework/reactioncommerce/utils/get-categories.ts b/framework/reactioncommerce/api/utils/get-categories.ts similarity index 63% rename from framework/reactioncommerce/utils/get-categories.ts rename to framework/reactioncommerce/api/utils/get-categories.ts index fe1c685a7..d7a86d1cd 100644 --- a/framework/reactioncommerce/utils/get-categories.ts +++ b/framework/reactioncommerce/api/utils/get-categories.ts @@ -1,6 +1,6 @@ -import { ReactionCommerceConfig } from '../api' -import { CollectionEdge, TagEdge } from '../schema' -import getTagsQuery from './queries/get-all-collections-query' +import { ReactionCommerceConfig } from '../' +import { TagEdge } from '../../schema' +import getTagsQuery from '../../utils/queries/get-all-collections-query' export type Category = { entityId: string @@ -10,7 +10,7 @@ export type Category = { const getCategories = async ( config: ReactionCommerceConfig -): Promise => { +): Promise => { const { data } = await config.fetch(getTagsQuery, { variables: { first: 250, @@ -21,9 +21,9 @@ const getCategories = async ( return ( data.tags?.edges?.map( ({ - node: { _id: entityId, displayTitle: name, slug: handle }, + node: { _id: id, displayTitle: name, slug: handle }, }: TagEdge) => ({ - entityId, + id, name, path: `/${handle}`, slug: handle, diff --git a/framework/reactioncommerce/utils/get-search-variables.ts b/framework/reactioncommerce/api/utils/get-search-variables.ts similarity index 79% rename from framework/reactioncommerce/utils/get-search-variables.ts rename to framework/reactioncommerce/api/utils/get-search-variables.ts index 6e6cb40b5..761a5c255 100644 --- a/framework/reactioncommerce/utils/get-search-variables.ts +++ b/framework/reactioncommerce/api/utils/get-search-variables.ts @@ -1,5 +1,12 @@ import getSortVariables from './get-sort-variables' -import type { SearchProductsInput } from '../product/use-search' + +export type SearchProductsInput = { + search?: string + categoryId?: number | string + brandId?: number + sort?: string + locale?: string +} export const getSearchVariables = ({ brandId, diff --git a/framework/reactioncommerce/utils/get-sort-variables.ts b/framework/reactioncommerce/api/utils/get-sort-variables.ts similarity index 100% rename from framework/reactioncommerce/utils/get-sort-variables.ts rename to framework/reactioncommerce/api/utils/get-sort-variables.ts diff --git a/framework/reactioncommerce/utils/get-vendors.ts b/framework/reactioncommerce/api/utils/get-vendors.ts similarity index 79% rename from framework/reactioncommerce/utils/get-vendors.ts rename to framework/reactioncommerce/api/utils/get-vendors.ts index 55b8b1cfc..c86add50b 100644 --- a/framework/reactioncommerce/utils/get-vendors.ts +++ b/framework/reactioncommerce/api/utils/get-vendors.ts @@ -1,6 +1,6 @@ -import { ReactionCommerceConfig } from '../api' -import getAllProductVendors from './queries/get-all-product-vendors-query' -import { Vendor } from '@framework/schema' +import { ReactionCommerceConfig } from '../' +import { Vendor } from '../../schema' +import getAllProductVendors from '../../utils/queries/get-all-product-vendors-query' export type Brand = { entityId: string diff --git a/framework/reactioncommerce/product/use-search.tsx b/framework/reactioncommerce/product/use-search.tsx index e61114335..f9a336261 100644 --- a/framework/reactioncommerce/product/use-search.tsx +++ b/framework/reactioncommerce/product/use-search.tsx @@ -3,34 +3,31 @@ import useSearch, { UseSearch } from '@commerce/product/use-search' export default useSearch as UseSearch -export type SearchProductsInput = { - search?: string - categoryId?: number | string - brandId?: number - sort?: string - locale?: string -} - export const handler: SWRHook = { fetchOptions: { url: '/api/catalog/products', method: 'GET', }, - fetcher({ input: { search, categoryId, brandId, sort }, options, fetch }) { + async 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', search) - if (Number.isInteger(categoryId)) + if (categoryId) url.searchParams.set('categoryId', String(categoryId)) - if (Number.isInteger(brandId)) + if (brandId) url.searchParams.set('brandId', String(brandId)) if (sort) url.searchParams.set('sort', sort) - return fetch({ + const results = await fetch({ url: url.pathname + url.search, method: options.method, }) + + return { + products: results?.products ?? [], + found: results?.products?.length > 0 ?? false, + } }, useHook: ({ useData }) => diff --git a/framework/reactioncommerce/utils/index.ts b/framework/reactioncommerce/utils/index.ts index 6cdf16cf8..d26577ce5 100644 --- a/framework/reactioncommerce/utils/index.ts +++ b/framework/reactioncommerce/utils/index.ts @@ -1,8 +1,4 @@ export { default as handleFetchResponse } from './handle-fetch-response' -export { default as getSearchVariables } from './get-search-variables' -export { default as getSortVariables } from './get-sort-variables' -export { default as getVendors } from './get-vendors' -export { default as getCategories } from './get-categories' export { default as getAnonymousCartToken } from './get-anonymous-cart-token' export { default as getAnonymousCartId } from './get-cart-id' export * from './queries'