class Sift::FilterValidator

Attributes

filter_params[R]
sort_params[R]

Public Class Methods

build(filters:, sort_fields:, filter_params:, sort_params:) click to toggle source
# File lib/sift/filter_validator.rb, line 10
def self.build(filters:, sort_fields:, filter_params:, sort_params:)
  unique_validations_filters = filters.uniq(&:validation_field)

  klass = Class.new(self) do
    def self.model_name
      ActiveModel::Name.new(self, nil, "temp")
    end

    attr_accessor(*unique_validations_filters.map(&:validation_field))

    unique_validations_filters.each do |filter|
      if has_custom_validation?(filter, filter_params)
        validate filter.custom_validate
      elsif has_validation?(filter, filter_params, sort_fields)
        validates filter.validation_field.to_sym, filter.validation(sort_fields)
      end
    end
  end

  klass.new(filters, filter_params: filter_params, sort_params: sort_params)
end
has_custom_validation?(filter, filter_params) click to toggle source
# File lib/sift/filter_validator.rb, line 32
def self.has_custom_validation?(filter, filter_params)
  filter_params[filter.validation_field] && filter.custom_validate
end
has_validation?(filter, filter_params, sort_fields) click to toggle source
# File lib/sift/filter_validator.rb, line 36
def self.has_validation?(filter, filter_params, sort_fields)
  (filter_params[filter.validation_field] && filter.validation(sort_fields)) || filter.validation_field == :sort
end
model_name() click to toggle source
# File lib/sift/filter_validator.rb, line 14
def self.model_name
  ActiveModel::Name.new(self, nil, "temp")
end
new(filters, filter_params:, sort_params:) click to toggle source
# File lib/sift/filter_validator.rb, line 40
def initialize(filters, filter_params:, sort_params:)
  @filter_params = filter_params
  @sort_params = sort_params

  filters.each do |filter|
    instance_variable_set("@#{filter.validation_field}", to_type(filter))
  end
end

Private Instance Methods

to_type(filter) click to toggle source
# File lib/sift/filter_validator.rb, line 53
def to_type(filter)
  if filter.type == :boolean
    if Rails.version.starts_with?('5') || Rails.version.starts_with?('6')
      ActiveRecord::Type::Boolean.new.cast(filter_params[filter.param])
    else
      ActiveRecord::Type::Boolean.new.type_cast_from_user(filter_params[filter.param])
    end
  elsif filter.validation_field == :sort
    sort_params
  else
    filter_params[filter.param]
  end
end