Sha256: 9a95ad986dd56396688efb7a1c8a78b77c98725696b1e0fa8af8fdcf5c3c7855

Contents?: true

Size: 974 Bytes

Versions: 7

Compression:

Stored size: 974 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
      attr_reader :page, :controller
      delegate :request, to: :controller

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

      def applicable?
        request.format&.json?
      end

      def next_page_link_header
        link_header(rel: :next, page: page.next_param).to_s
      end

      def link_header(rel:, page:)
        %{<#{uri(page: page)}>; rel="#{rel}"}
      end

      def uri(page:)
        Addressable::URI.parse(request.url).tap do |uri|
          uri.query_values = (uri.query_values || {}).merge("page" => page)
        end.to_s
      end
  end
end

Version data entries

7 entries across 7 versions & 1 rubygems

Version Path
geared_pagination-1.2.0 lib/geared_pagination/headers.rb
geared_pagination-1.1.2 lib/geared_pagination/headers.rb
geared_pagination-1.1.1 lib/geared_pagination/headers.rb
geared_pagination-1.1.0 lib/geared_pagination/headers.rb
geared_pagination-1.0.2 lib/geared_pagination/headers.rb
geared_pagination-1.0.1 lib/geared_pagination/headers.rb
geared_pagination-1.0.0 lib/geared_pagination/headers.rb