Sha256: 0b891ab27ef086a220912438976160462e465bec7c86af5f91666e85fca80640

Contents?: true

Size: 876 Bytes

Versions: 1

Compression:

Stored size: 876 Bytes

Contents

require 'addressable/uri'

module GearedPagination
  class Headers
    def initialize(page:, controller:)
      @page, @controller = page, controller
    end

    def apply
      @controller.headers.update(headers) if applicable?
    end

    private
      def headers
        Hash.new.tap do |h|
          h["X-Total-Count"] = @page.collection.records_count.to_s
          h["Link"] = next_page_link_header unless @page.last?
        end
      end

      def applicable?
        @controller.request.format&.json?
      end

      def next_page_link_header
        link_header(rel: :next, page_number: @page.next_number).to_s
      end

      def link_header(rel:, page_number:)
        uri = Addressable::URI.parse(@controller.request.url)
        uri.query_values = (uri.query_values || {}).merge("page" => page_number)
        %{<#{uri}>; rel="#{rel}"}
      end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
geared_pagination-0.1 lib/geared_pagination/headers.rb