Paginación
Los listados (GET /api/v1/{modelo}) están paginados por defecto. Esto
mantiene los tiempos de respuesta predecibles incluso en modelos con
millones de registros (Venta, Compra, MovimientoBancario).
Parámetros
| Parámetro | Tipo | Default | Máximo | Descripción |
|---|---|---|---|---|
page | int | 1 | — | Número de página (1-indexada). |
per_page | int | 25 | 100 | Registros por página. |
curl "http://localhost/api/v1/Cliente?page=3&per_page=50" \
-H "Authorization: Bearer $TOKEN"Respuesta
Cada listado regresa metadata de paginación:
{
"data": [ /* 50 clientes */ ],
"meta": {
"model": "Cliente",
"total": 4827,
"page": 3,
"per_page": 50,
"pages": 97
},
"errors": null
}Iterar todos los registros
Para descargar todos los registros (un export, por ejemplo), itera
page desde 1 hasta meta.pages:
async function fetchAll(modelo, token) {
const all = [];
let page = 1;
while (true) {
const res = await fetch(`http://localhost/api/v1/${modelo}?page=${page}&per_page=100`, {
headers: { Authorization: `Bearer ${token}` },
});
const json = await res.json();
all.push(...json.data);
if (page >= json.meta.pages) break;
page++;
}
return all;
}Ordenamiento
Combinable con paginación:
curl "http://localhost/api/v1/Cliente?sort=nombre&order=desc&page=1" \
-H "Authorization: Bearer $TOKEN"| Parámetro | Tipo | Default | Valores |
|---|---|---|---|
sort | string | (ID) | Cualquier campo |
order | string | asc | asc, desc |
Si sort es un FK, el ordenamiento se hace por el ID — no por _str.
Para ordenar por la representación humana, ordena en el cliente o usa
el campo de texto directamente del modelo (cuando exista).