1
1
defmodule ParamException do
2
- @ type t :: % __MODULE__ { message: String . t }
2
+ @ type t :: % __MODULE__ { message: String . t ( ) }
3
3
defexception [ :message ]
4
4
end
5
5
@@ -14,6 +14,7 @@ defmodule ServerUtils.Parsers.ParamsParser do
14
14
15
15
alias ServerUtils.Parsers.IntegerParser
16
16
alias ServerUtils.Page.PageParams
17
+ alias ServerUtils.Page.CursorPageRequest
17
18
18
19
@ page_size_key Application . get_env ( :server_utils , :page_size_key ) || "page_size"
19
20
@ page_number_key Application . get_env ( :server_utils , :page_number_key ) || "page_number"
@@ -22,6 +23,13 @@ defmodule ServerUtils.Parsers.ParamsParser do
22
23
@ default_page_size 25
23
24
@ default_max_page_size 100
24
25
26
+ @ cursor_key Application . get_env ( :server_utils , :cursor_key ) || "cursor"
27
+ @ page_number_of_items_key Application . get_env ( :server_utils , :number_of_items ) ||
28
+ "number_of_items"
29
+
30
+ @ default_cursor ""
31
+ @ default_number_of_items 25
32
+
25
33
@ doc """
26
34
Parses a page params from a request params map.
27
35
@@ -37,24 +45,75 @@ defmodule ServerUtils.Parsers.ParamsParser do
37
45
%PageParams{page_number: 5, page_size: 50}
38
46
39
47
"""
40
- @ spec parse_page_params ( Map . t ) :: PageParams . t
48
+ @ spec parse_page_params ( Map . t ( ) ) :: PageParams . t ( )
41
49
def parse_page_params ( params_map , opts \\ [ ] ) do
42
- default_page_number = opts [ :page_number ] || Application . get_env ( :server_utils , :page_number ) || @ default_page_number
43
- default_page_size = opts [ :page_size ] || Application . get_env ( :server_utils , :page_size ) || @ default_page_size
44
- max_page_size = opts [ :max_page_size ] || Application . get_env ( :server_utils , :max_page_size ) || @ default_max_page_size
50
+ default_page_number =
51
+ opts [ :page_number ] || Application . get_env ( :server_utils , :page_number ) ||
52
+ @ default_page_number
53
+
54
+ default_page_size =
55
+ opts [ :page_size ] || Application . get_env ( :server_utils , :page_size ) || @ default_page_size
56
+
57
+ max_page_size =
58
+ opts [ :max_page_size ] || Application . get_env ( :server_utils , :max_page_size ) ||
59
+ @ default_max_page_size
45
60
46
61
page_number = parse_integer_param ( params_map , @ page_number_key , default_page_number )
62
+
47
63
page_size =
48
64
case parse_integer_param ( params_map , @ page_size_key , default_page_size ) do
49
65
page_size when page_size > max_page_size ->
50
66
max_page_size
67
+
51
68
page_size ->
52
69
page_size
53
70
end
54
71
55
72
% PageParams { page_size: page_size , page_number: page_number }
56
73
end
57
74
75
+ @ doc """
76
+ Parses a page params from a cursor pagination request.
77
+
78
+ It returns the `CursorPageRequest.t` with the present values and with the default.
79
+
80
+ ## Examples
81
+
82
+ iex> ServerUtils.Parsers.ParamsParser.parse_cursor_page_request!(%{"page_number": 5, "page_size": 23})
83
+ %PageParams{page_number: 5, page_size: 23}
84
+
85
+ # With a configured max_page_size of 50
86
+ iex> ServerUtils.Parsers.ParamsParser.parse_cursor_page_request!(%{"page_number": 5, "page_size": 9000})
87
+ %PageParams{page_number: 5, page_size: 50}
88
+
89
+ """
90
+ @ spec parse_cursor_page_request ( Map . t ( ) ) :: CursorPageRequest . t ( )
91
+ def parse_cursor_page_request ( params_map , opts \\ [ ] ) do
92
+ default_cursor =
93
+ opts [ :cursor ] || Application . get_env ( :server_utils , :default_cursor ) || @ default_cursor
94
+
95
+ default_number_of_items =
96
+ opts [ :number_of_items ] || Application . get_env ( :server_utils , :default_number_of_items ) ||
97
+ @ default_number_of_items
98
+
99
+ max_number_of_items =
100
+ opts [ :max_page_size ] || Application . get_env ( :server_utils , :max_number_of_items ) ||
101
+ @ default_max_page_size
102
+
103
+ number_of_items =
104
+ case parse_integer_param ( params_map , @ page_number_of_items_key , default_number_of_items ) do
105
+ number_of_items when number_of_items > max_number_of_items ->
106
+ max_number_of_items
107
+
108
+ number_of_items ->
109
+ number_of_items
110
+ end
111
+
112
+ cursor = Map . get ( params_map , @ cursor_key , default_cursor )
113
+
114
+ % CursorPageRequest { cursor: cursor , number_of_items: number_of_items }
115
+ end
116
+
58
117
@ doc """
59
118
Parses a integer value from a request params map.
60
119
@@ -69,21 +128,20 @@ defmodule ServerUtils.Parsers.ParamsParser do
69
128
10
70
129
71
130
"""
72
- @ spec parse_integer_param ( Map . t , String . t , Integer . t ) :: Integer . t
131
+ @ spec parse_integer_param ( Map . t ( ) , String . t ( ) , Integer . t ( ) ) :: Integer . t ( )
73
132
def parse_integer_param ( params_map , attr_name , default ) do
74
133
case Map . get ( params_map , attr_name , default ) do
75
134
value when is_integer ( value ) -> value
76
135
value -> IntegerParser . parse_integer ( value , default )
77
136
end
78
137
end
79
138
80
- @ spec parse_integer_param! ( Map . t , String . t ) :: Integer . t
139
+ @ spec parse_integer_param! ( Map . t ( ) , String . t ( ) ) :: Integer . t ( )
81
140
def parse_integer_param! ( params_map , attr_name ) do
82
141
case Map . get ( params_map , attr_name ) do
83
142
nil -> raise ParamException , message: "Param not found"
84
143
value when is_integer ( value ) -> value
85
144
value -> IntegerParser . parse_integer! ( value )
86
145
end
87
146
end
88
-
89
147
end
0 commit comments