Sha256: b0dbe9d1e8daea78f6e82cb942f5a54129cc29b42c8132c28856f92ce52ed2bc

Contents?: true

Size: 1.12 KB

Versions: 8

Compression:

Stored size: 1.12 KB

Contents

# frozen_string_literal: true

module ApiMe
  class Sorting
    attr_accessor :sort_criteria, :sort_reverse, :scope

    def initialize(scope:, sort_params:)
      self.scope = scope
      return unless sort_params
      self.sort_criteria = sort_params[:criteria] || default_sort_criteria
      self.sort_reverse = sort_params[:reverse] || false
    end

    def results
      sorting? ? sort(sort_criteria).scope : scope
    end

    def sort_meta
      return {} unless sorting?
      {
        criteria: sort_meta_criteria,
        reverse: sort_reverse
      }
    end

    protected

    def sort_meta_criteria
      if sort_criteria.blank?
        default_sort_criteria
      else
        sort_criteria
      end
    end

    def sort(criteria = default_sort_criteria)
      self.scope = sorted_scope(criteria)
      self
    end

    def sorted_scope(criteria)
      if sort_reverse === 'true'
        scope.order(criteria => :desc)
      else
        scope.order(criteria => :asc)
      end
    end

    private

    def default_sort_criteria
      'id'
    end

    def sorting?
      sort_criteria || sort_reverse
    end
  end
end

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
api_me-0.12.0 lib/api_me/sorting.rb
api_me-0.11.1 lib/api_me/sorting.rb
api_me-0.10.7 lib/api_me/sorting.rb
api_me-0.10.6 lib/api_me/sorting.rb
api_me-0.10.5 lib/api_me/sorting.rb
api_me-0.10.4 lib/api_me/sorting.rb
api_me-0.10.3 lib/api_me/sorting.rb
api_me-0.10.2 lib/api_me/sorting.rb