module PagerApi::Pagination::Pagy

Public Instance Methods

paginate(*args) click to toggle source
# File lib/pager_api/pagination/pagy.rb, line 6
def paginate(*args)
  options = args.extract_options!
  collection = args.first

  pagy, paginated_collection = paginate_collection(collection, options)

  options[:json] = paginated_collection

  options[:meta] = meta(pagy, options) if PagerApi.include_pagination_on_meta?

  pagination_headers(pagy) if PagerApi.include_pagination_headers?

  render options
end

Private Instance Methods

meta(pagy, options = {}) click to toggle source
# File lib/pager_api/pagination/pagy.rb, line 75
def meta(pagy, options = {})
  {
    pagination: {
      per_page: pagy.items,
      total_pages: pagy.pages,
      total_objects: pagy.count,
      links: pagination_links(pagy),
    },
  }
end
pages(pagy) click to toggle source
# File lib/pager_api/pagination/pagy.rb, line 57
def pages(pagy)
  {}.tap do |paging|
    paging[:first] = 1
    paging[:last] = pagy.pages

    paging[:prev] = pagy.prev unless pagy.prev.nil?
    paging[:next] = pagy.next unless pagy.next.nil?
  end
end
paginate_collection(collection, options = {}) click to toggle source
# File lib/pager_api/pagination/pagy.rb, line 67
def paginate_collection(collection, options = {})
  options[:page] = params[:page] || 1
  options[:items] = options.delete(:per_page) || params[:per_page] || ::Pagy::VARS[:items]

  meta, collection = pagy(collection, options)
  [meta, collection]
end
pagination_headers(pagy) click to toggle source

Link: <example.com/api/v1/users?page=“2”>; rel=“next”, <example.com/api/v1//users?page=“5”>; rel=“last”, <example.com/api/v1//users?page=“1”>; rel=“first”, <example.com/api/v1/users?page=“1”>; rel=“prev”,

# File lib/pager_api/pagination/pagy.rb, line 27
def pagination_headers(pagy)
  links = (headers["Link"] || "").split(",").map(&:strip)
  clean_url = request.original_url.sub(/\?.*$/, "")

  paging_info = pages(pagy)

  paging_info.each do |key, value|
    query_params = request.query_parameters.merge(page: value)
    links << %Q{ <#{clean_url}?#{query_params.to_param}>; rel="#{key}" }
  end

  headers["Link"] = links.join(", ") unless links.empty?
  headers[PagerApi.total_pages_header] = pagy.pages
  headers[PagerApi.total_count_header] = pagy.count

  return nil
end