update fastapi pagination article
All checks were successful
Build Blog Docker Image / build docker (push) Successful in 1m19s

This commit is contained in:
2026-03-22 18:38:01 -04:00
parent d2b1548dd3
commit 434306d9f1

View File

@@ -206,19 +206,20 @@ With the CRUD factory declared, routes become thin wrappers. Each route uses [Ar
@router.get("/offset") @router.get("/offset")
async def list_articles_offset( async def list_articles_offset(
session: SessionDep, 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())], filter_by: Annotated[dict[str, list[str]], Depends(ArticleCrud.filter_params())],
order_by: Annotated[ order_by: Annotated[
OrderByClause | None, OrderByClause | None,
Depends(ArticleCrud.order_params(default_field=Article.created_at)), 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, search: str | None = None,
) -> OffsetPaginatedResponse[ArticleRead]: ) -> OffsetPaginatedResponse[ArticleRead]:
return await ArticleCrud.offset_paginate( return await ArticleCrud.offset_paginate(
session=session, session=session,
page=page, **params,
items_per_page=items_per_page,
search=search, search=search,
filter_by=filter_by or None, filter_by=filter_by or None,
order_by=order_by, 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") @router.get("/cursor")
async def list_articles_cursor( async def list_articles_cursor(
session: SessionDep, 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())], filter_by: Annotated[dict[str, list[str]], Depends(ArticleCrud.filter_params())],
order_by: Annotated[ order_by: Annotated[
OrderByClause | None, OrderByClause | None,
Depends(ArticleCrud.order_params(default_field=Article.created_at)), 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, search: str | None = None,
) -> CursorPaginatedResponse[ArticleRead]: ) -> CursorPaginatedResponse[ArticleRead]:
return await ArticleCrud.cursor_paginate( return await ArticleCrud.cursor_paginate(
session=session, session=session,
cursor=cursor, **params,
items_per_page=items_per_page,
search=search, search=search,
filter_by=filter_by or None, filter_by=filter_by or None,
order_by=order_by, order_by=order_by,
@@ -349,23 +351,20 @@ You can also expose a single endpoint that supports both strategies via a `pagin
@router.get("/") @router.get("/")
async def list_articles( async def list_articles(
session: SessionDep, 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())], filter_by: Annotated[dict[str, list[str]], Depends(ArticleCrud.filter_params())],
order_by: Annotated[ order_by: Annotated[
OrderByClause | None, OrderByClause | None,
Depends(ArticleCrud.order_params(default_field=Article.created_at)), 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, search: str | None = None,
) -> PaginatedResponse[ArticleRead]: ) -> PaginatedResponse[ArticleRead]:
return await ArticleCrud.paginate( return await ArticleCrud.paginate(
session, session,
pagination_type=pagination_type, **params,
page=page,
cursor=cursor,
items_per_page=items_per_page,
search=search, search=search,
filter_by=filter_by or None, filter_by=filter_by or None,
order_by=order_by, order_by=order_by,