]> cat aescling's git repositories - mastodon.git/blob - app/lib/settings/scoped_settings.rb
Merge branch 'master' into glitch-soc/merge-upstream
[mastodon.git] / app / lib / settings / scoped_settings.rb
1 # frozen_string_literal: true
2
3 module Settings
4 class ScopedSettings
5 DEFAULTING_TO_UNSCOPED = %w(
6 flavour
7 skin
8 ).freeze
9
10 def initialize(object)
11 @object = object
12 end
13
14 # rubocop:disable Style/MethodMissing
15 def method_missing(method, *args)
16 method_name = method.to_s
17 # set a value for a variable
18 if method_name[-1] == '='
19 var_name = method_name.sub('=', '')
20 value = args.first
21 self[var_name] = value
22 else
23 # retrieve a value
24 self[method_name]
25 end
26 end
27 # rubocop:enable Style/MethodMissing
28
29 def respond_to_missing?(*)
30 true
31 end
32
33 def all_as_records
34 vars = thing_scoped
35 records = vars.map { |r| [r.var, r] }.to_h
36
37 Setting.default_settings.each do |key, default_value|
38 next if records.key?(key) || default_value.is_a?(Hash)
39 records[key] = Setting.new(var: key, value: default_value)
40 end
41
42 records
43 end
44
45 def []=(key, value)
46 key = key.to_s
47 record = thing_scoped.find_or_initialize_by(var: key)
48 record.update!(value: value)
49
50 Rails.cache.write(Setting.cache_key(key, @object), value)
51 value
52 end
53
54 def [](key)
55 Rails.cache.fetch(Setting.cache_key(key, @object)) do
56 db_val = thing_scoped.find_by(var: key.to_s)
57 if db_val
58 default_value = ScopedSettings.default_settings[key]
59 return default_value.with_indifferent_access.merge!(db_val.value) if default_value.is_a?(Hash)
60 db_val.value
61 else
62 ScopedSettings.default_settings[key]
63 end
64 end
65 end
66
67 class << self
68 def default_settings
69 defaulting = DEFAULTING_TO_UNSCOPED.map { |k| [k, Setting[k]] }.to_h
70 Setting.default_settings.merge!(defaulting)
71 end
72 end
73
74 protected
75
76 def thing_scoped
77 Setting.unscoped.where(thing_type: @object.class.base_class.to_s, thing_id: @object.id)
78 end
79 end
80 end
This page took 0.079519 seconds and 4 git commands to generate.