Class: SystemConfig

Inherits:
BarkestCore::DbTable show all
Defined in:
app/models/system_config.rb

Overview

Defines a mechanism to store and retrieve configurations using the core database.

The get and set methods allow values to be stored in an encrypted fashion as well.

The encryption will use the encrypted_config_key value or the secret_key_base value from secrets.yml. Ideally, use encrypted_config_key to allow secret_key_base to change if necessary.

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.get(key_name) ⇒ Object

Gets a value from the database.

If the value was stored encrypted, it will be decrypted before being returned.

As a feature during testing config/key_name.yml will be used if it exists and the database value is missing.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
# File 'app/models/system_config.rb', line 43

def self.get(key_name)
  begin
    record = where(key: key_name.to_s.downcase).first

    if record
      value = record.value
      if value.is_a?(Hash) && value.keys.include?(:encrypted_value)
        value = value[:encrypted_value]
        unless value.nil? || value == ''
          value = YAML.load(crypto_cipher.decrypt(value)) rescue nil
        end
      end
    elsif Rails.env.test?
      yml_file = "#{BarkestCore.app_root}/config/#{key_name}.yml"
      value = File.exist?(yml_file) ? YAML.load_file(yml_file) : nil
    else
      value = nil
    end

    value
  rescue
    nil # if 'system_configs' table has not been created, return nil.
  end
end

.set(key_name, value, encrypt = false) ⇒ Object

Stores a value to the database.

All values are converted into YAML strings before storage.

If encrypt is set to true, then the value will be encrypted before being stored.



74
75
76
77
78
79
80
81
82
83
# File 'app/models/system_config.rb', line 74

def self.set(key_name, value, encrypt = false)
  key_name = key_name.to_s.downcase
  if encrypt
    value = crypto_cipher.encrypt(value.to_yaml) unless value.nil? || value == ''
    value = { encrypted_value: value }
  end
  record = find_or_initialize_by(key: key_name)
  record.value = value
  record.save
end

Instance Method Details

#valueObject

Gets the value loading it from a YAML string.



29
30
31
32
33
# File 'app/models/system_config.rb', line 29

def value
  val = read_attribute(:value).to_s
  return nil if val.empty?
  YAML.load val
end

#value=(new_value) ⇒ Object

Sets the value storing it as a YAML string.



22
23
24
25
# File 'app/models/system_config.rb', line 22

def value=(new_value)
  val = new_value.nil? ? nil : new_value.to_yaml
  write_attribute :value, val
end