Class: Collavre::IntegrationSettings::Resolver

Inherits:
Object
  • Object
show all
Defined in:
lib/collavre/integration_settings/resolver.rb

Overview

Resolves the live value for a registered integration setting key.

Precedence: DB > ENV > registered default.

  • DB value wins as long as an ::Collavre::IntegrationSetting row exists with a non-blank value (encrypted at rest via ::Collavre::IntegrationSetting).
  • ENV is consulted only when no DB row exists.
  • The registry's static default is the final fallback.

Caching:

  • Sensitive definitions are NEVER cached. Rails.cache may resolve to a durable store (e.g. :solid_cache_store in production), which would persist decrypted secrets outside the encrypted value column and defeat at-rest encryption. Sensitive reads hit the DB every time.
  • Non-sensitive definitions are memoized in Rails.cache for 5 minutes under ::Collavre::IntegrationSetting.cache_key_for(key). The model's after_commit hook invalidates this key on any write.

Defined Under Namespace

Classes: UnknownKeyError

Constant Summary collapse

CACHE_TTL =
5.minutes

Class Method Summary collapse

Class Method Details

.get(key) ⇒ String?

Resolve the current value for a registered key.

Parameters:

  • key (Symbol, String)

Returns:

  • (String, nil)

Raises:



33
34
35
36
37
38
39
40
41
42
# File 'lib/collavre/integration_settings/resolver.rb', line 33

def get(key)
  definition = Registry.instance.find(key) or
    raise UnknownKeyError, "Unknown integration setting: #{key}"

  return resolve(definition) if definition.sensitive

  Rails.cache.fetch(::Collavre::IntegrationSetting.cache_key_for(definition.key), expires_in: CACHE_TTL) do
    resolve(definition)
  end
end

.source_for(key) ⇒ Symbol

Report which source currently provides the value for a key.

Parameters:

  • key (Symbol, String)

Returns:

  • (Symbol)

    one of :db, :env, :default, or :unknown



48
49
50
51
52
53
# File 'lib/collavre/integration_settings/resolver.rb', line 48

def source_for(key)
  definition = Registry.instance.find(key) or return :unknown
  return :db  if ::Collavre::IntegrationSetting.find_by(key: definition.key)&.value.present?
  return :env if ENV[definition.env_var].present?
  :default
end