class CanCan::ModelAdapters::ActiveGraphAdapter

neo4j adapter for cancan

Public Class Methods

all_conditions_match?(subject, conditions, base_class) click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 32
def self.all_conditions_match?(subject, conditions, base_class)
  return false unless subject
  conditions.all? do |key, value|
    if (relation = base_class.associations[key])
      match_relation_conditions(value, subject, relation)
    else
      property_matches?(subject, key, value)
    end
  end
end
for_class?(model_class) click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 19
def self.for_class?(model_class)
  model_class <= ActiveGraph::Node
end
match_relation_conditions(conditions, subject, association) click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 51
def self.match_relation_conditions(conditions, subject, association)
  rel_length = conditions.delete(:rel_length) if conditions.is_a?(Hash)
  subject = subject.send(association.name, rel_length: rel_length)
  return !subject.exists? if conditions.blank?
  return subject.exists? if conditions == true
  all_conditions_match?(subject, conditions, association.target_class)
end
matches_conditions_hash?(subject, conditions) click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 27
def self.matches_conditions_hash?(subject, conditions)
  base_class = subject.class
  all_conditions_match?(subject, conditions, base_class)
end
override_conditions_hash_matching?(_subject, _conditions) click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 23
def self.override_conditions_hash_matching?(_subject, _conditions)
  true
end
property_matches?(subject, property, value) click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 43
def self.property_matches?(subject, property, value)
  if subject.is_a?(ActiveGraph::Node::HasN::AssociationProxy)
    subject.where(property => value).exists?
  else
    subject.send(property) == value
  end
end

Public Instance Methods

database_records() click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 10
def database_records
  return @model_class.where('false') if @rules.empty?
  override_scope
  if (rule = logical_single_can_rule)
    return records_for_single_rule(rule)
  end
  records_for_multiple_rules.distinct
end

Private Instance Methods

construct_cypher_options() click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 83
def construct_cypher_options
  @rules.reverse.collect.with_index do |rule, index|
    opts = { rule: rule, model_class: @model_class, index: index }
    CanCanCan::ActiveGraph::RuleCypher.new(opts)
  end
end
logical_single_can_rule() click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 61
def logical_single_can_rule
  return @rules.first if @rules.size == 1
  return unless @rules.all?(&:base_behavior)
  @rules.find do |rule|
    conditions = rule.conditions
    conditions.is_a?(Hash) && conditions.blank?
  end
end
override_scope() click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 90
def override_scope
  conditions = @rules.map(&:conditions).compact
  return unless conditions.any? do |condition|
    condition.is_a?(ActiveGraph::Node::Query::QueryProxy)
  end
  return if conditions.size == 1
  return if conditions.select { |cn| cn.is_a?(Hash) && !cn.empty? }.empty?
  raise_override_scope_error
end
raise_override_scope_error() click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 100
def raise_override_scope_error
  rule_found = @rules.detect do |rule|
    rule.conditions.is_a?(ActiveGraph::Node::Query::QueryProxy)
  end
  raise Error,
        'Unable to merge an ActiveNode scope with other conditions. '\
        "Instead use a hash for #{rule_found.actions.first}"\
        " #{rule_found.subjects.first} ability."
end
records_for_multiple_rules() click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 75
def records_for_multiple_rules
  con = CanCanCan::ActiveGraph::CypherConstructor.new(construct_cypher_options)
  if (scope = con.scope)
    return scope
  end
  con.query.proxy_as(@model_class, var_name)
end
records_for_single_rule(rule) click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 70
def records_for_single_rule(rule)
  CanCanCan::ActiveGraph::SingleRuleCypher.new(rule, @model_class)
                                    .records
end
var_name() click to toggle source
# File lib/cancancan/model_adapters/active_graph_adapter.rb, line 110
def var_name
  CanCanCan::ActiveGraph::CypherConstructorHelper.var_name(@model_class)
end