Fase 3b (ultima) de ADR 0006 Etapa 2: los conteos de categoria/marca/edad del sidebar de /catalog dejan de ser un snapshot client-side fijo. Ahora se refetchean en vivo contra /api/search en cada cambio de filtro (query debounced 300ms), tres llamadas paralelas -- una por dimension, cada una omitiendo su propio filtro para preservar el patron Amazon de "cuantos resultados habria si eligiera este otro valor". - catalog-client.tsx: useMemo client-side originales pasan a ser fallback (mock/shopify sin searchWithFacets, o cuando la categoria activa es un grupo raiz sintetico que Meilisearch no puede filtrar). - ProductFilters gana `limit` opcional; /api/search y el provider medusa lo reenvian -- las llamadas de solo-conteo piden limit=0 para no rehidratar precios de productos que no se van a mostrar.
46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
import { searchWithFacets } from "@/lib/headless/client";
|
|
import type { ProductFilters } from "@/lib/headless/types";
|
|
|
|
// PredictiveSearch es un componente cliente y no puede pegarle directo
|
|
// al provider server-side (MEDUSA_BACKEND_URL es un nombre DNS interno
|
|
// del cluster, no resuelve desde el navegador) -- esta ruta es el
|
|
// puente same-origin.
|
|
export async function GET(request: Request) {
|
|
const { searchParams } = new URL(request.url);
|
|
|
|
const filters: ProductFilters = {
|
|
query: searchParams.get("q") ?? undefined,
|
|
category: searchParams.get("category") ?? undefined,
|
|
collection: searchParams.get("collection") ?? undefined,
|
|
brand: searchParams.get("brand") ?? undefined,
|
|
ageRange: searchParams.get("ageRange") ?? undefined,
|
|
};
|
|
|
|
const minPrice = searchParams.get("minPrice");
|
|
if (minPrice) filters.minPrice = Number(minPrice);
|
|
const maxPrice = searchParams.get("maxPrice");
|
|
if (maxPrice) filters.maxPrice = Number(maxPrice);
|
|
const limit = searchParams.get("limit");
|
|
if (limit) filters.limit = Number(limit);
|
|
|
|
try {
|
|
const result = await searchWithFacets(filters);
|
|
// provider actual no implementa searchWithFacets (mock/shopify) --
|
|
// degradar a vacío, no a 500; el componente cliente cae de nuevo a
|
|
// su propio filtrado si esta ruta no trae nada útil.
|
|
return Response.json(
|
|
result ?? { products: [], facetDistribution: {}, count: 0 },
|
|
);
|
|
} catch (error) {
|
|
return Response.json(
|
|
{
|
|
products: [],
|
|
facetDistribution: {},
|
|
count: 0,
|
|
error: (error as Error).message,
|
|
},
|
|
{ status: 502 },
|
|
);
|
|
}
|
|
}
|