Sobre paginação
A API GraphQL do GitHub limita o número de itens em que você pode efetuar fetch em uma única solicitação, para proteger contra solicitações excessivas ou abusivas aos servidores do GitHub. Ao usar a API GraphQL, você deve fornecer um argumento first ou last em todas as conexões. O valor desses argumentos deve ficar entre 1 e 100. A API GraphQL retornará o número de conexões especificado pelo argumento first ou last.
Se os dados que você está acessando tiverem mais conexões do que o número de itens especificado pelo argumento first ou last, a resposta será dividida em "páginas" menores do tamanho especificado. É possível efetuar fetch em uma dessas páginas por vez, até que todo o conjunto de dados tenha sido recuperado. Cada página contém o número de itens especificado pelo argumento first ou last, a menos que seja a última página, que talvez contenha um número menor de itens.
Este guia demonstra como solicitar páginas adicionais de resultados para respostas paginadas, como alterar o número de resultados retornados em cada página e como escrever um script para buscar várias páginas de resultados.
Como solicitar um cursor em sua consulta
Ao usar a API GraphQL, você usa cursores para percorrer um conjunto de dados paginado. O cursor representa uma posição específica no conjunto de dados. Você pode obter o primeiro e o último cursor em uma página consultando o objeto pageInfo. Por exemplo:
query($owner: String!, $name: String!) {
repository(owner: $owner, name: $name) {
pullRequests(first: 100, after: null) {
nodes {
createdAt
number
title
}
pageInfo {
endCursor
startCursor
hasNextPage
hasPreviousPage
}
}
}
}
Neste exemplo, pageInfo.startCursor fornece o cursor para o primeiro item na página. pageInfo.endCursor fornece o cursor para o último item na página. pageInfo.hasNextPage e pageInfo.hasPreviousPage indicam se há uma página antes e depois da que foi retornada.
Como alterar o número de itens por página
Os argumentos first e last controlam quantos itens são retornados. O número máximo de itens em que você pode efetuar fetch usando o argumento first ou last é 100. Talvez seja necessário solicitar menos de 100 itens se a consulta resultar em muitos dados, para evitar atingir um limite de uma taxa ou nó. Para saber mais, confira Limites de taxa e limites de consulta para a API do GraphQL.
Como percorrer o conjunto de dados usando paginação
Depois de um cursor ser retornado de uma consulta, você pode usá-lo para solicitar a próxima página de resultados. Para fazer isso, você usará o argumento after ou before e o cursor.
Por exemplo, supondo que o valor pageInfo.endCursor do exemplo anterior era Y3Vyc29yOnYyOpHOUH8B7g==, você pode usar essa consulta para solicitar a próxima página de resultados:
query($owner: String!, $name: String!) {
repository(owner: $owner, name: $name) {
pullRequests(first: 1, after: "Y3Vyc29yOnYyOpHOUH8B7g==") {
nodes {
createdAt
number
title
}
pageInfo {
endCursor
hasNextPage
hasPreviousPage
}
}
}
}
Você pode continuar a enviar consultas com o novo valor pageInfo.endCursor retornado na resposta até que não haja mais páginas para percorrer, indicado por pageInfo.hasNextPage retornando false.
Se você especificou o argumento last em vez do first, a última página de resultados será retornada primeiro. Nesse caso, você usará o valor o pageInfo.startCursor e o argumento before para obter a página anterior de resultados. Quando pageInfo.hasPreviousPage tiver retornado false, você terá chegado à última página. Por exemplo:
query($owner: String!, $name: String!) {
repository(owner: $owner, name: $name) {
pullRequests(last: 1, before: "R3Vyc29yOnYyOpHOHcfoOg==") {
nodes {
createdAt
number
title
}
pageInfo {
startCursor
hasPreviousPage
}
}
}
}
Próximas etapas
Você pode usar o SDK Octokit do GitHub e o plugin octokit/plugin-paginate-graphql para dar suporte à paginação em seus scripts. Para obter mais informações, confira plugin-paginate-graphql.js.