navapbc / template-application-flask

Apache License 2.0
8 stars 4 forks source link

Add pagination support to the API #211

Closed chouinar closed 1 year ago

chouinar commented 1 year ago

Ticket

Resolves https://github.com/navapbc/template-application-flask/issues/210

Changes

This adds pagination support to the API schema and DB queries

Added a new POST /users/search endpoint to have an example of a paginated endpoint.

Context for reviewers

There are likely more features that could be built ontop of this (multi-field sorting, Paginator class as an iterator, and a few other utilities), but was focused on getting the core functionality of pagination working in a fairly general manner.

This approach for pagination is based on a mix of past projects and partially based on the Flask-SQLAlchemy libraries approach.

Testing

Added a bunch of users locally by calling the POST /users endpoint, but only one which would be found by the following query:

{
  "is_active": true,
  "paging": {
    "page_offset": 1,
    "page_size": 25
  },
  "phone_number": "123-456-7890",
  "role_type": "USER",
  "sorting": {
    "order_by": "id",
    "sort_direction": "ascending"
  }
}

And got the following response (with the data removed as it's a lot):

{
  "data": [...],
  "errors": [],
  "message": "Success",
  "pagination_info": {
    "order_by": "id",
    "page_offset": 1,
    "page_size": 25,
    "sort_direction": "ascending",
    "total_pages": 2,
    "total_records": 41
  },
  "status_code": 200,
  "warnings": []
}

Further testing was done, and can be seen in the unit tests to verify the paging/sorting behavior.