# frozen_string_literal: true module ActiveRecordEncryptionConfig ENV_KEYS = %w[ ACTIVE_RECORD_ENCRYPTION_PRIMARY_KEY ACTIVE_RECORD_ENCRYPTION_DETERMINISTIC_KEY ACTIVE_RECORD_ENCRYPTION_KEY_DERIVATION_SALT ].freeze CONFIG_KEYS = %i[ primary_key deterministic_key key_derivation_salt ].freeze module_function def complete_env?(env = ENV) ENV_KEYS.all? { |key| env_value_present?(env, key) } end def partial_env?(env = ENV) present_count = ENV_KEYS.count { |key| env_value_present?(env, key) } present_count.positive? && present_count < ENV_KEYS.count end def missing_env_keys(env = ENV) ENV_KEYS.reject { |key| env_value_present?(env, key) } end def partial_env_message(env = ENV) "Active Record encryption environment variables are partially configured. Missing: #{missing_env_keys(env).join(', ')}" end def credentials_configured?(credentials = Rails.application.credentials) credentials.active_record_encryption.present? rescue NoMethodError false end def runtime_configured?(config = Rails.application.config.active_record.encryption) CONFIG_KEYS.all? { |key| config.public_send(key).present? } rescue NoMethodError false end def explicitly_configured? complete_env? || credentials_configured? end def ready? explicitly_configured? || runtime_configured? end def env_value_present?(env, key) env[key].present? end end