/
parameter.go
79 lines (63 loc) · 1.37 KB
/
parameter.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package db
import (
"math"
"strconv"
"github.com/gin-gonic/gin"
)
const (
defaultLimit = "25"
defaultPage = "1"
defaultOrder = "desc"
)
type Parameter struct {
Filters map[string]string
Preloads string
Sort string
Limit int
Page int
LastID int
Order string
IsLastID bool
}
func NewParameter(c *gin.Context, model interface{}) (*Parameter, error) {
parameter := &Parameter{}
if err := parameter.initialize(c, model); err != nil {
return nil, err
}
return parameter, nil
}
func (self *Parameter) initialize(c *gin.Context, model interface{}) error {
self.Filters = filterToMap(c, model)
self.Preloads = c.Query("preloads")
self.Sort = c.Query("sort")
limit, err := validate(c.DefaultQuery("limit", defaultLimit))
if err != nil {
return err
}
self.Limit = int(math.Max(1, math.Min(10000, float64(limit))))
page, err := validate(c.DefaultQuery("page", defaultPage))
if err != nil {
return err
}
self.Page = int(math.Max(1, float64(page)))
lastID, err := validate(c.Query("last_id"))
if err != nil {
return err
}
if lastID != -1 {
self.IsLastID = true
self.LastID = int(math.Max(0, float64(lastID)))
}
self.Order = c.DefaultQuery("order", defaultOrder)
return nil
}
func validate(s string) (int, error) {
if s == "" {
return -1, nil
}
num, err := strconv.Atoi(s)
if err != nil {
return 0, err
}
return num, nil
}