module Querifier module Queries module Order def collection super order @collection end def order return self if @ordered if valid_sort? # TODO: Permit multiple orders option = order_params.keys.first direction = order_params.fetch(option, nil) send("order_by_#{option}", direction) else order_by_default end @ordered = true self end def order_by_default order_by(*self.class.default_sort.to_a.flatten) end def order_by(option, direction) @collection = @collection.order(option => direction) end def valid_sort? option = order_params.keys.first direction = order_params.fetch(option, nil) option && direction && valid_option?(option) && %w[asc desc].include?(direction.to_s.downcase) end def valid_option?(option) self.class.order_attributes.include?(option.to_sym) end def method_missing(message, *args, &block) return order_by(Regexp.last_match(1).to_sym, *args) if message.to_s =~ /order_by_(.*)/ # rubocop:disable Performance/RegexpMatch, Metrics/LineLength super end def order_params @order_params ||= params.fetch(Config.order_param, {}).select { |(k, _)| valid_option? k.to_sym } end def self.included(klass) klass.extend(ClassMethods) end module ClassMethods @@order_attributes = [] @@default_sort = { id: :asc } def order_attributes(*value) return class_variable_set :@@order_attributes, [*value] if value.any? begin class_variable_get :@@order_attributes rescue NameError class_variable_set :@@order_attributes, [] class_variable_get :@@order_attributes end end def default_sort(value = nil) return class_variable_set :@@default_sort, value if value begin class_variable_get :@@default_sort rescue NameError class_variable_set :@@default_sort, { id: :asc } class_variable_get :@@default_sort end end end end end end