module Sift

Here be dragons: there are two forms of metaprogramming in this file instance variables are being dynamically set based on the param name and we are class evaling `validates` to create dynamic validations based on the filters being validated.

Constants

VERSION

Public Instance Methods

filter_errors() click to toggle source
# File lib/procore-sift.rb, line 34
def filter_errors
  filter_validator.errors.messages
end
filter_params() click to toggle source
# File lib/procore-sift.rb, line 22
def filter_params
  params.fetch(:filters, {})
end
filters_valid?() click to toggle source
# File lib/procore-sift.rb, line 30
def filters_valid?
  filter_validator.valid?
end
filtrate(collection) click to toggle source
# File lib/procore-sift.rb, line 18
def filtrate(collection)
  Filtrator.filter(collection, params, filters)
end
sort_params() click to toggle source
# File lib/procore-sift.rb, line 26
def sort_params
  params.fetch(:sort, "").split(",") if filters.any? { |filter| filter.is_a?(Sort) }
end

Private Instance Methods

filter_on(parameter, type:, internal_name: parameter, default: nil, validate: nil, scope_params: [], tap: nil) click to toggle source
# File lib/procore-sift.rb, line 69
def filter_on(parameter, type:, internal_name: parameter, default: nil, validate: nil, scope_params: [], tap: nil)
  filters << Filter.new(parameter, type, internal_name, default, validate, scope_params, tap)
end
filter_validator() click to toggle source
# File lib/procore-sift.rb, line 40
def filter_validator
  @_filter_validator ||= FilterValidator.build(
    filters: filters,
    sort_fields: sort_fields,
    filter_params: filter_params,
    sort_params: sort_params,
  )
end
filters() click to toggle source
# File lib/procore-sift.rb, line 49
def filters
  self.class.ancestors
    .take_while { |klass| klass.name != "Sift" }
    .flat_map { |klass| klass.try(:filters) }
    .compact
    .uniq { |f| [f.param, f.class] }
end
reset_filters() click to toggle source

TODO: this is only used in tests, can I kill it?

# File lib/procore-sift.rb, line 78
def reset_filters
  @_filters = []
end
sort_fields() click to toggle source
# File lib/procore-sift.rb, line 61
def sort_fields
  self.class.ancestors
    .take_while { |klass| klass.name != "Sift" }
    .flat_map { |klass| klass.try(:sort_fields) }
    .compact
end
sort_on(parameter, type:, internal_name: parameter, scope_params: []) click to toggle source
# File lib/procore-sift.rb, line 86
def sort_on(parameter, type:, internal_name: parameter, scope_params: [])
  filters << Sort.new(parameter, type, internal_name, scope_params)
  sort_fields << parameter.to_s
  sort_fields << "-#{parameter}"
end
sorts_exist?() click to toggle source
# File lib/procore-sift.rb, line 57
def sorts_exist?
  filters.any? { |filter| filter.is_a?(Sort) }
end