Sha256: 3477d27a754349ef80b3208e2405b8c5b262f91e1159a2ba165b9670492faafe

Contents?: true

Size: 1.63 KB

Versions: 3

Compression:

Stored size: 1.63 KB

Contents

# frozen_string_literal: true

module Lcms
  module Engine
    class Pagination
      PARAMS_DEFAULT = { page: 1, per_page: 20, order: :asc }.freeze

      def initialize(params)
        @params = handle_params params
      end

      def params(strict: false)
        @pagination_params ||= begin
          expected_params = @params.slice(*PARAMS_DEFAULT.keys).symbolize_keys
          pagination = PARAMS_DEFAULT.merge(expected_params)

          pagination[:page] = pagination[:page].to_i
          pagination[:per_page] = pagination[:per_page].to_i
          pagination[:order] = pagination[:order].to_sym

          raise StandardError unless pagination[:page].positive?
          raise StandardError unless pagination[:per_page].positive?
          raise StandardError unless %i(asc desc).include? pagination[:order]

          pagination
        end
        strict ? @pagination_params.slice(:page, :per_page) : @pagination_params
      end

      def serialize(resources, serializer)
        options = { root: :results }
        options[:meta_key] = :pagination
        options[:pagination] = {
          total_pages: resources.total_pages,
          current_page: resources.current_page,
          per_page: resources.per_page,
          order: params[:order],
          total_hits: resources.total_entries
        }
        options[:each_serializer] = serializer
        ActiveModel::Serializer::CollectionSerializer.new(resources, options).as_json
      end

      private

      def handle_params(params)
        return params unless params.is_a?(ActionController::Parameters)

        params.permit(*PARAMS_DEFAULT.keys).to_h
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
lcms-engine-0.3.1 app/entities/lcms/engine/pagination.rb
lcms-engine-0.3.0 app/entities/lcms/engine/pagination.rb
lcms-engine-0.2.0 app/entities/lcms/engine/pagination.rb