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