Change user settings to be stored in a more optimal way (#23630)
Co-authored-by: Claire <claire.github-309c@sitedethib.com>
This commit is contained in:
parent
e7c3e55874
commit
a9b5598c97
36 changed files with 817 additions and 525 deletions
37
app/models/user_settings/dsl.rb
Normal file
37
app/models/user_settings/dsl.rb
Normal file
|
@ -0,0 +1,37 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module UserSettings::DSL
|
||||
module ClassMethods
|
||||
def setting(key, options = {})
|
||||
@definitions ||= {}
|
||||
|
||||
UserSettings::Setting.new(key, options).tap do |s|
|
||||
@definitions[s.key] = s
|
||||
end
|
||||
end
|
||||
|
||||
def namespace(key, &block)
|
||||
@definitions ||= {}
|
||||
|
||||
UserSettings::Namespace.new(key).configure(&block).tap do |n|
|
||||
@definitions.merge!(n.definitions)
|
||||
end
|
||||
end
|
||||
|
||||
def keys
|
||||
@definitions.keys
|
||||
end
|
||||
|
||||
def definition_for(key)
|
||||
@definitions[key.to_sym]
|
||||
end
|
||||
|
||||
def definition_for?(key)
|
||||
@definitions.key?(key.to_sym)
|
||||
end
|
||||
end
|
||||
|
||||
def self.included(base)
|
||||
base.extend ClassMethods
|
||||
end
|
||||
end
|
23
app/models/user_settings/glue.rb
Normal file
23
app/models/user_settings/glue.rb
Normal file
|
@ -0,0 +1,23 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
module UserSettings::Glue
|
||||
def to_model
|
||||
self
|
||||
end
|
||||
|
||||
def to_key
|
||||
''
|
||||
end
|
||||
|
||||
def persisted?
|
||||
false
|
||||
end
|
||||
|
||||
def type_for_attribute(key)
|
||||
self.class.definition_for(key)&.type
|
||||
end
|
||||
|
||||
def has_attribute?(key) # rubocop:disable Naming/PredicateName
|
||||
self.class.definition_for?(key)
|
||||
end
|
||||
end
|
21
app/models/user_settings/namespace.rb
Normal file
21
app/models/user_settings/namespace.rb
Normal file
|
@ -0,0 +1,21 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class UserSettings::Namespace
|
||||
attr_reader :name, :definitions
|
||||
|
||||
def initialize(name)
|
||||
@name = name.to_sym
|
||||
@definitions = {}
|
||||
end
|
||||
|
||||
def configure(&block)
|
||||
instance_eval(&block)
|
||||
self
|
||||
end
|
||||
|
||||
def setting(key, options = {})
|
||||
UserSettings::Setting.new(key, options.merge(namespace: name)).tap do |s|
|
||||
@definitions[s.key] = s
|
||||
end
|
||||
end
|
||||
end
|
48
app/models/user_settings/setting.rb
Normal file
48
app/models/user_settings/setting.rb
Normal file
|
@ -0,0 +1,48 @@
|
|||
# frozen_string_literal: true
|
||||
|
||||
class UserSettings::Setting
|
||||
attr_reader :name, :namespace, :in
|
||||
|
||||
def initialize(name, options = {})
|
||||
@name = name.to_sym
|
||||
@default_value = options[:default]
|
||||
@namespace = options[:namespace]
|
||||
@in = options[:in]
|
||||
end
|
||||
|
||||
def default_value
|
||||
if @default_value.respond_to?(:call)
|
||||
@default_value.call
|
||||
else
|
||||
@default_value
|
||||
end
|
||||
end
|
||||
|
||||
def type
|
||||
if @default_value.is_a?(TrueClass) || @default_value.is_a?(FalseClass)
|
||||
ActiveModel::Type::Boolean.new
|
||||
else
|
||||
ActiveModel::Type::String.new
|
||||
end
|
||||
end
|
||||
|
||||
def type_cast(value)
|
||||
if type.respond_to?(:cast)
|
||||
type.cast(value)
|
||||
else
|
||||
value
|
||||
end
|
||||
end
|
||||
|
||||
def to_a
|
||||
[key, default_value]
|
||||
end
|
||||
|
||||
def key
|
||||
if namespace
|
||||
"#{namespace}.#{name}".to_sym
|
||||
else
|
||||
name
|
||||
end
|
||||
end
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue