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