about summary refs log tree commit diff
path: root/app/models/form/admin_settings.rb
blob: c9cd3a87fba5334af4e095fe1ee6896a89717f5d (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# frozen_string_literal: true

class Form::AdminSettings
  include ActiveModel::Model

  KEYS = %i(
    site_contact_username
    site_contact_email
    site_title
    site_short_description
    site_description
    site_extended_description
    site_terms
    registrations_mode
    closed_registrations_message
    open_deletion
    timeline_preview
    show_staff_badge
    bootstrap_timeline_accounts
    flavour
    skin
    min_invite_role
    activity_api_enabled
    peers_api_enabled
    show_known_fediverse_at_about_page
    preview_sensitive_media
    custom_css
    profile_directory
    hide_followers_count
    enable_keybase
    flavour_and_skin
    thumbnail
    hero
    mascot
    show_reblogs_in_public_timelines
    show_replies_in_public_timelines
    auto_reject_unknown
    auto_mark_known
    auto_mark_instance_actors_known
    auto_mark_services_known
    always_mark_instance_actors_known
    werewolf_status
    spam_check_enabled
    mark_known_from_follows
    mark_known_from_mentions
    mark_known_from_boosts
    mark_known_from_favourites
  ).freeze

  BOOLEAN_KEYS = %i(
    open_deletion
    timeline_preview
    show_staff_badge
    activity_api_enabled
    peers_api_enabled
    show_known_fediverse_at_about_page
    preview_sensitive_media
    profile_directory
    hide_followers_count
    enable_keybase
    show_reblogs_in_public_timelines
    show_replies_in_public_timelines
    auto_reject_unknown
    auto_mark_known
    auto_mark_instance_actors_known
    auto_mark_services_known
    always_mark_instance_actors_known
    werewolf_status
    spam_check_enabled
    mark_known_from_follows
    mark_known_from_mentions
    mark_known_from_boosts
    mark_known_from_favourites
  ).freeze

  UPLOAD_KEYS = %i(
    thumbnail
    hero
    mascot
  ).freeze

  PSEUDO_KEYS = %i(
    flavour_and_skin
  ).freeze

  attr_accessor(*KEYS)

  validates :site_short_description, :site_description, html: { wrap_with: :p }
  validates :site_extended_description, :site_terms, :closed_registrations_message, html: true
  validates :registrations_mode, inclusion: { in: %w(open approved none) }
  validates :min_invite_role, inclusion: { in: %w(disabled user halfmod moderator admin) }
  validates :site_contact_email, :site_contact_username, presence: true
  validates :site_contact_username, existing_username: true
  validates :bootstrap_timeline_accounts, existing_username: { multiple: true }

  def initialize(_attributes = {})
    super
    initialize_attributes
  end

  def save
    return false unless valid?

    KEYS.each do |key|
      next if PSEUDO_KEYS.include?(key)
      value = instance_variable_get("@#{key}")

      if UPLOAD_KEYS.include?(key) && !value.nil?
        upload = SiteUpload.where(var: key).first_or_initialize(var: key)
        upload.update(file: value)
      else
        setting = Setting.where(var: key).first_or_initialize(var: key)
        setting.update(value: typecast_value(key, value))
      end
    end
  end

  def flavour_and_skin
    "#{Setting.flavour}/#{Setting.skin}"
  end

  def flavour_and_skin=(value)
    @flavour, @skin = value.split('/', 2)
  end

  private

  def initialize_attributes
    KEYS.each do |key|
      next if PSEUDO_KEYS.include?(key)
      instance_variable_set("@#{key}", Setting.public_send(key)) if instance_variable_get("@#{key}").nil?
    end
  end

  def typecast_value(key, value)
    if BOOLEAN_KEYS.include?(key)
      value == '1'
    else
      value
    end
  end
end