lib/json_api/support/concerns/pagination.rb



# frozen_string_literal: true

module JSONAPI
  module Support
    module Pagination
      def apply_pagination
        return @scope if page_params.empty?

        offset, size = calculate_pagination_params
        paginate_scope(offset, size)
      end

      private

      def calculate_pagination_params
        number = page_params["number"]&.to_i || 1
        size = page_params["size"]&.to_i || JSONAPI.configuration.default_page_size
        size = [size, JSONAPI.configuration.max_page_size].min
        offset = (number - 1) * size
        [offset, size]
      end

      def paginate_scope(offset, size)
        return @scope.slice(offset, size) || [] if @scope.is_a?(Array)

        @scope.offset(offset).limit(size)
      end
    end
  end
end