Merge pull request #1659 from internetee/1629-change-settings-storage-mechanism

Replace rails-settings-cached with custom approach
This commit is contained in:
Timo Võhmar 2020-08-26 12:56:33 +03:00 committed by GitHub
commit 8da95a5e43
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
23 changed files with 1050 additions and 258 deletions

View file

@ -3,21 +3,23 @@ module Admin
load_and_authorize_resource
def index
@settings = Setting.unscoped
@settings = SettingEntry.unscoped
@validation_settings = SettingEntry.with_group('domain_validation')
@expiration_settings = SettingEntry.with_group('domain_expiration')
@other_settings = SettingEntry.with_group('other')
.where.not(code: 'default_language')
@billing_settings = SettingEntry.with_group('billing')
@contacts_settings = SettingEntry.with_group('contacts')
end
def create
@errors = Setting.params_errors(casted_settings)
if @errors.empty?
casted_settings.each do |k, v|
Setting[k] = v
end
update = SettingEntry.update(casted_settings.keys, casted_settings.values)
if update
flash[:notice] = t('.saved')
redirect_to [:admin, :settings]
redirect_to %i[admin settings]
else
flash[:alert] = @errors.values.uniq.join(", ")
render "admin/settings/index"
flash[:alert] = update.errors.values.uniq.join(', ')
render 'admin/settings/index'
end
end
@ -27,10 +29,7 @@ module Admin
settings = {}
params[:settings].each do |k, v|
settings[k] = v
settings[k] = v.to_i if Setting.integer_settings.include?(k.to_sym)
settings[k] = v.to_f if Setting.float_settings.include?(k.to_sym)
settings[k] = (v == 'true' ? true : false) if Setting.boolean_settings.include?(k.to_sym)
settings[k] = { value: v }
end
settings

View file

@ -8,7 +8,7 @@ module Concerns
end
def legaldoc_not_mandatory?
setting = Setting.find_by(var: 'legal_document_is_mandatory')&.value
setting = Setting.legal_document_is_mandatory
legaldoc_optout || !setting
end
end

View file

@ -1,74 +1,5 @@
class Setting < RailsSettings::Base
include Versions # version/setting_version.rb
source Rails.root.join('config', 'app.yml')
# frozen_string_literal: true
# When config/app.yml has changed, you need change this prefix to v2, v3 ... to expires caches
cache_prefix { 'v2' }
def self.reload_settings!
STDOUT << "#{Time.zone.now.utc} - Clearing settings cache\n"
Rails.cache.delete_matched('settings:.*')
STDOUT << "#{Time.zone.now.utc} - Settings cache cleared\n"
end
# cannot do instance validation because CachedSetting use save!
def self.params_errors(params)
errors = {}
# DS data allowed and Allow key data cannot be both true
if !!params["key_data_allowed"] && params["key_data_allowed"] == params["ds_data_allowed"]
msg = "#{I18n.t(:key_data_allowed)} and #{I18n.t(:ds_data_with_key_allowed)} cannot be both true"
errors["key_data_allowed"] = msg
errors["ds_data_allowed"] = msg
end
return errors
end
def self.integer_settings
%i[
admin_contacts_min_count
admin_contacts_max_count
tech_contacts_min_count
tech_contacts_max_count
orphans_contacts_in_months
ds_digest_type
dnskeys_min_count
dnskeys_max_count
ns_min_count
ns_max_count
transfer_wait_time
invoice_number_min
invoice_number_max
days_to_keep_invoices_active
days_to_keep_overdue_invoices_active
days_to_renew_domain_before_expire
expire_warning_period
redemption_grace_period
expire_pending_confirmation
dispute_period_in_months
]
end
def self.float_settings
%i[
registry_vat_prc
minimum_deposit
]
end
def self.boolean_settings
%i[
ds_data_allowed
key_data_allowed
client_side_status_editing_enabled
registrar_ip_whitelist_enabled
api_ip_whitelist_enabled
request_confrimation_on_registrant_change_enabled
request_confirmation_on_domain_deletion_enabled
nameserver_required
address_processing
legal_document_is_mandatory
]
end
class Setting < SettingEntry
# Bridge Setting calls to SettingEntry, so we don't have to drop legacy settings yet
end

