pagination.py 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. """分页参数和返回结构。"""
  2. from __future__ import annotations
  3. from dataclasses import dataclass
  4. from math import ceil
  5. from typing import Any
  6. from dms.common.errors import InvalidArgumentError
  7. DEFAULT_PAGE = 1
  8. DEFAULT_PAGE_SIZE = 20
  9. MAX_PAGE_SIZE = 100
  10. @dataclass(frozen=True, slots=True)
  11. class PageRequest:
  12. page: int = DEFAULT_PAGE
  13. page_size: int = DEFAULT_PAGE_SIZE
  14. def __post_init__(self) -> None:
  15. if self.page < 1:
  16. raise InvalidArgumentError("page必须大于等于1")
  17. if self.page_size < 1 or self.page_size > MAX_PAGE_SIZE:
  18. raise InvalidArgumentError("pageSize必须在1到100之间")
  19. @property
  20. def offset(self) -> int:
  21. return (self.page - 1) * self.page_size
  22. def page_result(
  23. items: list[Any],
  24. *,
  25. page: int,
  26. page_size: int,
  27. total: int,
  28. ) -> dict[str, Any]:
  29. return {
  30. "items": items,
  31. "page": page,
  32. "pageSize": page_size,
  33. "total": total,
  34. "totalPages": ceil(total / page_size) if total else 0,
  35. }