Sha256: 4ebc479a0247f2102a78d5c5d7ea2a6460a20ed1b58eb821af48a157b912cac8

Contents?: true

Size: 1.37 KB

Versions: 2

Compression:

Stored size: 1.37 KB

Contents

# require_relative 'validator'
require 'might/paginator'

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

2 entries across 2 versions & 1 rubygems

Version Path
might-0.7.1 lib/might/pagination_middleware.rb
might-0.7.0 lib/might/pagination_middleware.rb