Sha256: a364ffffc75a26b91ddde30f85482caf071267f6eae60fe624d2b106391484ae

Contents?: true

Size: 1.25 KB

Versions: 6

Compression:

Stored size: 1.25 KB

Contents

# frozen_string_literal: true

module Kiev
  class ParamFilter
    FILTERED = "[FILTERED]"

    def self.filter(params, filtered_params, ignored_params)
      new(filtered_params, ignored_params).call(params)
    end

    def initialize(filtered_params, ignored_params)
      @filtered_params = normalize(filtered_params)
      @ignored_params = normalize(ignored_params)
    end

    def call(params)
      return params unless filterable?(params)

      params.each_with_object({}) do |(key, value), acc|
        next if ignored_params.include?(key.to_s)

        if defined?(ActionDispatch) && value.is_a?(ActionDispatch::Http::UploadedFile)
          value = {
            original_filename: value.original_filename,
            content_type: value.content_type,
            headers: value.headers
          }
        end

        acc[key] =
          if filtered_params.include?(key.to_s) && !value.is_a?(Hash)
            FILTERED
          elsif value.is_a?(Hash)
            call(value)
          else
            value
          end
      end
    end

    private

    attr_reader :filtered_params, :ignored_params

    def filterable?(params)
      params.respond_to?(:each_with_object)
    end

    def normalize(params)
      Set.new(params.map(&:to_s))
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
kiev-4.9.0 lib/kiev/param_filter.rb
kiev-4.8.3 lib/kiev/param_filter.rb
kiev-4.8.2 lib/kiev/param_filter.rb
kiev-4.8.1 lib/kiev/param_filter.rb
kiev-4.8.0 lib/kiev/param_filter.rb
kiev-4.7.0 lib/kiev/param_filter.rb