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