trabajo-afectivo/app/models/setting.rb

188 lines
4.6 KiB
Ruby
Raw Normal View History

2014-02-03 19:23:00 +00:00
# Copyright (C) 2012-2014 Zammad Foundation, http://zammad-foundation.org/
class Setting < ApplicationModel
store :options
2015-09-25 14:37:55 +00:00
store :state_current
store :state_initial
2015-07-12 02:12:27 +00:00
store :preferences
before_create :state_check, :set_initial, :check_broadcast
before_update :state_check, :check_broadcast
after_create :reset_cache
after_update :reset_cache
after_destroy :reset_cache
2012-04-10 14:06:46 +00:00
2015-09-25 14:37:55 +00:00
attr_accessor :state
@@current = {} # rubocop:disable Style/ClassVars
@@change_id = nil # rubocop:disable Style/ClassVars
@@lookup_at = nil # rubocop:disable Style/ClassVars
@@lookup_timeout = if ENV['ZAMMAD_SETTING_TTL'] # rubocop:disable Style/ClassVars
ENV['ZAMMAD_SETTING_TTL'].to_i.seconds
2016-04-30 14:38:24 +00:00
elsif Rails.env.production?
2.minutes
2016-04-30 14:38:24 +00:00
else
15.seconds
end
=begin
2012-07-28 16:37:18 +00:00
set config setting
2012-07-28 16:37:18 +00:00
Setting.set('some_config_name', some_value)
=end
2012-04-10 14:06:46 +00:00
def self.set(name, value)
2016-03-25 09:27:52 +00:00
setting = Setting.find_by(name: name)
if !setting
2016-03-01 14:26:46 +00:00
raise "Can't find config setting '#{name}'"
end
2015-09-25 18:35:36 +00:00
setting.state_current = { value: value }
setting.save
logger.info "Setting.set(#{name}, #{value.inspect})"
end
=begin
get config setting
value = Setting.get('some_config_name')
=end
2012-04-10 14:06:46 +00:00
def self.get(name)
if load
logger.debug "Setting.get(#{name.inspect}) # no cache"
else
logger.debug "Setting.get(#{name.inspect}) # from cache"
end
@@current[:settings_config][name]
2012-04-10 14:06:46 +00:00
end
2012-07-28 16:37:18 +00:00
=begin
reset config setting to default
Setting.reset('some_config_name')
=end
def self.reset(name)
2016-03-25 09:27:52 +00:00
setting = Setting.find_by(name: name)
if !setting
2016-03-01 14:26:46 +00:00
raise "Can't find config setting '#{name}'"
end
2015-09-25 18:35:36 +00:00
setting.state_current = setting.state_initial
setting.save
logger.info "Setting.reset(#{name}, #{setting.state_current.inspect})"
load
@@current[:settings_config][name]
end
2016-01-13 19:45:51 +00:00
=begin
reload config settings
Setting.reload
=end
def self.reload
load(true)
end
2012-04-10 14:06:46 +00:00
private
# load values and cache them
2016-01-13 19:45:51 +00:00
def self.load(force = false)
# check if config is already generated
2016-01-13 19:45:51 +00:00
if !force && @@current[:settings_config]
return false if cache_valid?
end
# read all config settings
config = {}
2015-09-25 18:35:36 +00:00
Setting.select('name, state_current').order(:id).each { |setting|
config[setting.name] = setting.state_current[:value]
}
# config lookups
config.each { |key, value|
next if value.class.to_s != 'String'
2016-03-25 09:27:52 +00:00
config[key].gsub!(/\#\{config\.(.+?)\}/) {
config[$1].to_s
}
}
# store for class requests
cache(config)
true
end
private_class_method :load
# set initial value in state_initial
def set_initial
2015-09-25 18:35:36 +00:00
self.state_initial = state_current
end
# set new cache
def self.cache(config)
@@change_id = Cache.get('Setting::ChangeId') # rubocop:disable Style/ClassVars
@@current[:settings_config] = config
logger.debug "Setting.cache: set cache, #{@@change_id}"
@@lookup_at = Time.zone.now # rubocop:disable Style/ClassVars
end
private_class_method :cache
# reset cache
def reset_cache
@@change_id = rand(999_999_999).to_s # rubocop:disable Style/ClassVars
logger.debug "Setting.reset_cache: set new cache, #{@@change_id}"
Cache.write('Setting::ChangeId', @@change_id, { expires_in: 24.hours })
@@current[:settings_config] = nil
end
# check if cache is still valid
def self.cache_valid?
if @@lookup_at && @@lookup_at > Time.zone.now - @@lookup_timeout
#logger.debug 'Setting.cache_valid?: cache_id has beed set within last 2 minutes'
return true
end
change_id = Cache.get('Setting::ChangeId')
if change_id == @@change_id
@@lookup_at = Time.zone.now # rubocop:disable Style/ClassVars
logger.debug "Setting.cache_valid?: cache still valid, #{@@change_id}/#{change_id}"
return true
end
logger.debug "Setting.cache_valid?: cache has changed, #{@@change_id}/#{change_id}"
false
end
private_class_method :cache_valid?
2015-09-25 21:35:17 +00:00
# convert state into hash to be able to store it as store
def state_check
2015-09-25 21:35:17 +00:00
return if !state
2015-09-25 14:37:55 +00:00
return if state && state.respond_to?('has_key?') && state.key?(:value)
2015-09-25 18:35:36 +00:00
self.state_current = { value: state }
end
# notify clients about public config changes
def check_broadcast
return if frontend != true
value = state_current
if state_current.key?(:value)
value = state_current[:value]
end
Sessions.broadcast(
{
event: 'config_update',
data: { name: name, value: value }
},
'public'
)
end
2012-04-10 14:06:46 +00:00
end