mirror of
https://github.com/lingble/chatwoot.git
synced 2025-11-02 03:57:52 +00:00
* Renamed concern from Feature to Featurable * Feature: Installation config (#839) * Added new model installtion config with corresponding migrations and specs * Created an installation config yml (key value store model) * Created a config loader module to load the installaltion configs * Added this to the config loader seeder * Changed the account before create hook for default feature enabling to use the feature values from installtion config * Renamed the feature concern to Featurable to follow the naming pattern for concerns * Added comments and specs for modules and places that deemed necessary * Refactored config loader to reduce cognitive complexity (#839)
This commit is contained in:
84
lib/config_loader.rb
Normal file
84
lib/config_loader.rb
Normal file
@@ -0,0 +1,84 @@
|
||||
class ConfigLoader
|
||||
DEFAULT_OPTIONS = {
|
||||
config_path: nil,
|
||||
reconcile_only_new: true
|
||||
}.freeze
|
||||
|
||||
def process(options = {})
|
||||
options = DEFAULT_OPTIONS.merge(options)
|
||||
# function of the "reconcile_only_new" flag
|
||||
# if true,
|
||||
# it leaves the existing config and feature flags as it is and
|
||||
# creates the missing configs and feature flags with their default values
|
||||
# if false,
|
||||
# then it overwrites existing config and feature flags with default values
|
||||
# also creates the missing configs and feature flags with their default values
|
||||
@reconcile_only_new = options[:reconcile_only_new]
|
||||
|
||||
# setting the config path
|
||||
@config_path = options[:config_path].presence
|
||||
@config_path ||= Rails.root.join('config')
|
||||
|
||||
# general installation configs
|
||||
reconcile_general_config
|
||||
|
||||
# default account based feature configs
|
||||
reconcile_feature_config
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
def general_configs
|
||||
@general_configs ||= YAML.safe_load(File.read("#{@config_path}/installation_config.yml")).freeze
|
||||
end
|
||||
|
||||
def account_features
|
||||
@account_features ||= YAML.safe_load(File.read("#{@config_path}/features.yml")).freeze
|
||||
end
|
||||
|
||||
def reconcile_general_config
|
||||
general_configs.each do |config|
|
||||
new_config = config.with_indifferent_access
|
||||
existing_config = InstallationConfig.find_by(name: new_config[:name])
|
||||
save_general_config(existing_config, new_config)
|
||||
end
|
||||
end
|
||||
|
||||
def save_general_config(existing_config, new_config)
|
||||
if existing_config
|
||||
# save config only if reconcile flag is false and existing configs value does not match default value
|
||||
save_as_new_config(new_config) if !@reconcile_only_new && existing_config.value != new_config[:value]
|
||||
else
|
||||
save_as_new_config(new_config)
|
||||
end
|
||||
end
|
||||
|
||||
def save_as_new_config(new_config)
|
||||
config = InstallationConfig.new(name: new_config[:name])
|
||||
config.value = new_config[:value]
|
||||
config.save
|
||||
end
|
||||
|
||||
def reconcile_feature_config
|
||||
config = InstallationConfig.find_by(name: 'ACCOUNT_LEVEL_FEATURE_DEFAULTS')
|
||||
|
||||
if config
|
||||
return false if config.value.to_s == account_features.to_s
|
||||
|
||||
compare_and_save(config)
|
||||
else
|
||||
save_as_new_config({ name: 'ACCOUNT_LEVEL_FEATURE_DEFAULTS', value: account_features })
|
||||
end
|
||||
end
|
||||
|
||||
def compare_and_save_feature(config)
|
||||
features = if @reconcile_only_new
|
||||
# leave the existing feature flag values as it is and add new feature flags with default values
|
||||
(account_features + config.value).uniq { |h| h['name'] }
|
||||
else
|
||||
# update the existing feature flag values with default values and add new feature flags with default values
|
||||
(config.value + account_features).uniq { |h| h['name'] }
|
||||
end
|
||||
save_as_new_config({ name: 'ACCOUNT_LEVEL_FEATURE_DEFAULTS', value: features })
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user