Sha256: 577a8318f55d50ef427316a7d34214fde38ba22bc1afb48bcbae969e8e10875b

Contents?: true

Size: 1.79 KB

Versions: 1

Compression:

Stored size: 1.79 KB

Contents

# frozen_string_literal: true

module EIVO
  module Concerns
    module Pagination
      extend ::ActiveSupport::Concern

      def paginate(collection, options = {})
        unless ::ActiveModel::Type::Boolean.new.cast(params[:pagination]) == false
          limit = 50
          if params[:limit]
            limit = [[params[:limit].to_i, 1].max, 500].min
          end

          collection = collection.page(params[:page]).per(limit)
          @serializer_options.merge!(pagination_options(collection))
        end

        collection
      end

      def pagination_options(collection)
        options = {
          is_collection: true,
          links: {
            self: url_for(params.to_unsafe_h.merge(page: collection.current_page)),
            first: url_for(params.to_unsafe_h.merge(page: 1)),
          }
        }

        # avoid count request on large table
        if params[:pagination] == 'infinite'
          options[:links][:next] = url_for(params.to_unsafe_h.merge(page: collection.current_page + 1))

          if !collection.first_page?
            options[:links][:prev] = url_for(params.to_unsafe_h.merge(page: collection.current_page - 1))
          end
        else
          options[:links][:last] = url_for(params.to_unsafe_h.merge(page: collection.total_pages))
          options[:meta] = {
            total: collection.total_count,
            pages: collection.total_pages
          }

          if !collection.out_of_range? && !collection.last_page?
            options[:links][:next] = url_for(params.to_unsafe_h.merge(page: collection.next_page))
          end
          if !collection.out_of_range? && !collection.first_page?
            options[:links][:prev] = url_for(params.to_unsafe_h.merge(page: collection.prev_page))
          end
        end

        options
      end
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
eivo-rails-api-0.1.14 app/controllers/eivo/concerns/pagination.rb