-
Notifications
You must be signed in to change notification settings - Fork 0
/
params.rb
281 lines (260 loc) · 10.9 KB
/
params.rb
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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
module RestingPug
# Describes transformations with params
# @used_in {Base.included}
module Params
protected
### PERMITTED FIELDS
# Returns an array with all fields that API can use
# @note Override this method to add or remove fields that you don't want API to use.
# @used_in {#permitted_fields_for_show}
# @used_in {#permitted_fields_for_create}
# @used_in {#permitted_fields_for_update}
# @used_in {#permitted_fields_for_sort}
# @used_in {#permitted_fields_for_filter}
# @use {Subject#subject_model}
# @example
# class BooksController < ApplicationController
# include RestingPug::Base
#
# private
# # Override a permitted_fields method to use only :id and :title
# def permitted_fields
# [:id, :title]
# end
# end
def permitted_fields
subject_model.column_names.map(&:to_sym)
end
# Returns an array with all fields that API will show
# @note Override this method to add or remove fields that you don't want API to show.
# @used_in {Render#render_subject}
# @used_in {Render#render_subjects}
# @use {#permitted_fields}
# @example
# class BooksController < ApplicationController
# include RestingPug::Base
#
# private
# # Override a permitted_fields_for_show method to show every permitted attribute except :title
# def permitted_fields_for_show
# permitted_fields - [:title]
# end
# end
def permitted_fields_for_show
permitted_fields
end
# Returns an array with all fields that API will allow to use while creating a subject
# @note Override this method to add or remove fields that you don't want API to use for creating.
# @used_in {#params_for_create}
# @use {#permitted_fields}
# @example
# class BooksController < ApplicationController
# include RestingPug::Base
#
# private
# # Override a permitted_fields_for_create method to use every permitted attribute except :title
# def permitted_fields_for_create
# permitted_fields - [:title]
# end
# end
def permitted_fields_for_create
permitted_fields - [:id, :created_at, :updated_at]
end
# Returns an array with all fields that API will allow to use while updating a subject
# @note Override this method to add or remove fields that you don't want API to use for updating.
# @used_in {#params_for_update}
# @use {#permitted_fields}
# @example
# class BooksController < ApplicationController
# include RestingPug::Base
#
# private
# # Override a permitted_fields_for_update method to use every permitted attribute except :title
# def permitted_fields_for_update
# permitted_fields - [:title]
# end
# end
def permitted_fields_for_update
permitted_fields - [:id, :created_at, :updated_at]
end
# Returns an array with all fields that API will allow to use while sorting subjects
# @note Override this method to add or remove fields that you don't want API to use for sorting.
# @used_in {#sort_params}
# @use {#permitted_fields}
# @example
# class BooksController < ApplicationController
# include RestingPug::Base
#
# private
# # Override a permitted_fields_for_sort method to use every permitted attribute except :title
# def permitted_fields_for_sort
# permitted_fields - [:title]
# end
# end
def permitted_fields_for_sort
permitted_fields
end
# Returns an array with all fields that API will allow to use while filtering subjects by single value
# @note Override this method to add or remove fields that you don't want API to use for filtering by single value.
# If you want to change attributes that can be filtered by arrays of values check {#permitted_fields_for_filter_arrays}
# @used_in {#permitted_fields_for_filter_arrays}
# @used_in {#permitted_fields_for_filter_with_arrays}
# @use {#permitted_fields}
# @example
# class BooksController < ApplicationController
# include RestingPug::Base
#
# private
# # Override a permitted_fields_for_sort method to use every permitted attribute except :title
# def permitted_fields_for_sort
# permitted_fields - [:title]
# end
# end
def permitted_fields_for_filter
permitted_fields - [:created_at, :updated_at]
end
# Returns an array with all fields that API will allow to use while filtering subjects by array of values
# @note Override this method to add or remove fields that you don't want API to use for filtering by array of values.
# If you want to change attributes that can be filtered by single value check {#permitted_fields_for_filter}
# @used_in {#permitted_fields_for_filter_with_arrays}
# @use {#permitted_fields_for_filter}
# @example
# class BooksController < ApplicationController
# include RestingPug::Base
#
# private
# # Override a permitted_fields_for_filter_arrays method to use only :id and :title
# def permitted_fields_for_filter_arrays
# { id: [], title: []}
# end
# end
def permitted_fields_for_filter_arrays
permitted_fields_for_filter.map { |field| { field => [] } }
end
# Returns an array with all fields that API will allow to use while filtering subjects both by single values and by array of values
# @note To set fields that can be used check {#permitted_fields_for_filter} and {#permitted_fields_for_filter_arrays}
# @used_in {#filter_params}
# @use {#permitted_fields_for_filter}
# @use {#permitted_fields_for_filter_arrays}
def permitted_fields_for_filter_with_arrays
permitted_fields_for_filter + permitted_fields_for_filter_arrays
end
# PARAMS
# Returns strong parameters which are used in creating action
# @note Override {#permitted_fields_for_create permitted_fields_for_create} to set allowed fields.
# Override {Subject#subject_model_sym subject_model_sym} to change the root attrubute of params.
# @see http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters
# @used_in {Subject#create_subject}
# @use {Subject#subject_model_sym}
# @use {#permitted_fields_for_create}
def params_for_create
params.require(subject_model_sym).permit(permitted_fields_for_create)
end
# Returns strong parameters which are used in updating action
# @note Override {#permitted_fields_for_update permitted_fields_for_update} to set allowed fields.
# Override {Subject#subject_model_sym subject_model_sym} to change the root attrubute of params.
# @see http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters
# @used_in {Subject#update_subject}
# @use {Subject#subject_model_sym}
# @use {#permitted_fields_for_update}
def params_for_update
params.require(subject_model_sym).permit(permitted_fields_for_update)
end
# FILTERING
# Returns strong parameters which are used for filtering subjects
# @note Override {#permitted_fields_for_filter permitted_fields_for_filter} and {#permitted_fields_for_filter_arrays permitted_fields_for_filter_arrays} to set allowed fields.
# @see http://guides.rubyonrails.org/action_controller_overview.html#strong-parameters
# @used_in {Modificators#filter_subjects}
# @use {#permitted_fields_for_filter_with_arrays}
def filter_params
params[:filter] ? params.require(:filter).permit(permitted_fields_for_filter_with_arrays) : nil
end
# SORT
# Transforms a string like "-id,name" to a hash { id: :desc, name: :asc }
# @note Override {#permitted_fields_for_sort permitted_fields_for_sort} to set allowed fields to sort.
# Override {#default_sort_params default_sort_params} to set default sort params.
# @used_in {Modificators#sort_subjects}
# @use {#permitted_fields_for_sort}
# @use {#default_sort_params}
def sort_params
sort_hash = nil
if params[:sort]
sort_array = params[:sort].split(',')
sort_array = sort_array.map do |field|
is_desc = field.split('-').count > 1
name = field.split('-').last
{ name: name.to_sym, is_desc: is_desc }
end
sort_array.select! do |field|
permitted_fields_for_sort.include? field[:name]
end
sort_array.each do |field|
sort_hash ||= {}
sort_hash[field[:name]] = field[:is_desc] ? :desc : :asc
end
end
sort_hash || default_sort_params
end
# Returns a hash with default sorting params
# @note Override {#permitted_fields_for_sort permitted_fields_for_sort} to set allowed fields to sort.
# @see http://guides.rubyonrails.org/active_record_querying.html#ordering
# @used_in {#sort_params}
# @example
# class BooksController < ApplicationController
# include RestingPug::Base
#
# private
# # Override a default_sort_params to set default sorting to sorted descending by title
# def default_sort_params
# { title: :desc }
# end
# end
def default_sort_params
{id: :desc}
end
# PAGINATION
# Handles pagination params and return a hash like { page: 1, per_page: 10 }
# @note Override {#per_page_range per_page_range} to set minimum and maximum per_page param.
# Override {#per_page_default per_page_default} to set default per_page param.
# @used_in {Modificators#paginate_subjects}
# @use {#per_page_range}
# @use {#per_page_default}
def pagination_params
page = params[:page].try(:to_i) || 1
per_page = [per_page_range[:min], params[:per_page].try(:to_i) || per_page_default, per_page_range[:max]].sort[1]
return { page: page, per_page: per_page }
end
# Returns a hash with minimum and maximum per_page param like { page: 1, per_page: 10 }
# @note Override {#per_page_default per_page_default} to set default per_page param.
# @used_in {#pagination_params}
# @example
# class BooksController < ApplicationController
# include RestingPug::Base
#
# private
# # Override a per_page_range to set minimum possible value for per_page 10 and maximum 20
# def per_page_range
# { min: 10, max: 20 }
# end
# end
def per_page_range
{ min: 5, max: 100 }
end
# Returns a default per_page param
# @note Override {#per_page_range per_page_range} to set minimum and maximum per_page param
# @used_in {#pagination_params}
# @example
# class BooksController < ApplicationController
# include RestingPug::Base
#
# private
# # Override a per_page_default to set default page size to 15
# def per_page_default
# 15
# end
# end
def per_page_default
10
end
end
end