""" Utility per paginazione standardizzata nelle API. """ from typing import Generic, TypeVar from pydantic import BaseModel, Field T = TypeVar("T") DEFAULT_PAGE_SIZE = 25 MAX_PAGE_SIZE = 100 class PaginationParams(BaseModel): page: int = Field(default=1, ge=1, description="Numero di pagina (1-based)") page_size: int = Field( default=DEFAULT_PAGE_SIZE, ge=1, le=MAX_PAGE_SIZE, description=f"Elementi per pagina (max {MAX_PAGE_SIZE})", ) @property def offset(self) -> int: return (self.page - 1) * self.page_size @property def limit(self) -> int: return self.page_size class PaginatedResponse(BaseModel, Generic[T]): """Risposta paginata generica.""" items: list[T] total: int page: int page_size: int pages: int @classmethod def create( cls, items: list[T], total: int, params: PaginationParams, ) -> "PaginatedResponse[T]": import math pages = math.ceil(total / params.page_size) if params.page_size > 0 else 0 return cls( items=items, total=total, page=params.page, page_size=params.page_size, pages=pages, )