export type HydraCollection = { 'hydra:member'?: T[] 'hydra:totalItems'?: number 'member'?: T[] 'totalItems'?: number } export function extractHydraMembers(response: HydraCollection): T[] { return response['hydra:member'] ?? response['member'] ?? [] } function extractHydraTotal(response: HydraCollection): number | undefined { return response['hydra:totalItems'] ?? response['totalItems'] } /** * Récupère TOUS les éléments d'une collection Hydra paginée en parcourant les pages. * * `extractHydraMembers` ne lit que la première page (30 éléments par défaut côté * API Platform) : toute liste plus longue est tronquée silencieusement. Utiliser * ce helper dès qu'une collection potentiellement > 30 éléments doit être * affichée en entier alors que sa ressource back reste paginée. * * `fetchPage` reçoit le numéro de page (1-indexé) et doit renvoyer la collection * Hydra correspondante (passer `page` en query param de l'appel API). * * @param maxPages garde-fou anti-boucle infinie (par défaut 1000 pages). */ export async function fetchAllHydra( fetchPage: (page: number) => Promise>, maxPages = 1000, ): Promise { const first = await fetchPage(1) const all = extractHydraMembers(first) const total = extractHydraTotal(first) if (total === undefined) { return all } let page = 2 while (all.length < total && page <= maxPages) { const next = await fetchPage(page) const members = extractHydraMembers(next) if (members.length === 0) { break } all.push(...members) page += 1 } return all }