View file

@ -0,0 +1,92 @@
class SettingEntry < ApplicationRecord
include Versions
validates :code, presence: true, uniqueness: true, format: { with: /\A([a-z])[a-z|_]+[a-z]\z/ }
validates :format, presence: true
validates :group, presence: true
validate :validate_value_format
validate :validate_code_is_not_using_reserved_name
before_update :replace_boolean_nil_with_false
VALUE_FORMATS = {
string: :string_format,
integer: :integer_format,
float: :float_format,
boolean: :boolean_format,
hash: :hash_format,
array: :array_format,
}.with_indifferent_access.freeze
def retrieve
method = VALUE_FORMATS[format]
return false if self.format == 'boolean' && value.blank?
return if value.blank?
send(method)
end
def self.with_group(group_name)
SettingEntry.order(id: :asc).where(group: group_name)
end
# rubocop:disable Style/MethodMissingSuper
# rubocop:disable Style/MissingRespondToMissing
def self.method_missing(method, *args)
super(method, *args)
rescue NoMethodError
get_or_set(method.to_s, args[0])
end
# rubocop:enable Style/MissingRespondToMissing
# rubocop:enable Style/MethodMissingSuper
def self.get_or_set(method_name, arg)
if method_name[-1] == '='
SettingEntry.find_by!(code: method_name.sub('=', '')).update(value: arg.to_s)
else
stg = SettingEntry.find_by(code: method_name)
stg ? stg.retrieve : nil
end
end
# Hooks
def replace_boolean_nil_with_false
return unless self.format == 'boolean'
return if value == 'true'
self.value = 'false'
end
def validate_code_is_not_using_reserved_name
disallowed = []
ActiveRecord::Base.instance_methods.sort.each { |m| disallowed << m.to_s }
errors.add(:code, :invalid) if disallowed.include? code
end
def validate_value_format
formats = VALUE_FORMATS.with_indifferent_access
errors.add(:format, :invalid) unless formats.keys.any? format
end
def string_format
value
end
def integer_format
value.to_i
end
def float_format
value.to_f
end
def boolean_format
value == 'true'
end
def hash_format
JSON.parse(value)
end
def array_format
JSON.parse(value).to_a
end
end

View file

@ -0,0 +1,4 @@
class SettingEntryVersion < PaperTrail::Version
self.table_name = :log_setting_entries
self.sequence_name = :log_setting_entries
end

View file

@ -1,9 +1,8 @@
- value = Setting.send(var)
%tr{class: (@errors && @errors.has_key?(var.to_s) && "danger")}
%td.col-md-6= var.to_s.humanize
- if [TrueClass, FalseClass].include?(value.class)
%tr{class: (@errors && @errors.has_key?(setting.code) && "danger")}
%td.col-md-6= setting.code.humanize
- if [TrueClass, FalseClass].include?(setting.retrieve.class)
%td.col-md-6
= hidden_field_tag("[settings][#{var}]", '', id: nil)
= check_box_tag("[settings][#{var}]", true, value)
= hidden_field_tag("[settings][#{setting.id}]", '', id: nil)
= check_box_tag("[settings][#{setting.id}]", true, setting.retrieve)
- else
%td.col-md-6= text_field_tag("[settings][#{var}]", value, class: 'form-control')
%td.col-md-6= text_field_tag("[settings][#{setting.id}]", setting.value, class: 'form-control')

View file

