class Validaform::Base
Attributes
fields[R]
status_code[RW]
Public Class Methods
new(params:)
click to toggle source
# File lib/validaform.rb, line 9 def initialize(params:) @fields = params.permit(fields: %i[name value]).to_h[:fields] @status_code = 200 end
Public Instance Methods
errors()
click to toggle source
fields => [
{ name: 'users/first_name', value: 'Asterix' }
] errors will return {
fields:[ { name: 'users/first_name', errors: ['too_short', 'too_long'], count: 2 } ], count: 2
}
# File lib/validaform.rb, line 29 def errors errors_hash = { fields: [] } parse_fields.map do |resource, fields| resource_class = resource_class(resource) dev_errors = handle_development_errors(resource, resource_class, fields) return dev_errors if dev_errors.present? generate_errors_hash(resource, resource_class, fields, errors_hash) end errors_hash[:count] = total_errors_count(errors_hash) errors_hash end
Private Instance Methods
fetch_object(fields, resource_class)
click to toggle source
# File lib/validaform.rb, line 90 def fetch_object(fields, resource_class) return resource_class.new(fields) if fields['id'].blank? resource_class.find_by(id: fields['id']).tap { |r| r.attributes = fields } end
form_errors_handler(resource)
click to toggle source
# File lib/validaform.rb, line 114 def form_errors_handler(resource) @status_code = 400 { code: 'NOT A DB MODEL', message: "#{resource} is not a DB model" } end
generate_errors_hash(resource, resource_class, fields, errors_hash)
click to toggle source
# File lib/validaform.rb, line 80 def generate_errors_hash(resource, resource_class, fields, errors_hash) # Create an instance of it and check if valid with the given attributes fetch_object(fields, resource_class).tap(&:valid?).errors.messages.each do |field, errors| next unless fields.keys.include?(field.to_s) errors_hash[:fields] << { name: "#{resource}/#{field}", errors: errors, count: errors.count } end end
handle_development_errors(resource, klass, fields)
click to toggle source
# File lib/validaform.rb, line 95 def handle_development_errors(resource, klass, fields) return not_defined_class_error(resource) if klass.nil? return not_db_model_error(resource) unless klass.ancestors.include?(ApplicationRecord) invalid_fields = fields.keys - klass.new.attributes.keys return invalid_fields_error(invalid_fields) if invalid_fields.present? return object_not_found_error(resource) if fields['id'] && !klass.find_by(id: fields['id']) nil end
invalid_fields_error(invalid_fields)
click to toggle source
# File lib/validaform.rb, line 119 def invalid_fields_error(invalid_fields) @status_code = 400 { code: 'INVALID FIELDS', message: "\"#{invalid_fields.join(', ')}\" aren't valid model fields" } end
not_defined_class_error(resource)
click to toggle source
# File lib/validaform.rb, line 109 def not_defined_class_error(resource) @status_code = 400 { code: 'INVALID RESOURCE', message: "#{resource} is not a valid resource" } end
object_not_found_error(resource)
click to toggle source
# File lib/validaform.rb, line 104 def object_not_found_error(resource) @status_code = 400 { code: 'RESOURCE NOT FOUND', message: "#{resource} not found on database" } end
parse_fields()
click to toggle source
fields => [
{ name: 'users/first_name', value: 'Asterix' }, { name: 'users/last_name', value: 'LeGaulois' }, { name: 'companies/name', value: 'PotionCorp' }
] parse_field transforms it to
{ users: { first_name: 'Asterix', last_name: 'LeGaulois' }, companies: { name: 'PotionCorp' } }
# File lib/validaform.rb, line 58 def parse_fields fields.each_with_object({}) do |f, h| h[f[:name].split('/').first] ||= {} h[f[:name].split('/').first][f[:name].split('/').last] = f[:value] end end
resource_class(resource)
click to toggle source
Get the model class of the given resource Ex: $ resource_class
('users')
> User¶ ↑
# File lib/validaform.rb, line 74 def resource_class(resource) resource.classify.constantize rescue NameError nil end
total_errors_count(errors_hash)
click to toggle source
Count the global errors count
# File lib/validaform.rb, line 66 def total_errors_count(errors_hash) errors_hash[:fields].map { |h| h[:count] }.reduce(:+) || 0 end