Skip to content

Instantly share code, notes, and snippets.

@swilgosz
Created January 21, 2020 00:01
Show Gist options
  • Save swilgosz/f9b8311ced6f029b89b0f04d7879ff95 to your computer and use it in GitHub Desktop.
Save swilgosz/f9b8311ced6f029b89b0f04d7879ff95 to your computer and use it in GitHub Desktop.
A Pagination Meta Generator for fast_jsonapi gem integration.
# frozen_string_literal: true
module Driggl
class PaginationMetaGenerator
DEFAULT_PAGE = 1
DEFAULT_PER_PAGE = 20
def initialize(request:, total_pages:)
@url = request.base_url + request.path
@page = (request.params[:page].presence || DEFAULT_PAGE).to_i
@per_page = request.params[:per_page].to_i
@total_pages = total_pages
end
def call
links = {}
if page > 1
links[:first] = generate_url(1)
links[:prev] = generate_url(page - 1)
end
links[:self] = generate_url(page)
if page < total_pages
links[:next] = generate_url(page + 1)
links[:last] = generate_url(total_pages)
end
links
end
private
attr_reader :per_page, :page, :total_pages
attr_accessor :url
def generate_url(page)
[url, url_params(page).presence].compact.join('?')
end
def url_params(page)
url_params = {}
url_params[:per_page] = per_page if include_per_page?
url_params[:page] = page if include_page?(page)
url_params.to_query
end
def include_per_page?
(per_page != 0) && (per_page != DEFAULT_PER_PAGE)
end
def include_page?(page)
(page > 1)
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment