# Pagination

> Les listes arrivent par pages. limit fixe la taille, starting_after reprend après le dernier élément, has_more dit s'il en reste.

Toutes les routes qui renvoient plusieurs éléments répondent avec la même enveloppe :

```json
{ "object": "list", "data": [...], "has_more": true }
```

## Les paramètres

- `limit` : combien d'éléments par page, de 1 à 100. 20 par défaut.
- `starting_after` : l'`id` du dernier élément de la page précédente. La page suivante commence juste après.

Quand `has_more` vaut `false`, tu as tout. L'ordre ne change pas d'une page à l'autre : les problèmes du plus grave au moins grave, les scans du plus récent au plus ancien.

Le curseur suit un élément, pas un numéro de page : si un nouveau scan arrive pendant que tu parcours la liste, tu ne vois pas deux fois le même élément. Un `starting_after` qui n'est pas dans la liste répond `400 cursor_invalid`.

## Exemples

### Node

```js
const project = "4f9c2a7e-1b3d-4e5f-8a6b-7c8d9e0f1a2b"
const issues = []
let after
do {
  const url = new URL(`https://api.rustine.io/v1/projects/${project}/issues`)
  url.searchParams.set("limit", "100")
  if (after) url.searchParams.set("starting_after", after)
  const res = await fetch(url, {
    headers: { Authorization: `Bearer ${process.env.RUSTINE_API_KEY}` },
  })
  const page = await res.json()
  issues.push(...page.data)
  after = page.has_more ? page.data.at(-1).id : undefined
} while (after)
```

### Python

```python
import os

import requests

project = "4f9c2a7e-1b3d-4e5f-8a6b-7c8d9e0f1a2b"
issues, after = [], None
while True:
    params = {"limit": 100}
    if after:
        params["starting_after"] = after
    page = requests.get(
        f"https://api.rustine.io/v1/projects/{project}/issues",
        headers={"Authorization": f"Bearer {os.environ['RUSTINE_API_KEY']}"},
        params=params,
    ).json()
    issues += page["data"]
    if not page["has_more"]:
        break
    after = page["data"][-1]["id"]
```

### Réponse : 200 OK

```json
{
  "object": "list",
  "data": [
    { "id": "a3c5e7f9-1b2d-4c6e-8f0a-2b4d6f8a1c3e", "object": "issue" }
  ],
  "has_more": true
}
```
