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  }