// Copyright 2024 Patial Tech (Ankit Patial). // All rights reserved. package request import ( "net/http" "strconv" "strings" "code.patial.tech/go/appcore/ptr" ) type Pager struct { Search string OrderBy *string `json:"orderBy"` OrderAsc *bool `json:"orderAsc"` Page int `json:"page"` Size int `json:"size"` Total int `json:"total"` TotalNeeded bool `json:"-"` } func (i *Pager) HasSearch() bool { if i == nil { return false } return strings.TrimSpace(i.Search) != "" } func (i *Pager) Offset() int { if i == nil { return 0 } return (i.Page - 1) * i.Limit() } func (i *Pager) Limit() int { if i == nil || ptr.GetNumber(&i.Size) < 1 { return 20 } return i.Size } // GetPager info from request's query parameters func GetPager(r *http.Request) Pager { p := Pager{ Page: 1, Size: 20, OrderAsc: ptr.Bool(true), } if v := r.URL.Query().Get("q"); v != "" { p.Search = strings.TrimSpace(v) } if v := r.URL.Query().Get("pg"); v != "" { if vv, err := strconv.Atoi(v); err == nil { p.Page = int(vv) } } if v := r.URL.Query().Get("pg_s"); v != "" { if vv, err := strconv.Atoi(v); err == nil { p.Size = int(vv) } } if v := r.URL.Query().Get("pg_ob"); v != "" { p.OrderBy = &v } if v := r.URL.Query().Get("pg_o"); v != "" { switch strings.ToLower(v) { case "asc": p.OrderAsc = ptr.Bool(true) case "desc": p.OrderAsc = ptr.Bool(false) } } if v := r.URL.Query().Get("pg_t"); v == "n" { p.TotalNeeded = true } return p }