module Paradocs::Whitelist::ClassMethods

Public Instance Methods

filter!(payload, source_schema) click to toggle source
# File lib/paradocs/whitelist.rb, line 27
def filter!(payload, source_schema)
  schema  = source_schema.clone
  context = Context.new(nil, Top.new, @environment, source_schema.subschemes.clone)
  resolve(payload, schema, context)
end
resolve(payload, schema, context) click to toggle source
# File lib/paradocs/whitelist.rb, line 33
def resolve(payload, schema, context)
  filtered_payload = {}
  coercion_block = Paradocs.config.whitelist_coercion
  coercion_block = coercion_block.is_a?(Proc) && coercion_block
  payload.dup.each do |key, value|
    key    = key.to_sym
    schema = Schema.new if schema.nil?
    schema.send(:flush!)
    schema.send(:invoke_subschemes!, payload, context)
    meta = get_meta_data(schema, key)
    if value.is_a?(Hash)
      field_schema = find_schema_by(schema, key)
      value        = resolve(value, field_schema, context)
    elsif value.is_a?(Array)
      value = value.map do |v|
        if v.is_a?(Hash)
          field_schema = find_schema_by(schema, key)
          resolve(v, field_schema, context)
        else
          v = FILTERED unless whitelisted?(meta, key)
          v
        end
      end
    else

      value = if whitelisted?(meta, key)
        coercion_block ? coercion_block.call(value, meta) : value
      elsif value.nil? || value.try(:blank?) || value.try(:empty?)
        !!value == value ? value : EMPTY
      else
        FILTERED
      end
      value
    end
    filtered_payload[key] = value
  end

  filtered_payload
end

Private Instance Methods

find_schema_by(schema, key) click to toggle source
# File lib/paradocs/whitelist.rb, line 75
def find_schema_by(schema, key)
  meta = get_meta_data(schema, key)
  meta[:schema]
end
get_meta_data(schema, key) click to toggle source
# File lib/paradocs/whitelist.rb, line 84
def get_meta_data(schema, key)
  return {} unless schema.respond_to?(:fields)
  return {} unless schema.fields[key]
  return {} unless schema.fields[key].respond_to?(:meta_data)
  meta_data = schema.fields[key].meta_data || {}
end
whitelisted?(meta, key) click to toggle source
# File lib/paradocs/whitelist.rb, line 80
def whitelisted?(meta, key)
  meta[:whitelisted] || Paradocs.config.whitelisted_keys.include?(key)
end