diff --git a/content/posts/how-to-implement-pagination-sorting-and-filtering-with-fastapi/index.md b/content/posts/how-to-implement-pagination-sorting-and-filtering-with-fastapi/index.md index 0b1ddf6..f1166e4 100644 --- a/content/posts/how-to-implement-pagination-sorting-and-filtering-with-fastapi/index.md +++ b/content/posts/how-to-implement-pagination-sorting-and-filtering-with-fastapi/index.md @@ -206,19 +206,20 @@ With the CRUD factory declared, routes become thin wrappers. Each route uses [Ar @router.get("/offset") async def list_articles_offset( session: SessionDep, + params: Annotated[ + dict[str, Any], + Depends(ArticleCrud.offset_params(default_page_size=20, max_page_size=100)), + ], filter_by: Annotated[dict[str, list[str]], Depends(ArticleCrud.filter_params())], order_by: Annotated[ OrderByClause | None, Depends(ArticleCrud.order_params(default_field=Article.created_at)), ], - page: int = Query(1, ge=1), - items_per_page: int = Query(20, ge=1, le=100), search: str | None = None, ) -> OffsetPaginatedResponse[ArticleRead]: return await ArticleCrud.offset_paginate( session=session, - page=page, - items_per_page=items_per_page, + **params, search=search, filter_by=filter_by or None, order_by=order_by, @@ -274,19 +275,20 @@ GET /articles/offset?page=2&items_per_page=2&search=fastapi&filter_by[status]=pu @router.get("/cursor") async def list_articles_cursor( session: SessionDep, + params: Annotated[ + dict[str, Any], + Depends(ArticleCrud.cursor_params(default_page_size=20, max_page_size=100)), + ], filter_by: Annotated[dict[str, list[str]], Depends(ArticleCrud.filter_params())], order_by: Annotated[ OrderByClause | None, Depends(ArticleCrud.order_params(default_field=Article.created_at)), ], - cursor: str | None = None, - items_per_page: int = Query(20, ge=1, le=100), search: str | None = None, ) -> CursorPaginatedResponse[ArticleRead]: return await ArticleCrud.cursor_paginate( session=session, - cursor=cursor, - items_per_page=items_per_page, + **params, search=search, filter_by=filter_by or None, order_by=order_by, @@ -349,23 +351,20 @@ You can also expose a single endpoint that supports both strategies via a `pagin @router.get("/") async def list_articles( session: SessionDep, + params: Annotated[ + dict[str, Any], + Depends(ArticleCrud.paginate_params(default_page_size=20, max_page_size=100)), + ], filter_by: Annotated[dict[str, list[str]], Depends(ArticleCrud.filter_params())], order_by: Annotated[ OrderByClause | None, Depends(ArticleCrud.order_params(default_field=Article.created_at)), ], - pagination_type: PaginationType = PaginationType.OFFSET, - page: int = Query(1, ge=1), - cursor: str | None = None, - items_per_page: int = Query(20, ge=1, le=100), search: str | None = None, ) -> PaginatedResponse[ArticleRead]: return await ArticleCrud.paginate( session, - pagination_type=pagination_type, - page=page, - cursor=cursor, - items_per_page=items_per_page, + **params, search=search, filter_by=filter_by or None, order_by=order_by,