module Grape::Formatter::Paginater

Attributes

endpoint[R]
env[R]
format[R]
original[R]
original_count[R]
page_requested[R]
total_pages[R]

Public Class Methods

call(object, env) click to toggle source
# File lib/paginater/formatter.rb, line 15
def call(object, env)
  
  @env = env
  @endpoint = env['api.endpoint']
  @format = env['api.format']
  @original = object
  
  check_params

  case endpoint.options[:route_options][:paginater]

  when KaminariParam
    Kaminari.configure do |config|
      config.default_per_page = 25 #=> 25?
    end
    if is_paginable? 
      # TODO consider also options as :limit => x and :offset => y
      @paginated = Kaminari.paginate_array(original.to_a).page(endpoint.params[:page]).per(endpoint.params[:size])
    else
      @paginated = original.page(endpoint.params[:page]).per(endpoint.params[:size])
    end
  
  when SimpleParam
    @paginated = paginate(original, endpoint.params[:page], endpoint.params[:size])
  
  when WrapperParam
    # deprecating...
    @paginated = wrap_content(paginate(original, endpoint.params[:page], endpoint.params[:size]))
  
  else
    @paginated = original
  end
  
  set_metadata

  case format
  when :txt
    return @paginated.to_s if @paginated.respond_to?(:to_s)
  when :json
    Grape::Formatter::Json.call(@paginated, env)
  else
    raise PaginaterError, "format #{format} unknown"
  end

end

Private Class Methods

check_params() click to toggle source
# File lib/paginater/formatter.rb, line 72
def check_params
  raise PaginaterError, "missing param" unless endpoint.params[:page]
  raise PaginaterError, "first page must be 1" if endpoint.params[:page].to_i < 1
  endpoint.params[:page] = endpoint.params[:page].to_i
  endpoint.params[:size] = (!endpoint.params[:size] || endpoint.params[:size] == '0') ? DefaultPageSize : endpoint.params[:size].to_i
  @page_requested = endpoint.params[:page] 
end
is_paginable?() click to toggle source
# File lib/paginater/formatter.rb, line 113
def is_paginable?
  original.is_a?(Enumerable)
  # original.is_a?(Array) || original.is_a?(Hash)
  # original.respond_to?(:to_a)
end
last_page?() click to toggle source
# File lib/paginater/formatter.rb, line 119
def last_page?
  @page_requested == page_count(@original_count, endpoint.params[:size])
end
log_me(text) click to toggle source
# File lib/paginater/formatter.rb, line 123
def log_me text
  Grape::API.logger.info "#{Time.now} >> #{text}"
end
set_headers() click to toggle source
# File lib/paginater/formatter.rb, line 95
def set_headers
  size_param = endpoint.params[:size] == 1 ? "" : "&size=#{endpoint.params[:size]}"
  first_link = { url: "#{env['PATH_INFO']}?page=#{1}#{size_param}", rel: META_FIRST}
  next_link = { url: "#{env['PATH_INFO']}?page=#{@page_requested+1}#{size_param}", rel: META_NEXT} unless last_page?
  prev_link = { url: "#{env['PATH_INFO']}?page=#{@page_requested-1}#{size_param}", rel: META_PREV} if @page_requested > 1
  endpoint.header(HEADER_LINK, [first_link.to_s,next_link.to_s,prev_link.to_s].join(';'))
end
set_metadata() click to toggle source
# File lib/paginater/formatter.rb, line 80
def set_metadata
  @total_pages = if @paginated.respond_to?(:total_pages)
      @paginated.total_pages
    else
      (@original.count/@paginated.count).ceil
    end 
  @original_count = if @original.respond_to?(:count)
      @original.count
    else
      1
    end
  set_cookie
  set_headers
end
wrap_content(content) click to toggle source
# File lib/paginater/formatter.rb, line 63
def wrap_content(content)
  object_paged = BasePage.new do |obj|
    obj.content = content
    obj.page = endpoint.params[:page]
    obj.size = endpoint.params[:size]
    obj.links = endpoint.header(HEADER_LINK)
  end
end