-
Notifications
You must be signed in to change notification settings - Fork 3
/
parameter.go
111 lines (92 loc) · 2.61 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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package db
import (
"math"
"strconv"
"net/url"
)
const (
defaultLimit = "10"
maxLimit = 4294967295
defaultPage = "1"
defaultOrder = "desc"
)
// Parameter is the struct what contains parameters related to db
type Parameter struct {
Filters map[string]string
Preloads string
PreloadsFilterMap map[string]map[string]string
Sort string
Limit int
Page int
LastID int
Order string
IsLastID bool
IsPaginationEnabled bool
}
// NewParameter creates a new Parameter instance
func NewParameter(query url.Values) (*Parameter, error) {
parameter := &Parameter{}
if err := parameter.initialize(query); err != nil {
return nil, err
}
return parameter, nil
}
func (parameter *Parameter) getQueryArray(query url.Values, key string) ([]string, bool) {
if values, ok := query[key]; ok && len(values) > 0 {
return values, true
}
return []string{}, false
}
func (parameter *Parameter) getQuery(query url.Values, key string) (string, bool) {
if values, ok := parameter.getQueryArray(query, key); ok {
return values[0], ok
}
return "", false
}
// DefaultQuery get a query parameter. If key does not exist, it returns defaultValue
func (parameter *Parameter) DefaultQuery(query url.Values, key string, defaultValue string) string {
if value, ok := parameter.getQuery(query, key); ok {
return value
}
return defaultValue
}
func (parameter *Parameter) initialize(query url.Values) error {
parameter.Filters, parameter.PreloadsFilterMap = filterToMap(query)
parameter.Preloads = query.Get("preloads")
parameter.Sort = query.Get("sort")
if (len(query.Get("limit")) == 0) && (len(query.Get("page")) == 0) && (len(query.Get("last_id")) == 0) {
parameter.IsPaginationEnabled = false
} else {
parameter.IsPaginationEnabled = true
limit, err := validate(parameter.DefaultQuery(query, "limit", defaultLimit))
if err != nil {
return err
}
parameter.Limit = int(math.Max(1, math.Min(float64(maxLimit), float64(limit))))
page, err := validate(parameter.DefaultQuery(query, "page", defaultPage))
if err != nil {
return err
}
parameter.Page = int(math.Max(1, float64(page)))
lastID, err := validate(query.Get("last_id"))
if err != nil {
return err
}
if lastID != -1 {
parameter.IsLastID = true
parameter.LastID = int(math.Max(0, float64(lastID)))
}
}
parameter.Order = parameter.DefaultQuery(query, "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
}