module HalApi::Controller::Filtering

Public Instance Methods

filter_facets() click to toggle source
# File lib/hal_api/controller/filtering.rb, line 58
def filter_facets
end
filters() click to toggle source
# File lib/hal_api/controller/filtering.rb, line 54
def filters
  @filters ||= parse_filters_param
end
index_collection() click to toggle source
Calls superclass method
# File lib/hal_api/controller/filtering.rb, line 61
def index_collection
  collection = defined?(super) ? super : HalApi::PagedCollection.new([])

  # add facets if defined, removing filters/facets with counts of 0
  non_zero_facets = (filter_facets || {}).with_indifferent_access.tap do |hash|
    hash.each do |filter_key, facets|
      hash[filter_key] = facets.try(:select) { |f| f.try(:[], :count) > 0 }
      hash.delete(filter_key) if hash[filter_key].blank?
    end
  end
  collection.facets = non_zero_facets unless non_zero_facets.blank?

  collection
end

Private Instance Methods

parse_date(str) click to toggle source
# File lib/hal_api/controller/filtering.rb, line 116
def parse_date(str)
  Date.parse(str)
rescue ArgumentError
  raise HalApi::Errors::BadFilterValueError.new "Invalid filter date: '#{str}'"
end
parse_filters_param() click to toggle source
# File lib/hal_api/controller/filtering.rb, line 78
def parse_filters_param
  filters_map = {}
  filters = self.class.allowed_filter_names
  force_types = self.class.allowed_filter_types

  # set nils
  filters.each do |name|
    filters_map[name] = nil
  end

  # parse query param
  (params[:filters] || '').split(',').each do |str|
    name, value = (str || '').split('=', 2)
    next unless filters_map.key?(name)

    # convert/guess type of known params
    filters_map[name] =
      if force_types[name] == 'date'
        parse_date(value)
      elsif force_types[name] == 'time'
        parse_time(value)
      elsif value.nil?
        true
      elsif value.blank?
        ''
      elsif [false, 'false'].include? value
        false
      elsif [true, 'true'].include? value
        true
      elsif value =~ /\A[-+]?\d+\z/
        value.to_i
      else
        value
      end
  end
  FilterParams.new(filters_map)
end
parse_time(str) click to toggle source
# File lib/hal_api/controller/filtering.rb, line 122
def parse_time(str)
  Time.find_zone('UTC').parse(str) || (raise ArgumentError.new 'Nil result!')
rescue ArgumentError
  raise HalApi::Errors::BadFilterValueError.new "Invalid filter time: '#{str}'"
end