module Yap::ParamsExtractor

Methods for extracting valid pagination parameters from rails params.

Public Instance Methods

build_order(sort, direction) click to toggle source
# File lib/yap/params_extractor.rb, line 79
def build_order(sort, direction)
  sort = extract_column(sort || DEFAULTS.sort)
  direction = extract_direction(direction)

  (sort =~ /\./ ? "#{sort} #{direction}" : { sort => direction })
end
build_order_from_array(sort, direction = []) click to toggle source
# File lib/yap/params_extractor.rb, line 56
def build_order_from_array(sort, direction = [])
  sort = convert_to_array(sort)
  direction = convert_to_array(direction)
  order = []
  sort.each_with_index do |s, i|
    order << build_order(s, direction[i] || DEFAULTS.direction)
  end

  order
end
build_order_from_hash(sort) click to toggle source
# File lib/yap/params_extractor.rb, line 73
def build_order_from_hash(sort)
  sort.map do |s, d|
    build_order(s, d)
  end
end
convert_to_array(object) click to toggle source
# File lib/yap/params_extractor.rb, line 67
def convert_to_array(object)
  object = object.split(',') if object.is_a?(String)

  Array.wrap(object)
end
extract_column(sort) click to toggle source
# File lib/yap/params_extractor.rb, line 86
def extract_column(sort)
  column = map_column(sort.to_s)
  raise PaginationError, "Cannot sort by '#{sort}'." unless column

  column
end
extract_direction(direction) click to toggle source
# File lib/yap/params_extractor.rb, line 93
def extract_direction(direction)
  direction ||= DEFAULTS.direction
  dir = direction.to_sym.downcase
  unless %i[asc desc].include? dir
    raise PaginationError, "'#{direction}' is not a valid direction. Use 'asc' or 'desc'."
  end

  dir
end
extract_number(number, default) click to toggle source
# File lib/yap/params_extractor.rb, line 30
def extract_number(number, default)
  number ||= default
  begin
    number = Integer(number)
  rescue ArgumentError
    raise PaginationError, "'#{number}' is not a valid number."
  end

  raise PaginationError, 'Only positive numbers are accepted.' unless number > 0

  number
end
extract_order(params) click to toggle source
# File lib/yap/params_extractor.rb, line 43
def extract_order(params)
  sort, direction = params.values_at(:sort, :direction)

  case sort
  when Array, String
    build_order_from_array(sort, direction)
  when Hash
    build_order_from_hash(sort)
  else # nil or symbol
    build_order sort, direction
  end
end
extract_page(params) click to toggle source
# File lib/yap/params_extractor.rb, line 16
def extract_page(params)
  extract_number(params[:page], DEFAULTS.page)
end
extract_pagination_params(params) click to toggle source
# File lib/yap/params_extractor.rb, line 8
def extract_pagination_params(params)
  page = extract_page(params)
  per_page = extract_per_page(params)
  sort = extract_order(params)

  [page, per_page, sort]
end
extract_per_page(params) click to toggle source
# File lib/yap/params_extractor.rb, line 20
def extract_per_page(params)
  per_page = extract_number(params[:per_page], DEFAULTS.per_page)

  if DEFAULTS.hard_limit && per_page > DEFAULTS.hard_limit
    raise PaginationError, "Not more than #{DEFAULTS.hard_limit} items per page accepted."
  end

  per_page
end