Files
mercadodevida/work/artifacts/F-131/architect.md
2026-08-21 17:50:31 +02:00

67 lines
2.6 KiB
Markdown

# F-131 — Buscador /products (admin) no filtra
## Diagnóstico
Reproducción:
1. Login en `http://192.168.18.93:3004/`
2. Navegar a `/products`
3. Escribir "almendra" en el buscador
4. → La lista sigue mostrando los 13 productos (no filtra)
Investigación:
```
GET http://192.168.18.93:3000/catalog/products?q=almendra&limit=5
→ backend responde: total=1, items=1 ("Almendras Crudas Ecologicas") ✅ correcto
GET http://192.168.18.93:3004/api/catalog/products?q=almendra&limit=5
→ backend responde: total=13, items=13 (todos) ❌ filtro perdido
```
El **frontend y el backend funcionan bien aisladamente**. El problema está en el proxy del admin.
## Causa raíz
`apps/admin/src/app/api/[...path]/route.ts` (catch-all proxy que reenvía al backend) usa:
```ts
const path = req.nextUrl.pathname.replace('/api/', '');
const backendRes = await fetch(`${API}/${path}`, { ... });
```
**Nunca añade `req.nextUrl.search`**, por lo que cualquier query string (`?q=…`, `?limit=…`, `?offset=…`, etc.) se descarta antes de llegar al backend.
Esto afecta a **TODOS los métodos** (GET, POST, PATCH, PUT, DELETE) — todos usan `req.nextUrl.pathname` sin `req.nextUrl.search`.
Consecuencias visibles:
- `/products` no filtra (no llega `q`)
- `/inventory` no filtra (F-126, mismo síntoma)
- Paginación rota si la API espera `?limit=&offset=` (los `totalPages` se calculan con `data.items.length` en frontend, pero el `limit` real siempre cae al default del backend)
- Cualquier filtro futuro basado en query params falla silenciosamente
## Diseño
Extraer `const search = req.nextUrl.search` (ya viene con `?` o vacío) y concatenarlo en las 5 funciones handler.
```ts
const path = req.nextUrl.pathname.replace('/api/', '');
const search = req.nextUrl.search; // "" o "?q=…&limit=…"
const backendRes = await fetch(`${API}/${path}${search}`, { ... });
```
Aplicar a: GET, POST, PATCH, PUT, DELETE.
## Riesgos
- Bajo. Es un bug donde se omite información; el cambio es añadir lo que faltaba.
- Riesgo residual: si alguna ruta backend asume un orden fijo de query params y se envía en otro orden, podría romper tests, pero nuestro backend usa URLSearchParams en server (orden-independiente).
## Plan
1. Editar `apps/admin/src/app/api/[...path]/route.ts` — añadir `const search = req.nextUrl.search` en cada handler y concatenarlo en la URL.
2. `cd apps/admin && npx tsc --noEmit`.
3. `cd apps/admin && npm run build`.
4. Verificar con `curl`:
- `curl -b cookies /api/catalog/products?q=almendra` → 1 item
- `curl -b cookies /api/catalog/products?q=almendra&limit=5` → 1 item, no 13
5. Cerrar gates.