Class: Togls::RuleRepository

Inherits:
Object
  • Object
show all
Defined in:
lib/togls/rule_repository.rb

Overview

Rule Repository

The Rule Repository is the intended interface to store and retrieve rules. It does these by interfacing with Rule Repository Drivers which are passed in during construction as an Array.

Instance Method Summary collapse

Constructor Details

#initialize(drivers) ⇒ RuleRepository

Returns a new instance of RuleRepository.



8
9
10
11
12
13
14
15
16
# File 'lib/togls/rule_repository.rb', line 8

def initialize(drivers)
  unless drivers.is_a?(Array)
    raise Togls::InvalidDriver, 'RuleRepository requires a valid driver'
  end
  if drivers.empty?
    raise Togls::MissingDriver, 'RuleRepository requires a driver'
  end
  @drivers = drivers
end

Instance Method Details

#extract_storage_payload(rule) ⇒ Object



25
26
27
28
29
30
31
32
# File 'lib/togls/rule_repository.rb', line 25

def extract_storage_payload(rule)
  {
    'id' => rule.id.to_s,
    'type_id' => ::Togls.send(:rule_type_registry).get_type_id(rule.class.to_s),
    'data' => rule.data,
    'target_type' => rule.target_type.to_s
  }
end

#fetch_rule_data(id) ⇒ Object



34
35
36
37
38
39
40
41
# File 'lib/togls/rule_repository.rb', line 34

def fetch_rule_data(id)
  rule_data = nil
  @drivers.reverse.each do |driver|
    rule_data = driver.get(id)
    break if rule_data
  end
  rule_data
end

#get(rule_id) ⇒ Object



43
44
45
46
47
# File 'lib/togls/rule_repository.rb', line 43

def get(rule_id)
  rule_data = fetch_rule_data(rule_id)
  validate_rule_data(rule_data)
  reconstitute_rule(rule_data)
end

#reconstitute_rule(rule_data) ⇒ Object



70
71
72
73
74
75
76
77
78
79
80
# File 'lib/togls/rule_repository.rb', line 70

def reconstitute_rule(rule_data)
  if rule_data.has_key?('target_type')
    ::Togls.rule_type(rule_data['type_id'])\
      .new(rule_data['id'].to_sym, rule_data['type_id'].to_sym, rule_data['data'],
           target_type: rule_data['target_type'].to_sym)
  else
    ::Togls.rule_type(rule_data['type_id']).new(rule_data['id'].to_sym,
                                                rule_data['type_id'].to_sym,
                                                rule_data['data'])
  end
end

#store(rule) ⇒ Object



18
19
20
21
22
23
# File 'lib/togls/rule_repository.rb', line 18

def store(rule)
  rule_data = extract_storage_payload(rule)
  @drivers.each do |driver|
    driver.store(rule.id.to_s, rule_data)
  end
end

#validate_rule_data(rule_data) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/togls/rule_repository.rb', line 49

def validate_rule_data(rule_data)
  if rule_data.nil?
    Togls.logger.warn "None of the rule repository drivers claim to have the rule"
    raise Togls::RepositoryRuleDataInvalid, "None of the rule repository drivers claim to have the rule"
  end

  ['id', 'type_id', 'data', 'target_type'].each do |k|
    if !rule_data.has_key? k
      Togls.logger.warn "One of the rule repository drivers returned rule data that is missing the '#{k}'"
      raise Togls::RepositoryRuleDataInvalid, "One of the rule repository drivers returned rule data that is missing the '#{k}'"
    end
  end

  ['id', 'type_id', 'target_type'].each do |k|
    if !rule_data[k].is_a?(String)
      Togls.logger.warn "One of the rule repository drivers returned rule data with '#{k}' not being a string"
      raise Togls::RepositoryRuleDataInvalid, "One of the rule repository drivers returned rule data with '#{k}' not being a string"
    end
  end
end