Sha256: 940b1e13712fe4427e2c8573fd68a3a50f5f4611541905a2eb73faf6f86c8c5d

Contents?: true

Size: 1.92 KB

Versions: 2

Compression:

Stored size: 1.92 KB

Contents

# frozen_string_literal: true

module JSOM
  module Pagination
    class Links
      DEFAULT_PAGE_SIZE = 20

      def to_h
        {
          first: @first,
          prev: @prev,
          self: @self,
          next: @next,
          last: @last
        }.reject { |_key, value| value.nil? }
      end

      def first
        @first || generate_url(1)
      end

      def last
        @last || generate_url(total_pages)
      end

      attr_reader :prev, :next, :self

      private

      attr_reader :page, :total_pages, :url

      def initialize(page:, url:, total_pages:)
        @url = url
        @page = page
        @total_pages = total_pages
        generate_links
      end

      def generate_links
        if page.number > 1
          @first = generate_url(1)
          @prev = generate_url(page.number - 1)
        end
        @self = generate_url(page.number)

        return unless page.number < total_pages

        @next = generate_url(page.number + 1)
        @last = generate_url(total_pages)
      end

      def generate_url(page_number)
        [url, url_params(page_number)].reject(&:empty?).join('?')
      end

      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

      def to_query(obj, namespace = nil)
        query = obj.collect do |key, value|
          if value.is_a?(Hash)
            to_query(value, namespace ? "#{namespace}[#{key}]" : key)
          else
            ["#{namespace}[#{key}]", value].join('=')
          end
        end.compact

        query.join('&')
      end

      def include_per_page?
        page.size != DEFAULT_PAGE_SIZE
      end

      def include_page?(page_number)
        page_number > 1
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
jsom-pagination-0.1.1 lib/jsom/pagination/links.rb
jsom-pagination-0.1.0 lib/jsom/pagination/links.rb