@@ -2,7 +2,9 @@ package rest
2
2
3
3
import (
4
4
"context"
5
+ "fmt"
5
6
"net/http"
7
+ "net/url"
6
8
"strconv"
7
9
)
8
10
@@ -18,31 +20,28 @@ func listGet(ctx context.Context, r *http.Request, route *RouteMatch) (status in
18
20
// Default value on non HEAD request for limit is -1 (pagination disabled)
19
21
limit = - 1
20
22
}
21
- if l := route .Params .Get ("limit" ); l != "" {
22
- i , err := strconv .ParseUint (l , 10 , 32 )
23
+ if l , found , err := getUintParam (route .Params , "limit" ); found {
23
24
if err != nil {
24
- return 422 , nil , & Error { 422 , "Invalid `limit` parameter" , nil }
25
+ return 422 , nil , err
25
26
}
26
- limit = int ( i )
27
+ limit = l
27
28
}
28
29
skip := 0
29
- if o := route .Params .Get ("skip" ); o != "" {
30
- i , err := strconv .ParseUint (o , 10 , 32 )
30
+ if s , found , err := getUintParam (route .Params , "skip" ); found {
31
31
if err != nil {
32
- return 422 , nil , & Error { 422 , "Invalid `skip` parameter" , nil }
32
+ return 422 , nil , err
33
33
}
34
- skip = int ( i )
34
+ skip = s
35
35
}
36
36
page := 1
37
- if p := route .Params .Get ("page" ); p != "" {
38
- i , err := strconv .ParseUint (p , 10 , 32 )
37
+ if p , found , err := getUintParam (route .Params , "page" ); found {
39
38
if err != nil {
40
- return 422 , nil , & Error {422 , "Invalid `page` parameter" , nil }
41
- }
42
- page = int (i )
43
- if limit <= 0 {
44
- return 422 , nil , & Error {422 , "Cannot use `page' parameter with no `limit' parameter on a resource with no default pagination size" , nil }
39
+ return 422 , nil , err
45
40
}
41
+ page = p
42
+ }
43
+ if page > 1 && limit <= 0 {
44
+ return 422 , nil , & Error {422 , "Cannot use `page' parameter with no `limit' parameter on a resource with no default pagination size" , nil }
46
45
}
47
46
offset = (page - 1 )* limit + skip
48
47
}
@@ -65,3 +64,14 @@ func listGet(ctx context.Context, r *http.Request, route *RouteMatch) (status in
65
64
}
66
65
return 200 , nil , list
67
66
}
67
+
68
+ func getUintParam (params url.Values , name string ) (int , bool , error ) {
69
+ if v := params .Get (name ); v != "" {
70
+ i , err := strconv .ParseUint (v , 10 , 32 )
71
+ if err != nil {
72
+ return 0 , true , & Error {422 , fmt .Sprintf ("Invalid `%s` parameter" , name ), nil }
73
+ }
74
+ return int (i ), true , nil
75
+ }
76
+ return 0 , false , nil
77
+ }
0 commit comments