canvasapi icon indicating copy to clipboard operation
canvasapi copied to clipboard

GraphQL needs to support pagination

Open jonespm opened this issue 1 year ago • 2 comments

Describe the bug

An upcoming (or recent depending on when you read this) change coming to Canvas is going to impose per page limits to GraphQL requests, previously unlimited. GraphQL call isn't paginated in this code so it likely won't work.

To Reproduce

Steps to reproduce the behavior:

  1. Need to setup CanvasAPI to run a GraphQL call
  2. Will fill in more details later once it's tested but any call that returns more than 10 results (like all courses for a term) would likely only return the first page.

Expected behavior

Return a paginated list so the user can page through it.

Environment information

  • Python version 3.12
  • CanvasAPI version 3.3.0

jonespm avatar Sep 27 '24 18:09 jonespm

I'd love to work on this issue!

jsmnhou avatar Dec 02 '24 23:12 jsmnhou

Just moving this comment from the PR to provide more clarity on this issue.

GraphQL is a special separate API and actually has it's own way of doing pagination using the Relay Connection Spec as mentioned on this documentation. It adds new first/after arguments and It doesn't use response headers like the other API's. I was thinking that the code here could be a method like fetch_all_pages and programmatically inject these and make the call. I can add some more examples to the original issue.

So it would need completely new custom code somewhere to handle this, maybe something like a paginated_graphql_list.py or maybe just in util.

The graphql call is in canvas.py https://github.com/ucfopen/canvasapi/blob/5e4f2600247116a46701ef26ce046a213b3df519/canvasapi/canvas.py#L1261 sends the request "as-is".

I'd expect code to detect and inject pagination into a GraphQL call might be more complicated than what is currently there for the regular API.

Hopefully there's a library or something to handle this as it seems like injecting pagination for nested connections might be a lot of code.

jonespm avatar Dec 06 '24 18:12 jonespm