42 lines
1.1 KiB
Ruby
42 lines
1.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Api
|
|
module Paging
|
|
class IndexPaginator
|
|
def initialize(query_base, current_page, limit)
|
|
@query_base = query_base
|
|
@current_page = current_page.to_i
|
|
@limit = limit.to_i
|
|
end
|
|
|
|
def page_data
|
|
@page_data ||= @query_base.paginate(page: @current_page, per_page: @limit)
|
|
@max_page = (@query_base.count * 1.0 / @limit * 1.0).ceil
|
|
@max_page = 1 if @max_page < 1
|
|
@page_data
|
|
end
|
|
|
|
def next_page(for_url=true)
|
|
page_data
|
|
return nil if for_url && @current_page == @max_page
|
|
|
|
return "page=#{@current_page + 1}" if for_url
|
|
|
|
IndexPaginator.new(@query_base, @current_page + 1, @limit)
|
|
end
|
|
|
|
def previous_page(for_url=true)
|
|
page_data
|
|
return nil if for_url && @current_page == 1
|
|
|
|
return "page=#{@current_page - 1}" if for_url
|
|
|
|
IndexPaginator.new(@query_base, @current_page - 1, @limit)
|
|
end
|
|
|
|
def filter_parameters(parameters)
|
|
parameters.delete(:page)
|
|
end
|
|
end
|
|
end
|
|
end
|