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ámetroTipoDefaultMáximoDescripción
pageint1Número de página (1-indexada).
per_pageint25100Registros 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ámetroTipoDefaultValores
sortstring(ID)Cualquier campo
orderstringascasc, 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).