class JSOM::Pagination::Links

Constants

DEFAULT_PAGE_SIZE

Attributes

next[R]
page[R]
prev[R]
self[R]
total_pages[R]
url[R]

Public Class Methods

new(page:, url:, total_pages:) click to toggle source
# File lib/jsom/pagination/links.rb, line 34
def initialize(page:, url:, total_pages:)
  @url = parse_url(url)
  @page = page
  @total_pages = total_pages
  generate_links
end

Public Instance Methods

first() click to toggle source
# File lib/jsom/pagination/links.rb, line 20
def first
  @first || generate_url(1)
end
last() click to toggle source
# File lib/jsom/pagination/links.rb, line 24
def last
  @last || generate_url(total_pages)
end
to_h() click to toggle source
# File lib/jsom/pagination/links.rb, line 10
def to_h
  {
    first: @first,
    prev: @prev,
    self: @self,
    next: @next,
    last: @last
  }.reject { |_key, value| value.nil? }
end

Private Instance Methods

generate_url(page_number) click to toggle source
# File lib/jsom/pagination/links.rb, line 65
def generate_url(page_number)
  separator = url.to_s.include?('?') ? '&' : '?'
  [url.to_s, url_params(page_number)].reject(&:empty?).join(separator)
end
include_page?(page_number) click to toggle source
# File lib/jsom/pagination/links.rb, line 98
def include_page?(page_number)
  page_number > 1
end
include_per_page?() click to toggle source
# File lib/jsom/pagination/links.rb, line 94
def include_per_page?
  page.size != DEFAULT_PAGE_SIZE
end
parse_url(url) click to toggle source
# File lib/jsom/pagination/links.rb, line 41
def parse_url(url)
  uri = Addressable::URI.parse(url)

  url_params = Rack::Utils.parse_nested_query(
    uri.query
  ).delete_if { |key, _value| key == 'page' }
  uri.query = to_query(url_params)
  uri.query = nil if uri.query.empty?
  uri
end
to_query(obj, namespace = '') click to toggle source
# File lib/jsom/pagination/links.rb, line 78
def to_query(obj, namespace = '')
  query = obj.collect do |key, value|
    if value.is_a?(Hash)
      to_query(value, namespace.empty? ? key : "#{namespace}[#{key}]")
    else
      if namespace.empty?
        [key, value].join('=')
      else
        ["#{namespace}[#{key}]", value].join('=')
      end
    end
  end.compact

  query.join('&')
end
url_params(page_number) click to toggle source
# File lib/jsom/pagination/links.rb, line 70
def url_params(page_number)
  url_params = {}
  url_params[:page] = {} if include_per_page? || include_page?(page_number)
  url_params[:page][:number] = page_number if include_page?(page_number)
  url_params[:page][:size] = page.size if include_per_page?
  to_query(url_params)
end