78 lines
1.6 KiB
Go
78 lines
1.6 KiB
Go
// Package pagination provides types and helpers for paginated responses.
|
|
package pagination
|
|
|
|
import "strings"
|
|
|
|
const (
|
|
SortOrderAsc = "asc"
|
|
SortOrderDesc = "desc"
|
|
)
|
|
|
|
// PaginationParams 分页参数
|
|
type PaginationParams struct {
|
|
Page int
|
|
PageSize int
|
|
SortBy string
|
|
SortOrder string
|
|
}
|
|
|
|
// PaginationResult 分页结果
|
|
type PaginationResult struct {
|
|
Total int64
|
|
Page int
|
|
PageSize int
|
|
Pages int
|
|
}
|
|
|
|
// DefaultPagination 默认分页参数
|
|
func DefaultPagination() PaginationParams {
|
|
return PaginationParams{
|
|
Page: 1,
|
|
PageSize: 20,
|
|
SortOrder: SortOrderDesc,
|
|
}
|
|
}
|
|
|
|
// Offset 计算偏移量
|
|
func (p PaginationParams) Offset() int {
|
|
if p.Page < 1 {
|
|
p.Page = 1
|
|
}
|
|
return (p.Page - 1) * p.PageSize
|
|
}
|
|
|
|
// Limit 获取限制数
|
|
func (p PaginationParams) Limit() int {
|
|
if p.PageSize < 1 {
|
|
return 20
|
|
}
|
|
if p.PageSize > 1000 {
|
|
return 1000
|
|
}
|
|
return p.PageSize
|
|
}
|
|
|
|
// NormalizeSortOrder normalizes sort order to asc/desc and falls back to defaultOrder.
|
|
func NormalizeSortOrder(order string, defaultOrder string) string {
|
|
switch strings.ToLower(strings.TrimSpace(defaultOrder)) {
|
|
case SortOrderAsc:
|
|
defaultOrder = SortOrderAsc
|
|
default:
|
|
defaultOrder = SortOrderDesc
|
|
}
|
|
|
|
switch strings.ToLower(strings.TrimSpace(order)) {
|
|
case SortOrderAsc:
|
|
return SortOrderAsc
|
|
case SortOrderDesc:
|
|
return SortOrderDesc
|
|
default:
|
|
return defaultOrder
|
|
}
|
|
}
|
|
|
|
// NormalizedSortOrder returns the normalized sort order using defaultOrder as fallback.
|
|
func (p PaginationParams) NormalizedSortOrder(defaultOrder string) string {
|
|
return NormalizeSortOrder(p.SortOrder, defaultOrder)
|
|
}
|