class Fencepost::Gate

Attributes

allow_array[R]
deny_array[R]
model[R]
model_list[R]

Public Class Methods

new(model_list, params) click to toggle source
# File lib/fencepost/gate.rb, line 4
def initialize(model_list, params)
  @allow_array = []
  @deny_array = []
  @model_list = model_list
  @model = model
end

Public Instance Methods

allow(*elements) click to toggle source
# File lib/fencepost/gate.rb, line 17
def allow(*elements)
  @allow_array += elements
  self
end
allow_permissions(perms) click to toggle source
# File lib/fencepost/gate.rb, line 27
def allow_permissions(perms)
  hash_values(allow_array).each do |hash_value|
    perms = nested_operations(perms, hash_value, :+)
  end
  perms + scalar_values(allow_array)
end
build_permits(model, permits_array) click to toggle source
# File lib/fencepost/gate.rb, line 72
def build_permits(model, permits_array)
  model_attributes(model).each {|k| permits_array << k }
  model_nested_attributes(model).each do |nao, value|
    node = get_node(:nested_collection_name, nao)
    node = get_node(:demodulized_name, nao) if node.keys.size == 0
    node = node.values[0]
    permits_array << {node[:nested_attributes_name] => build_permits(node[:model], [])}
  end
  permits_array
end
deny(*elements) click to toggle source
# File lib/fencepost/gate.rb, line 22
def deny(*elements)
  @deny_array += elements
  self
end
deny_permissions(perms) click to toggle source
# File lib/fencepost/gate.rb, line 34
def deny_permissions(perms)
  hash_values(deny_array).each do |hash_value|
    perms = nested_operations(perms, hash_value, :-)
  end
  perms - scalar_values(deny_array)
end
get_node(key, value) click to toggle source
# File lib/fencepost/gate.rb, line 91
def get_node(key, value)
  self.model_list.select {|k,v| v[key] == value}
end
hash_values(arry) click to toggle source
# File lib/fencepost/gate.rb, line 45
def hash_values(arry)
  arry.select{|x| x.is_a?(Hash)}
end
model_attributes(model) click to toggle source
# File lib/fencepost/gate.rb, line 83
def model_attributes(model)
  get_node(:model, model).values[0][:attributes]
end
model_nested_attributes(model) click to toggle source
# File lib/fencepost/gate.rb, line 87
def model_nested_attributes(model)
  get_node(:model, model).values[0][:nested_attributes_options]
end
nested_operations(perms, hash, operator) click to toggle source
# File lib/fencepost/gate.rb, line 49
def nested_operations(perms, hash, operator)
  perms.each do |perm|
    hash.each do |key, value|
      set_permission_value(perm, key, value, operator)
    end
  end
end
open(params, key, model) click to toggle source
# File lib/fencepost/gate.rb, line 11
def open(params, key, model)
  perms = deny_permissions(allow_permissions(build_permits(model, [])))
  params = params.permit!.to_h if params.respond_to?(:permit!)
  ActionController::Parameters.new(params).require(key).permit(perms)
end
recurse_permissions(perm, key, value, operator) click to toggle source
# File lib/fencepost/gate.rb, line 64
def recurse_permissions(perm, key, value, operator)
  hash_values(perm[key]).each do |pk|
    hash_values(value).each do |hk|
      set_permission_value(pk, hk.keys[0], hk.values[0], operator)
    end
  end
end
scalar_values(arry) click to toggle source
# File lib/fencepost/gate.rb, line 41
def scalar_values(arry)
  arry.select{|x| x.is_a?(String) || x.is_a?(Symbol)}
end
set_permission_value(perm, key, value, operator) click to toggle source
# File lib/fencepost/gate.rb, line 57
def set_permission_value(perm, key, value, operator)
  if perm.is_a?(Hash) && perm.keys.index(key) && perm[key].is_a?(Array)
    perm[key] = perm[key].send(operator, value)
    recurse_permissions(perm, key, value, operator)
  end
end