pagination.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. // Package pagination provides types and helpers for paginated responses.
  2. package pagination
  3. import "strings"
  4. const (
  5. SortOrderAsc = "asc"
  6. SortOrderDesc = "desc"
  7. )
  8. // PaginationParams 分页参数
  9. type PaginationParams struct {
  10. Page int
  11. PageSize int
  12. SortBy string
  13. SortOrder string
  14. }
  15. // PaginationResult 分页结果
  16. type PaginationResult struct {
  17. Total int64
  18. Page int
  19. PageSize int
  20. Pages int
  21. }
  22. // DefaultPagination 默认分页参数
  23. func DefaultPagination() PaginationParams {
  24. return PaginationParams{
  25. Page: 1,
  26. PageSize: 20,
  27. SortOrder: SortOrderDesc,
  28. }
  29. }
  30. // Offset 计算偏移量
  31. func (p PaginationParams) Offset() int {
  32. if p.Page < 1 {
  33. p.Page = 1
  34. }
  35. return (p.Page - 1) * p.Limit()
  36. }
  37. // Limit 获取限制数
  38. func (p PaginationParams) Limit() int {
  39. if p.PageSize < 1 {
  40. return 20
  41. }
  42. if p.PageSize > 1000 {
  43. return 1000
  44. }
  45. return p.PageSize
  46. }
  47. // NormalizeSortOrder normalizes sort order to asc/desc and falls back to defaultOrder.
  48. func NormalizeSortOrder(order string, defaultOrder string) string {
  49. switch strings.ToLower(strings.TrimSpace(defaultOrder)) {
  50. case SortOrderAsc:
  51. defaultOrder = SortOrderAsc
  52. default:
  53. defaultOrder = SortOrderDesc
  54. }
  55. switch strings.ToLower(strings.TrimSpace(order)) {
  56. case SortOrderAsc:
  57. return SortOrderAsc
  58. case SortOrderDesc:
  59. return SortOrderDesc
  60. default:
  61. return defaultOrder
  62. }
  63. }
  64. // NormalizedSortOrder returns the normalized sort order using defaultOrder as fallback.
  65. func (p PaginationParams) NormalizedSortOrder(defaultOrder string) string {
  66. return NormalizeSortOrder(p.SortOrder, defaultOrder)
  67. }