Sha256: 40834d8b9b688466d114fb9edce528bb4143d62dcf9717e5a0c4e0165ba955e2

Contents?: true

Size: 1.63 KB

Versions: 2

Compression:

Stored size: 1.63 KB

Contents

require 'grape'
require 'pagy'
require 'pagy/extras/arel'
require 'pagy/extras/array'
require 'pagy/extras/countless'
require 'pagy/extras/headers'
require 'pagy/extras/items'
require 'pagy/extras/overflow'

module Grape
  module Pagy
    Wrapper = Struct.new :request, :params do
      include ::Pagy::Backend

      def paginate(collection, using: nil, **opts, &block)
        pagy_with_items(opts)
        using ||= if collection.respond_to?(:arel_table)
                    :arel
                  elsif collection.is_a?(Array)
                    :array
                  end

        method = [:pagy, using].compact.join('_')
        page, scope = send(method, collection, **opts)

        pagy_headers(page).each(&block)
        scope
      end
    end

    module Helpers
      extend Grape::API::Helpers

      params :pagy do |items: nil, page: nil, **opts|
        items ||= ::Pagy::VARS[:items]
        page ||= ::Pagy::VARS[:page]
        page_param = opts[:page_param] || ::Pagy::VARS[:page_param]
        items_param = opts[:items_param] || ::Pagy::VARS[:items_param]

        @api.route_setting(:pagy_options, opts)
        optional page_param, type: Integer, default: page, desc: 'Page offset to fetch.'
        optional items_param, type: Integer, default: items, desc: 'Number of items to return per page.'
      end

      # @param [Array|ActiveRecord::Relation] collection the collection or relation.
      def pagy(collection, **opts)
        defaults = route_setting(:pagy_options) || {}
        Wrapper.new(request, params).paginate(collection, **defaults, **opts) do |key, value|
          header key, value
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
grape-pagy-0.3.1 lib/grape/pagy.rb
grape-pagy-0.3.0 lib/grape/pagy.rb