class Setting < ApplicationRecord THEMES = ['system', 'light', 'dark'].freeze DISPLAY_DENSITIES = ['comfortable', 'compact'].freeze FONT_SIZES = ['small', 'normal', 'large'].freeze POST_LIST_LIMITS = [20, 50, 100].freeze POST_LIST_ORDERS = [ 'title_asc', 'title_desc', 'url_asc', 'url_desc', 'original_created_at_asc', 'original_created_at_desc', 'created_at_asc', 'created_at_desc', 'updated_at_asc', 'updated_at_desc', ].freeze VIEWED_POST_DISPLAYS = ['show', 'dim', 'hide'].freeze AUTO_FETCH_MODES = ['auto', 'manual', 'off'].freeze WIKI_EDITOR_MODES = ['split', 'write', 'preview'].freeze STRING_ATTRIBUTES = [ 'theme', 'display_density', 'font_size', 'post_list_order', 'viewed_post_display', 'auto_fetch_title', 'auto_fetch_thumbnail', 'wiki_editor_mode', ].freeze INTEGER_ATTRIBUTES = ['post_list_limit'].freeze BOOLEAN_ATTRIBUTES = ['tag_autocomplete_nico'].freeze EDITABLE_ATTRIBUTES = (STRING_ATTRIBUTES + INTEGER_ATTRIBUTES + BOOLEAN_ATTRIBUTES).freeze TYPE_BY_ATTRIBUTE = { 'theme' => :string, 'display_density' => :string, 'font_size' => :string, 'post_list_limit' => :integer, 'post_list_order' => :string, 'viewed_post_display' => :string, 'tag_autocomplete_nico' => :boolean, '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 :display_density, inclusion: { in: DISPLAY_DENSITIES } validates :font_size, inclusion: { in: FONT_SIZES } validates :post_list_limit, inclusion: { in: POST_LIST_LIMITS } validates :post_list_order, inclusion: { in: POST_LIST_ORDERS } validates :viewed_post_display, inclusion: { in: VIEWED_POST_DISPLAYS } validates :tag_autocomplete_nico, inclusion: { in: [true, false] } 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', display_density: 'comfortable', font_size: 'normal', post_list_limit: 50, post_list_order: 'created_at_desc', viewed_post_display: 'show', tag_autocomplete_nico: true, 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