@ -9,20 +9,8 @@
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%tbody
= render 'setting_row', var: :admin_contacts_min_count
= render 'setting_row', var: :admin_contacts_max_count
= render 'setting_row', var: :tech_contacts_min_count
= render 'setting_row', var: :tech_contacts_max_count
= render 'setting_row', var: :orphans_contacts_in_months
= render 'setting_row', var: :ds_data_allowed
= render 'setting_row', var: :key_data_allowed
= render 'setting_row', var: :dnskeys_min_count
= render 'setting_row', var: :dnskeys_max_count
= render 'setting_row', var: :nameserver_required
= render 'setting_row', var: :ns_min_count
= render 'setting_row', var: :ns_max_count
= render 'setting_row', var: :expire_pending_confirmation
= render 'setting_row', var: :legal_document_is_mandatory
- @validation_settings.each do |setting|
= render 'setting_row', setting: setting
.panel.panel-default
.panel-heading
@ -30,10 +18,8 @@
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%tbody
= render 'setting_row', var: :days_to_renew_domain_before_expire
= render 'setting_row', var: :expire_warning_period
= render 'setting_row', var: :redemption_grace_period
= render 'setting_row', var: :expiration_reminder_mail
- @expiration_settings.each do |setting|
= render 'setting_row', setting: setting
.panel.panel-default
.panel-heading
@ -41,19 +27,12 @@
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%tbody
= render 'setting_row', var: :transfer_wait_time
= render 'setting_row', var: :ds_digest_type
= render 'setting_row', var: :client_side_status_editing_enabled
= render 'setting_row', var: :api_ip_whitelist_enabled
= render 'setting_row', var: :registrar_ip_whitelist_enabled
= render 'setting_row', var: :request_confrimation_on_registrant_change_enabled
= render 'setting_row', var: :request_confirmation_on_domain_deletion_enabled
= render 'setting_row', var: :address_processing
= render 'setting_row', var: :dispute_period_in_months
- @other_settings.each do |setting|
= render 'setting_row', setting: setting
%tr
%td.col-md-6= label_tag :default_language
%td.col-md-6
= select_tag '[settings][default_language]',
= select_tag "[settings][#{SettingEntry.find_by(code: 'default_language').id || 1}]",
options_for_select(available_languages, Setting.default_language),
class: 'form-control'
@ -63,25 +42,8 @@
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%tbody
= render 'setting_row', var: :invoice_number_min
= render 'setting_row', var: :invoice_number_max
= render 'setting_row', var: :directo_monthly_number_min
= render 'setting_row', var: :directo_monthly_number_max
= render 'setting_row', var: :directo_monthly_number_last
= render 'setting_row', var: :days_to_keep_invoices_active
= render 'setting_row', var: :days_to_keep_overdue_invoices_active
= render 'setting_row', var: :minimum_deposit
= render 'setting_row', var: :directo_receipt_payment_term
= render 'setting_row', var: :directo_receipt_product_name
= render 'setting_row', var: :directo_sales_agent
= render 'setting_row', var: :registry_billing_email
= render 'setting_row', var: :registry_invoice_contact
= render 'setting_row', var: :registry_vat_no
= render 'setting_row', var: :registry_vat_prc
= render 'setting_row', var: :registry_bank
= render 'setting_row', var: :registry_bank_code
= render 'setting_row', var: :registry_iban
= render 'setting_row', var: :registry_swift
- @billing_settings.each do |setting|
= render 'setting_row', setting: setting
.panel.panel-default
.panel-heading
@ -89,17 +51,8 @@
.table-responsive
%table.table.table-hover.table-bordered.table-condensed
%tbody
= render 'setting_row', var: :registry_juridical_name
= render 'setting_row', var: :registry_reg_no
= render 'setting_row', var: :registry_email
= render 'setting_row', var: :registry_phone
= render 'setting_row', var: :registry_url
= render 'setting_row', var: :registry_street
= render 'setting_row', var: :registry_city
= render 'setting_row', var: :registry_state
= render 'setting_row', var: :registry_zip
= render 'setting_row', var: :registry_country_code
= render 'setting_row', var: :registry_whois_disclaimer
- @contacts_settings.each do |setting|
= render 'setting_row', setting: setting
.row
.col-md-12.text-right