Created
January 21, 2020 00:01
-
-
Save swilgosz/f9b8311ced6f029b89b0f04d7879ff95 to your computer and use it in GitHub Desktop.
A Pagination Meta Generator for fast_jsonapi gem integration.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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