Refactor pagination with cursor-based support and standardized response format
- Implement cursor-based pagination in pagination.py - Update response models to standardize pagination structure - Add cursor pagination utilities for repositories - Update HistoryArchiveRepository and ImportLogRepository with new pagination - Add comprehensive tests for cursor pagination - Update documentation for backend development and task tracking Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
@@ -125,16 +125,22 @@ class PaginationMetadata(BanGuiBaseModel):
|
||||
"""Pagination metadata embedded in paginated list responses.
|
||||
|
||||
Contains page information and computed fields to support frontend pagination controls.
|
||||
Supports both offset-based and cursor-based pagination modes.
|
||||
|
||||
Fields:
|
||||
page: Current page number (1-based).
|
||||
page: Current page number (1-based). Set to 1 for cursor pagination.
|
||||
page_size: Number of items per page.
|
||||
total: Total number of items matching the query (across all pages).
|
||||
For cursor pagination, this is -1 (unknown without full scan).
|
||||
total_pages: Computed total number of pages.
|
||||
For cursor pagination, this is -1 (unknown without full scan).
|
||||
has_next_page: Whether there is a next page after this one.
|
||||
has_prev_page: Whether there is a previous page before this one.
|
||||
Always False for cursor pagination (cannot navigate backward without storing history).
|
||||
cursor: Opaque cursor token for fetching the next page (cursor pagination only).
|
||||
None for offset pagination or when there are no more pages.
|
||||
|
||||
Example:
|
||||
Example (offset pagination):
|
||||
```python
|
||||
pagination = PaginationMetadata(
|
||||
page=2,
|
||||
@@ -142,17 +148,36 @@ class PaginationMetadata(BanGuiBaseModel):
|
||||
total=150,
|
||||
total_pages=3,
|
||||
has_next_page=True,
|
||||
has_prev_page=True
|
||||
has_prev_page=True,
|
||||
cursor=None
|
||||
)
|
||||
```
|
||||
|
||||
Example (cursor pagination):
|
||||
```python
|
||||
pagination = PaginationMetadata(
|
||||
page=1,
|
||||
page_size=50,
|
||||
total=-1,
|
||||
total_pages=-1,
|
||||
has_next_page=True,
|
||||
has_prev_page=False,
|
||||
cursor="eyJpZCI6IDQyN30="
|
||||
)
|
||||
```
|
||||
"""
|
||||
|
||||
page: int = Field(..., ge=1, description="Current page number (1-based).")
|
||||
page: int = Field(..., ge=1, description="Current page number (1-based). Set to 1 for cursor pagination.")
|
||||
page_size: int = Field(..., ge=1, description="Number of items per page.")
|
||||
total: int = Field(..., ge=0, description="Total number of items matching the query.")
|
||||
total_pages: int = Field(..., ge=1, description="Computed total number of pages.")
|
||||
total: int = Field(..., description="Total number of items matching the query. -1 if unknown (cursor pagination).")
|
||||
total_pages: int = Field(..., description="Computed total number of pages. -1 if unknown (cursor pagination).")
|
||||
has_next_page: bool = Field(..., description="Whether there is a next page after this one.")
|
||||
has_prev_page: bool = Field(..., description="Whether there is a previous page before this one.")
|
||||
cursor: str | None = Field(
|
||||
default=None,
|
||||
description="Opaque cursor token for fetching the next page (cursor pagination only).",
|
||||
)
|
||||
|
||||
|
||||
|
||||
class PaginatedListResponse(BanGuiBaseModel, Generic[T]):
|
||||
|
||||
Reference in New Issue
Block a user