Sha256: 968d1462ff068f4aa7128118e878f3cda64e7f62864e6d9dce68ee71540c2651

Contents?: true

Size: 1.29 KB

Versions: 3

Compression:

Stored size: 1.29 KB

Contents

# frozen_string_literal: true

# Define filter rules
#
module QueryFilter
  module Rules
    class Scope
      VALIDATON_KEYS = [:in, :only, :format, :if, :unless].freeze

      attr_reader :keys

      def initialize(keys, options = {})
        @keys = Array(keys)
        @options = options
      end

      def blank_validation?
        (@options.keys & VALIDATON_KEYS).empty?
      end

      def valid?(params)
        values = normalize_params(params)

        checks = []
        checks << @options[:in].include?(values.first) if @options[:in]
        checks << @options[:only].include?(values.first) if @options[:only]
        checks << !values.map(&:blank?).all? if blank_validation?
        checks << @options[:intersect] & Array.wrap(values) if @options[:intersect]

        !checks.empty? && checks.all?
      end

      def endpoint
        @options[:to] || "#{name}_#{key}"
      end

      def name
        'scope'
      end

      def key
        @key ||= @keys.first
      end

      def normalize_params(params)
        params.values_at(*keys)
      end

      def can_apply?(target)
        conditions = QueryFilter::Utils::UserConditions.new(target, @options)

        if conditions.present?
          conditions.passed?
        else
          valid?(target.params)
        end
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
query_filter-0.2.3 lib/query_filter/rules/scope.rb
query_filter-0.2.2 lib/query_filter/rules/scope.rb
query_filter-0.2.0 lib/query_filter/rules/scope.rb