From 8ef89ecc850c8932d28f2bef59a6a5e2a3f89cc5 Mon Sep 17 00:00:00 2001 From: Colin Goutte Date: Sun, 27 Aug 2023 20:06:25 +0200 Subject: [PATCH] GREEN: Had to fiddle a bit with schemas and typing --- dev.py | 20 +++++++++++++++++--- schemas.py | 9 +++++++++ utests/test_api.py | 6 ++++-- 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/dev.py b/dev.py index d080976..a351a75 100644 --- a/dev.py +++ b/dev.py @@ -118,8 +118,9 @@ async def list_movie( db: Session = Depends(get_db), pagenum: int | None = None, pagesize: int | None = None, -) -> schemas.MovieObjectsOut: +) -> schemas.PaginatedMovies | schemas.MovieObjectsOut: paginate_params = {} + paginate_data = {} pagination_params = {"pagenum": pagenum, "pagesize": pagesize} if any(v for v in pagination_params.values() if v is not None): @@ -127,13 +128,26 @@ async def list_movie( if missing: raise HTTPException(status_code=404, detail=f"Missing {missing}") - paginate_params = dict(offset=(pagenum - 1) * pagesize, limit=pagesize) + # Here we do a "x + 1 - 1 = x" trick to check if there will be more pages + # eg we want from 10 to 15, we ask for 10 to 16, if we have *stricly* more + # than 5 element we can now that there will be one more page + paginate_params = dict(offset=(pagenum - 1) * pagesize, limit=pagesize + 1) movies = crud.get_all_movies(db, **paginate_params) + if paginate_params: + has_more_content = movies.count() > pagesize + paginate_data = { + "next_page": pagenum + 1 if has_more_content else None, + "previous_page": pagenum - 1 if pagenum > 1 else None, + } + + movies = movies.limit(pagesize) + count = movies.count() - return {"movies": movies, "count": count} + payload = {"movies": movies, "count": count} + return {**payload, **paginate_data} if __name__ == "__main__": diff --git a/schemas.py b/schemas.py index eb5da75..6e7e22a 100644 --- a/schemas.py +++ b/schemas.py @@ -16,6 +16,15 @@ class MovieObject(MoviePayload): id: int | str +class Paginated(BaseModel): + next_page: str | int | None + previous_page: str | int | None + + class MovieObjectsOut(BaseModel): movies: list[MovieObject] count: int + + +class PaginatedMovies(MovieObjectsOut, Paginated): + pass diff --git a/utests/test_api.py b/utests/test_api.py index 0d5aa0e..850791c 100644 --- a/utests/test_api.py +++ b/utests/test_api.py @@ -175,12 +175,14 @@ class BaseCrud(unittest.TestCase): current_movies = client.get( f"/movies/?pagenum={pagenum}&pagesize={pagesize}" ).json() - assert current_movies["previous_page"] is None + assert current_movies.get("previous_page") is None + assert current_movies["next_page"] current_movies = client.get( f"/movies/?pagenum={pagenum + 1 }&pagesize={pagesize}" ).json() - assert current_movies["next_page"] is None + assert current_movies.get("next_page") is None + assert current_movies["previous_page"] # test last page has no next