class Setting < ApplicationRecord THEMES = ['system', 'light', 'dark'].freeze # These remain in the typed settings schema to preserve existing backend # work. The common `/users/settings` page currently surfaces only `theme`. AUTO_FETCH_MODES = ['auto', 'manual', 'off'].freeze WIKI_EDITOR_MODES = ['split', 'write', 'preview'].freeze STRING_ATTRIBUTES = [ 'theme', 'auto_fetch_title', 'auto_fetch_thumbnail', 'wiki_editor_mode', ].freeze INTEGER_ATTRIBUTES = [].freeze BOOLEAN_ATTRIBUTES = [].freeze EDITABLE_ATTRIBUTES = (STRING_ATTRIBUTES + INTEGER_ATTRIBUTES + BOOLEAN_ATTRIBUTES).freeze TYPE_BY_ATTRIBUTE = { 'theme' => :string, 'auto_fetch_title' => :string, 'auto_fetch_thumbnail' => :string, 'wiki_editor_mode' => :string, }.freeze belongs_to :user validates :user_id, presence: true validates :user_id, uniqueness: true validates :theme, inclusion: { in: THEMES } validates :auto_fetch_title, inclusion: { in: AUTO_FETCH_MODES } validates :auto_fetch_thumbnail, inclusion: { in: AUTO_FETCH_MODES } validates :wiki_editor_mode, inclusion: { in: WIKI_EDITOR_MODES } def self.defaults { theme: 'system', auto_fetch_title: 'manual', auto_fetch_thumbnail: 'manual', wiki_editor_mode: 'split', } end def self.serializable_attributes EDITABLE_ATTRIBUTES.map(&:to_sym) end def serializable_hash(options = nil) super({ only: self.class.serializable_attributes }.merge(options || { })) end end