Class: CanCan::ModelAdapters::Neo4jAdapter

Inherits:
AbstractAdapter
  • Object
show all
Defined in:
lib/cancancan/model_adapters/neo4j_adapter.rb

Overview

neo4j adapter for cancan

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.all_conditions_match?(subject, conditions, base_class) ⇒ Boolean

Returns:

  • (Boolean)


28
29
30
31
32
33
# File 'lib/cancancan/model_adapters/neo4j_adapter.rb', line 28

def self.all_conditions_match?(subject, conditions, base_class)
  asso_conditions, model_conditions = CanCanCan::Neo4j::CypherConstructorHelper
                                      .bifurcate_conditions(conditions)
  associations_conditions_match?(asso_conditions, subject, base_class) &&
    model_conditions_matches?(model_conditions, subject, base_class)
end

.associations_conditions_match?(conditions, subject, base_class) ⇒ Boolean

Returns:

  • (Boolean)


65
66
67
68
69
70
71
72
# File 'lib/cancancan/model_adapters/neo4j_adapter.rb', line 65

def self.associations_conditions_match?(conditions, subject, base_class)
  return true if conditions.blank?
  conditions.all? do |association, conditions_hash|
    current_model = base_class.associations[association].target_class
    current_subject = subject.send(association)
    all_conditions_match?(current_subject, conditions_hash, current_model)
  end
end

.for_class?(model_class) ⇒ Boolean

Returns:

  • (Boolean)


15
16
17
# File 'lib/cancancan/model_adapters/neo4j_adapter.rb', line 15

def self.for_class?(model_class)
  model_class <= Neo4j::ActiveNode
end

.matches_associations_relations(conditions, subject) ⇒ Object

checks if associations exists on given node



46
47
48
49
50
51
52
# File 'lib/cancancan/model_adapters/neo4j_adapter.rb', line 46

def self.matches_associations_relations(conditions, subject)
  return true if conditions.blank?
  conditions.all? do |association, value|
    association_exists = subject.send(association).exists?
    value ? association_exists : !association_exists
  end
end

.matches_attribute_conditions?(conditions, subject) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
57
58
59
60
61
62
63
# File 'lib/cancancan/model_adapters/neo4j_adapter.rb', line 54

def self.matches_attribute_conditions?(conditions, subject)
  return true if conditions.blank?
  if subject.is_a?(Neo4j::ActiveNode::HasN::AssociationProxy)
    subject.where(conditions).exists?
  else
    conditions.all? do |attribute, value|
      subject.send(attribute) == value
    end
  end
end

.matches_conditions_hash?(subject, conditions) ⇒ Boolean

Returns:

  • (Boolean)


23
24
25
26
# File 'lib/cancancan/model_adapters/neo4j_adapter.rb', line 23

def self.matches_conditions_hash?(subject, conditions)
  base_class = subject.class
  all_conditions_match?(subject, conditions, base_class)
end

.model_conditions_matches?(conditions, subject, base_class) ⇒ Boolean

Returns:

  • (Boolean)


35
36
37
38
39
40
41
42
43
# File 'lib/cancancan/model_adapters/neo4j_adapter.rb', line 35

def self.model_conditions_matches?(conditions, subject, base_class)
  return true if conditions.blank?
  conditions = conditions.partition do |key, _|
    base_class.associations_keys.include?(key)
  end
  associations_conditions, atrribute_conditions = conditions.map(&:to_h)
  matches_attribute_conditions?(atrribute_conditions, subject) &&
    matches_associations_relations(associations_conditions, subject)
end

.override_conditions_hash_matching?(_subject, _conditions) ⇒ Boolean

Returns:

  • (Boolean)


19
20
21
# File 'lib/cancancan/model_adapters/neo4j_adapter.rb', line 19

def self.override_conditions_hash_matching?(_subject, _conditions)
  true
end

Instance Method Details

#database_recordsObject



8
9
10
11
12
13
# File 'lib/cancancan/model_adapters/neo4j_adapter.rb', line 8

def database_records
  return @model_class.where('false') if @rules.empty?
  rule = @rules.first
  return rule.conditions if override_scope
  records_for_multiple_rules.distinct
end