Hydra data provider ignores hydra:view pagination links, hardcodes page/itemsPerPage
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Idoneità per principianti
- 64/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Tranquilla
- Stack tecnologico
- react, typescript
Direzione di ricerca
Inizia in src/hydra/dataProvider.ts, in convertReactAdminRequestToHydraRequest e nella gestione delle risposte intorno alle righe 602-631. Traccia come vengono elaborate le richieste di paginazione GET_LIST e i link hydra:view; il lavoro è completato quando le richieste iniziali evitano la paginazione forzata dove appropriato, la navigazione successiva segue hydra:next e hydra:previous e le risposte basate su cursore restituiscono pageInfo invece di total.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Description
The Hydra data provider hardcodes page and itemsPerPage query parameters on every GET_LIST request, ignoring the cursor-based pagination links (hydra:next, hydra:previous) returned in hydra:view.
This makes it impossible to use cursor-based (keyset) pagination — a common pattern for APIs that avoid offset-based pagination for performance and consistency reasons.
Current behavior
In convertReactAdminRequestToHydraRequest (dataProvider.ts#L413-L414):
if (page) url.searchParams.set('page', page.toString());
if (perPage) url.searchParams.set('itemsPerPage', perPage.toString());
These params are always appended to the request URL, regardless of what the server's hydra:view links specify.
On the response side (dataProvider.ts#L602-L631), when hydra:totalItems is present, the provider returns { data, total } and never reads hydra:view. The hydra:view / pageInfo path is only reached when totalItems is absent — but even then, subsequent requests still send page=N instead of following the cursor URLs from hydra:next / hydra:previous.
Expected behavior
When a collection response includes hydra:view with hydra:next / hydra:previous links, the data provider should use those URLs for navigation instead of constructing page=N&itemsPerPage=X params. This is how Hydra's PartialCollectionView is designed to work — the server tells the client how to navigate.
Specifically:
- For the first page, the provider should request the collection URL (optionally with
itemsPerPage/pageSizeif the server supports it) - For subsequent pages, the provider should follow
hydra:next/hydra:previousURLs from the response'shydra:view - When
hydra:viewis present withouthydra:last, the provider should returnpageInfo(nottotal) so react-admin uses next/prev navigation
Workaround
We currently bypass base.getList entirely in our data provider wrapper — we fetch the collection URL ourselves, track hydra:next/hydra:previous URLs from responses in a cache, and return pageInfo instead of total:
getList: async (resource, params) => {
const page = params.pagination?.page ?? 1;
const perPage = params.pagination?.perPage ?? 25;
const cached = cursorCache.get(cursorKey(resource, params));
let url;
if (page > 1 && cached?.page < page && cached?.nextUrl) {
url = new URL(cached.nextUrl, window.location.origin);
} else if (page > 1 && cached?.page > page && cached?.previousUrl) {
url = new URL(cached.previousUrl, window.location.origin);
} else {
url = new URL(`/api/${resource}`, window.location.origin);
url.searchParams.set("pageSize", String(perPage));
}
const response = await fetch(url.toString(), {
headers: { Accept: "application/ld+json" },
credentials: "include",
});
const json = await response.json();
const view = json["hydra:view"] ?? null;
cursorCache.set(key, {
nextUrl: view?.["hydra:next"] ?? null,
previousUrl: view?.["hydra:previous"] ?? null,
page,
});
return {
data: json["hydra:member"].map(normalize),
pageInfo: {
hasNextPage: !!view?.["hydra:next"],
hasPreviousPage: !!view?.["hydra:previous"],
},
};
}
This works but defeats the purpose of using the Hydra data provider in the first place.
Versions
@api-platform/admin: 4.2.4react-admin: 5.6.1
- Lingua principale
- TypeScript
- Stelle
- 516
- Fork
- 134
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di api-platform/admin
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
api-platform/admin#616 · 1 commento ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 50/100
api-platform/admin#659 · 1 reazione ·
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 35/100
api-platform/admin#631 · 6 commenti ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
api-platform/admin#626 · 1 commento · 1 reazione ·
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 35/100
api-platform/admin#615 · 4 commenti · 2 reazioni ·
Tutte le issue di api-platform/admin
Issue simili
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 65/100
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
-
bug v2
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
modelcontextprotocol/inspector#2458 · 1 commento ·
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 75/100
railmapgen/rmp-gallery#4068 ·
-
Mend: dependency security vulnerability status: needs triage 🕵️♀️
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
carbon-design-system/ibm-products#9907 ·