github.com/kyleu/dbaudit@v0.0.2-0.20240321155047-ff2f2c940496/app/controller/cutil/params.go (about) 1 // Package cutil - Content managed by Project Forge, see [projectforge.md] for details. 2 package cutil 3 4 import ( 5 "net/http" 6 "strconv" 7 "strings" 8 9 "github.com/kyleu/dbaudit/app/lib/filter" 10 ) 11 12 func ParamSetFromRequest(r *http.Request) filter.ParamSet { 13 ret := filter.ParamSet{} 14 for k, v := range r.URL.Query() { 15 if strings.Contains(k, ".") { 16 ret = apply(ret, k, strings.Join(v, ",")) 17 } 18 } 19 return ret 20 } 21 22 func apply(ps filter.ParamSet, qk string, qv string) filter.ParamSet { 23 switch { 24 case strings.HasSuffix(qk, filter.SuffixOrder): 25 curr := getCurr(ps, strings.TrimSuffix(qk, filter.SuffixOrder)) 26 asc := true 27 if strings.HasSuffix(qv, filter.SuffixDescending) { 28 asc = false 29 qv = qv[0 : len(qv)-2] 30 } 31 curr.Orderings = append(curr.Orderings, &filter.Ordering{Column: qv, Asc: asc}) 32 case strings.HasSuffix(qk, filter.SuffixLimit): 33 curr := getCurr(ps, strings.TrimSuffix(qk, filter.SuffixLimit)) 34 li, err := strconv.ParseInt(qv, 10, 32) 35 if err == nil { 36 curr.Limit = int(li) 37 maxCount := 100000 38 if curr.Limit > maxCount { 39 curr.Limit = maxCount 40 } 41 } 42 case strings.HasSuffix(qk, filter.SuffixOffset): 43 curr := getCurr(ps, strings.TrimSuffix(qk, filter.SuffixOffset)) 44 xi, err := strconv.ParseInt(qv, 10, 32) 45 if err == nil { 46 curr.Offset = int(xi) 47 } 48 } 49 return ps 50 } 51 52 func getCurr(q filter.ParamSet, key string) *filter.Params { 53 curr, ok := q[key] 54 if !ok { 55 curr = &filter.Params{Key: key} 56 q[key] = curr 57 } 58 return curr 59 }