feat(F-131): completed feature
This commit is contained in:
67
work/artifacts/F-131/architect.md
Normal file
67
work/artifacts/F-131/architect.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user