Sha256: 856f654cdac967b04a542389e12ff93be9fdfba4849d70fa17b9e8986d9fc292

Contents?: true

Size: 1.35 KB

Versions: 5

Compression:

Stored size: 1.35 KB

Contents

# frozen_string_literal: true
module Might
  # Pagination middleware
  #
  class PaginationMiddleware
    # @param app [#call, Proc]
    # @param max_per_page [Integer]
    # @param per_page [Integer]
    #
    def initialize(app, max_per_page: false, per_page: 50, paginator_class: Paginator)
      @app = app
      @max_per_page = max_per_page
      @per_page = per_page
      @paginator_class = paginator_class
    end

    # @param [Array(ActiveRecord::Relation, Hash)] env
    # First argument is a ActiveRecord relation which must be paginated
    # Second argument is a request parameters provided by user
    #
    def call(env)
      scope, params = env

      paginated_scope = @paginator_class.new(pagination_options(params)).paginate(scope)
      app.call([paginated_scope, params])
    end

    private

    attr_reader :app

    # @param [Hash] params
    # @option params [Hash] (nil) :limit
    # @option params [Hash] (nil) :offset
    #
    def pagination_options(params)
      options = default_pagination_options.merge(Hash(params[:page]))
      max_per_page = @max_per_page

      if max_per_page && options[:limit] > max_per_page
        options.merge(limit: max_per_page)
      else
        options
      end
    end

    def default_pagination_options
      {
        limit: @per_page,
        offset: 0,
      }.with_indifferent_access
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
might-0.7.6 lib/might/pagination_middleware.rb
might-0.7.5 lib/might/pagination_middleware.rb
might-0.7.4 lib/might/pagination_middleware.rb
might-0.7.3 lib/might/pagination_middleware.rb
might-0.7.2 lib/might/pagination_middleware.rb