Files
pargar/backend/internal/api/pagination.go
T

67 lines
1.3 KiB
Go
Raw Normal View History

package api
import (
"net/http"
"reflect"
"strconv"
)
const (
defaultPageSize = 10
maxPageSize = 100
)
type pageParams struct {
Page int
PageSize int
Offset int
}
// parsePageParams reads page + pageSize (or limit) from the query string.
// Defaults: page=1, pageSize=10. pageSize is capped at 100.
func parsePageParams(r *http.Request) pageParams {
page := 1
pageSize := defaultPageSize
if v := r.URL.Query().Get("page"); v != "" {
if n, err := strconv.Atoi(v); err == nil && n > 0 {
page = n
}
}
if v := r.URL.Query().Get("pageSize"); v != "" {
if n, err := strconv.Atoi(v); err == nil && n > 0 {
pageSize = n
}
} else if v := r.URL.Query().Get("limit"); v != "" {
if n, err := strconv.Atoi(v); err == nil && n > 0 {
pageSize = n
}
}
if pageSize > maxPageSize {
pageSize = maxPageSize
}
return pageParams{
Page: page,
PageSize: pageSize,
Offset: (page - 1) * pageSize,
}
}
func writePage(w http.ResponseWriter, items any, total int64, p pageParams) {
if items == nil {
items = []any{}
} else {
v := reflect.ValueOf(items)
if v.Kind() == reflect.Slice && v.IsNil() {
items = reflect.MakeSlice(v.Type(), 0, 0).Interface()
}
}
writeJSON(w, http.StatusOK, map[string]any{
"items": items,
"total": total,
"page": p.Page,
"pageSize": p.PageSize,
})
}