Class: HaveAPI::ModelAdapters::ActiveRecord::Input
- Inherits:
-
HaveAPI::ModelAdapter::Input
- Object
- HaveAPI::ModelAdapter::Input
- HaveAPI::ModelAdapters::ActiveRecord::Input
- Defined in:
- lib/haveapi/model_adapters/active_record.rb
Class Method Summary collapse
- .clean(model, raw, extra) ⇒ Object
- .coerce_integer_id(raw, original) ⇒ Object
- .integer_pk?(model) ⇒ Boolean
Methods inherited from HaveAPI::ModelAdapter::Input
#[], #has_param?, #initialize, used_by
Constructor Details
This class inherits a constructor from HaveAPI::ModelAdapter::Input
Class Method Details
.clean(model, raw, extra) ⇒ Object
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 |
# File 'lib/haveapi/model_adapters/active_record.rb', line 168 def self.clean(model, raw, extra) original = raw allow_null = if extra extra.has_key?(:nullable) ? extra[:nullable] : extra[:optional] end if raw.nil? return nil if allow_null raise HaveAPI::ValidationError, "not a valid id #{original.inspect}" end if raw.is_a?(Array) || raw.is_a?(Hash) || [true, false].include?(raw) raise HaveAPI::ValidationError, "not a valid id #{original.inspect}" elsif raw.is_a?(String) stripped = raw.strip if stripped.empty? return nil if allow_null raise HaveAPI::ValidationError, "not a valid id #{original.inspect}" end raw = stripped end value = if integer_pk?(model) id = coerce_integer_id(raw, original) raise HaveAPI::ValidationError, "not a valid id #{original.inspect}" if id < 0 id else raw end ret = if extra[:fetch] model.instance_exec(value, &extra[:fetch]) else model.find(value) end if ret.nil? && !allow_null raise HaveAPI::ValidationError, 'resource not found' end ret rescue ::ActiveRecord::RecordNotFound raise HaveAPI::ValidationError, 'resource not found' rescue ArgumentError, TypeError raise HaveAPI::ValidationError, "not a valid id #{original.inspect}" end |
.coerce_integer_id(raw, original) ⇒ Object
229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 |
# File 'lib/haveapi/model_adapters/active_record.rb', line 229 def self.coerce_integer_id(raw, original) case raw when Integer raw when Float unless raw.finite? && (raw % 1) == 0 raise HaveAPI::ValidationError, "not a valid id #{original.inspect}" end raw.to_i when String s = raw.strip if s.empty? || !s.match?(/\A[+-]?\d+\z/) raise HaveAPI::ValidationError, "not a valid id #{original.inspect}" end Integer(s, 10) else raise HaveAPI::ValidationError, "not a valid id #{original.inspect}" end end |
.integer_pk?(model) ⇒ Boolean
220 221 222 223 224 225 226 227 |
# File 'lib/haveapi/model_adapters/active_record.rb', line 220 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 |