Sha256: 8c9ff7befbe15723e1fe9e60764b8837f2b725354f065a546f40afe4c46261bb

Contents?: true

Size: 1.3 KB

Versions: 1

Compression:

Stored size: 1.3 KB

Contents

module CursorPaginator
  class PaginationResult
    include Enumerable

    attr_reader :records_scope, :paginator

    delegate :each, :size, to: :records

    def initialize(records_scope, paginator)
      @records_scope = records_scope
      @paginator = paginator
    end

    def prev_cursor_params
      { before: prev_cursor }
    end

    def next_cursor_params
      { after: next_cursor }
    end

    def last_page?
      additional_record.blank?
    end

    private

    def prev_cursor
      return if paginator.cursor_direction.before? && last_page?
      return if records.empty?

      fetch_cursor(records.first)
    end

    def next_cursor
      return if paginator.cursor_direction.after? && last_page?
      return if records.empty?

      fetch_cursor(records.last)
    end

    def fetch_cursor(record)
      record.public_send(paginator.paginator_options.fetch(:primary_key))
    end

    def records
      @records ||= load_records
    end

    def additional_record
      load_records if @records.nil?

      @additional_record
    end

    def load_records
      records = paginator.take_records(records_scope, paginator.page_size + 1)
      @additional_record = records.pop if records.size > paginator.page_size
      paginator.cursor_direction.after? ? records : records.reverse
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
cursor_paginator-0.2.1 lib/cursor_paginator/pagination_result.rb