module HalApi::Controller::Filtering
Public Instance Methods
filter_facets()
click to toggle source
# File lib/hal_api/controller/filtering.rb, line 56 def filter_facets end
filters()
click to toggle source
# File lib/hal_api/controller/filtering.rb, line 52 def filters @filters ||= parse_filters_param end
index_collection()
click to toggle source
Calls superclass method
# File lib/hal_api/controller/filtering.rb, line 59 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 114 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 76 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 120 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