2026-02-09 15:49:50 +05:30
|
|
|
"""Typed wrapper around fastapi-pagination for backend query helpers."""
|
|
|
|
|
|
2026-02-06 19:11:11 +05:30
|
|
|
from __future__ import annotations
|
|
|
|
|
|
|
|
|
|
from collections.abc import Awaitable, Callable, Sequence
|
2026-02-09 20:40:17 +05:30
|
|
|
from typing import TYPE_CHECKING, Any, TypeVar
|
2026-02-06 19:11:11 +05:30
|
|
|
|
|
|
|
|
from fastapi_pagination.ext.sqlalchemy import paginate as _paginate
|
|
|
|
|
|
|
|
|
|
from app.schemas.pagination import DefaultLimitOffsetPage
|
|
|
|
|
|
2026-02-09 15:49:50 +05:30
|
|
|
if TYPE_CHECKING:
|
2026-02-09 20:40:17 +05:30
|
|
|
from fastapi_pagination.limit_offset import LimitOffsetPage
|
2026-02-09 15:49:50 +05:30
|
|
|
from sqlmodel.ext.asyncio.session import AsyncSession
|
|
|
|
|
from sqlmodel.sql.expression import Select, SelectOfScalar
|
|
|
|
|
|
2026-02-06 19:11:11 +05:30
|
|
|
T = TypeVar("T")
|
|
|
|
|
|
2026-02-09 20:40:17 +05:30
|
|
|
Transformer = Callable[
|
|
|
|
|
[Sequence[Any]],
|
|
|
|
|
Sequence[Any] | Awaitable[Sequence[Any]],
|
|
|
|
|
]
|
2026-02-06 19:11:11 +05:30
|
|
|
|
|
|
|
|
|
|
|
|
|
async def paginate(
|
|
|
|
|
session: AsyncSession,
|
|
|
|
|
statement: Select[Any] | SelectOfScalar[Any],
|
|
|
|
|
*,
|
|
|
|
|
transformer: Transformer | None = None,
|
2026-02-09 20:40:17 +05:30
|
|
|
) -> LimitOffsetPage[T]:
|
2026-02-09 15:49:50 +05:30
|
|
|
"""Execute a paginated query and cast to the project page type alias."""
|
2026-02-09 20:40:17 +05:30
|
|
|
page = await _paginate(session, statement, transformer=transformer)
|
|
|
|
|
return DefaultLimitOffsetPage[T].model_validate(page)
|