Class: HaveAPI::ModelAdapters::ActiveRecord::Input
Class Method Summary
collapse
#[], #has_param?, #initialize, used_by
Class Method Details
.clean(model, raw, extra) ⇒ Object
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
|
# File 'lib/haveapi/model_adapters/active_record.rb', line 171
def self.clean(model, raw, )
original = raw
allow_null = if
.has_key?(:nullable) ? [:nullable] : [:optional]
end
if raw.nil?
return nil if allow_null
raise invalid_id(original)
end
if raw.is_a?(Array) || raw.is_a?(Hash) || [true, false].include?(raw)
raise invalid_id(original)
elsif raw.is_a?(String)
stripped = raw.strip
if stripped.empty?
return nil if allow_null
raise invalid_id(original)
end
raw = stripped
end
value = if integer_pk?(model)
id = coerce_integer_id(raw, original)
raise invalid_id(original) if id < 0
id
else
raw
end
ret = if [:fetch]
model.instance_exec(value, &[:fetch])
else
model.find(value)
end
if ret.nil? && !allow_null
raise resource_not_found
end
ret
rescue ::ActiveRecord::RecordNotFound
raise resource_not_found
rescue ArgumentError, TypeError
raise invalid_id(original)
end
|
.coerce_integer_id(raw, original) ⇒ Object
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
|
# File 'lib/haveapi/model_adapters/active_record.rb', line 232
def self.coerce_integer_id(raw, original)
case raw
when Integer
raw
when Float
unless raw.finite? && (raw % 1) == 0
raise invalid_id(original)
end
raw.to_i
when String
s = raw.strip
if s.empty? || !s.match?(/\A[+-]?\d+\z/)
raise invalid_id(original)
end
Integer(s, 10)
else
raise invalid_id(original)
end
end
|
.integer_pk?(model) ⇒ Boolean
223
224
225
226
227
228
229
230
|
# File 'lib/haveapi/model_adapters/active_record.rb', line 223
def self.integer_pk?(model)
pk = model.primary_key
return false unless pk.is_a?(String)
return false unless model.respond_to?(:type_for_attribute)
pk_type = model.type_for_attribute(pk).type
%i[integer bigint].include?(pk_type)
end
|
.invalid_id(original) ⇒ Object
255
256
257
258
259
|
# File 'lib/haveapi/model_adapters/active_record.rb', line 255
def self.invalid_id(original)
HaveAPI::ValidationError.new(
HaveAPI.message('haveapi.validation.invalid_id', value: original.inspect)
)
end
|
.resource_not_found ⇒ Object
261
262
263
264
265
|
# File 'lib/haveapi/model_adapters/active_record.rb', line 261
def self.resource_not_found
HaveAPI::ValidationError.new(
HaveAPI.message('haveapi.validation.resource_not_found')
)
end
|