module JSONAPI::ResourceActions::Pagination
def base_pagination_links(current, size, total)
def base_pagination_links(current, size, total) { self: pagination_url(current, size), first: pagination_url(1, size), last: pagination_url(total, size), } end
def build_pagination_links
def build_pagination_links page_params = parse_page_param current = page_params["number"]&.to_i || 1 size = calculate_page_size(page_params) total = calculate_total_pages(size) links = base_pagination_links(current, size, total) links[:prev] = pagination_url(current - 1, size) if current > 1 links[:next] = pagination_url(current + 1, size) if current < total links end
def build_pagination_meta
def build_pagination_meta { total: @total_count } end
def calculate_page_size(page_params)
def calculate_page_size(page_params) size = page_params["size"]&.to_i || JSONAPI.configuration.default_page_size [size, JSONAPI.configuration.max_page_size].min end
def calculate_total_pages(size)
def calculate_total_pages(size) total = (@total_count.to_f / size).ceil total.zero? ? 1 : total end
def pagination_url(page, size)
def pagination_url(page, size) query = request.query_parameters.dup query["page"] = { "number" => page, "size" => size } "#{request.path}?#{JSONAPI::ParamHelpers.build_query_string(query)}" end