Class: Collavre::Admin::SettingsController

Inherits:
Collavre::ApplicationController show all
Defined in:
app/controllers/collavre/admin/settings_controller.rb

Instance Method Summary collapse

Instance Method Details

#indexObject



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
# File 'app/controllers/collavre/admin/settings_controller.rb', line 8

def index
  @help_link = SystemSetting.find_by(key: "help_menu_link")&.value
  @mcp_tool_approval = SystemSetting.find_by(key: "mcp_tool_approval_required")&.value == "true"
  @creatives_login_required = SystemSetting.
  @home_page_path = SystemSetting.home_page_path

  # Account lockout settings
  @max_login_attempts = SystemSetting.
  @lockout_duration_minutes = SystemSetting.lockout_duration_minutes

  # Password policy settings
  @password_min_length = SystemSetting.password_min_length

  # Session timeout settings
  @session_timeout_minutes = SystemSetting.session_timeout_minutes

  # LLM settings
  @llm_request_timeout_seconds = SystemSetting.llm_request_timeout_seconds

  # Rate limiting settings
  @password_reset_rate_limit = SystemSetting.password_reset_rate_limit
  @password_reset_rate_period_minutes = SystemSetting.password_reset_rate_period_minutes
  @api_rate_limit = SystemSetting.api_rate_limit
  @api_rate_period_minutes = SystemSetting.api_rate_period_minutes

  # Storage is "disabled" list. View expects "enabled" list.
  all_provider_keys = Rails.application.config.auth_providers.map { |p| p[:key].to_s }
  disabled_providers = SystemSetting.find_by(key: "auth_providers_disabled")&.value&.split(",") || []
  @enabled_auth_providers = all_provider_keys - disabled_providers
end

#uiuxObject



39
40
41
42
43
44
45
# File 'app/controllers/collavre/admin/settings_controller.rb', line 39

def uiux
  @default_light_theme_id = SystemSetting.default_light_theme_id
  @default_dark_theme_id = SystemSetting.default_dark_theme_id
  @available_themes = Collavre::UserTheme.all.order(:name)
  @display_level = SystemSetting.display_level
  @completion_mark = SystemSetting.completion_mark
end

#updateObject



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
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
# File 'app/controllers/collavre/admin/settings_controller.rb', line 79

def update
  SystemSetting.transaction do
    # Help Link
    help_link_setting = SystemSetting.find_or_initialize_by(key: "help_menu_link")
    help_link_setting.value = params[:help_link].to_s.strip
    help_link_setting.save!

    # MCP Tool Approval
    mcp_setting = SystemSetting.find_or_initialize_by(key: "mcp_tool_approval_required")
    mcp_setting.value = params[:mcp_tool_approval] == "1" ? "true" : "false"
    mcp_setting.save!

    # Creatives Login Required
     = SystemSetting.find_or_initialize_by(key: "creatives_login_required")
    .value = params[:creatives_login_required] == "1" ? "true" : "false"
    .save!

    # Home Page Path
    home_page_path_input = params[:home_page_path].to_s.strip
    if home_page_path_input.present?
      normalized_path, error = validate_and_normalize_home_page_path(home_page_path_input)
      if error
        home_page_setting = SystemSetting.new(key: "home_page_path")
        home_page_setting.errors.add(:base, error)
        raise ActiveRecord::RecordInvalid, home_page_setting
      end
      home_page_setting = SystemSetting.find_or_initialize_by(key: "home_page_path")
      home_page_setting.value = normalized_path
      home_page_setting.save!
    else
      home_page_setting = SystemSetting.find_or_initialize_by(key: "home_page_path")
      home_page_setting.value = nil
      home_page_setting.save!
    end

    # Account Lockout Settings
    max_attempts = params[:max_login_attempts].to_i
    max_attempts = SystemSetting::DEFAULT_MAX_LOGIN_ATTEMPTS if max_attempts < 1
    SystemSetting.find_or_initialize_by(key: "max_login_attempts").tap { |s| s.value = max_attempts.to_s; s.save! }

    lockout_duration = params[:lockout_duration_minutes].to_i
    lockout_duration = SystemSetting::DEFAULT_LOCKOUT_DURATION_MINUTES if lockout_duration < 1
    SystemSetting.find_or_initialize_by(key: "lockout_duration_minutes").tap { |s| s.value = lockout_duration.to_s; s.save! }

    # Password Policy Settings
    password_min_length = [ [ params[:password_min_length].to_i, SystemSetting::DEFAULT_PASSWORD_MIN_LENGTH ].max, 72 ].min
    SystemSetting.find_or_initialize_by(key: "password_min_length").tap { |s| s.value = password_min_length.to_s; s.save! }

    # Session Timeout Settings
    session_timeout = [ params[:session_timeout_minutes].to_i, 0 ].max
    SystemSetting.find_or_initialize_by(key: "session_timeout_minutes").tap { |s| s.value = session_timeout.to_s; s.save! }

    # Rate Limiting - Password Reset
    pw_reset_limit = params[:password_reset_rate_limit].to_i
    pw_reset_limit = SystemSetting::DEFAULT_PASSWORD_RESET_RATE_LIMIT if pw_reset_limit < 1
    SystemSetting.find_or_initialize_by(key: "password_reset_rate_limit").tap { |s| s.value = pw_reset_limit.to_s; s.save! }

    pw_reset_period = params[:password_reset_rate_period_minutes].to_i
    pw_reset_period = SystemSetting::DEFAULT_PASSWORD_RESET_RATE_PERIOD_MINUTES if pw_reset_period < 1
    SystemSetting.find_or_initialize_by(key: "password_reset_rate_period_minutes").tap { |s| s.value = pw_reset_period.to_s; s.save! }

    # Rate Limiting - API
    api_limit = params[:api_rate_limit].to_i
    api_limit = SystemSetting::DEFAULT_API_RATE_LIMIT if api_limit < 1
    SystemSetting.find_or_initialize_by(key: "api_rate_limit").tap { |s| s.value = api_limit.to_s; s.save! }

    api_period = params[:api_rate_period_minutes].to_i
    api_period = SystemSetting::DEFAULT_API_RATE_PERIOD_MINUTES if api_period < 1
    SystemSetting.find_or_initialize_by(key: "api_rate_period_minutes").tap { |s| s.value = api_period.to_s; s.save! }

    # LLM Settings
    llm_timeout = params[:llm_request_timeout_seconds].to_i
    llm_timeout = SystemSetting::DEFAULT_LLM_REQUEST_TIMEOUT_SECONDS if llm_timeout < 30
    SystemSetting.find_or_initialize_by(key: "llm_request_timeout_seconds").tap { |s| s.value = llm_timeout.to_s; s.save! }

    # Auth Providers
    auth_providers = Array(params[:auth_providers]).reject(&:blank?)
    if auth_providers.empty?
      auth_setting = SystemSetting.new(key: "auth_providers_enabled")
      auth_setting.errors.add(:base, t("admin.settings.auth_provider_required"))
      raise ActiveRecord::RecordInvalid, auth_setting
    end

    all_provider_keys = Rails.application.config.auth_providers.map { |p| p[:key].to_s }
    disabled_providers = all_provider_keys - auth_providers
    SystemSetting.find_or_initialize_by(key: "auth_providers_disabled").tap { |s| s.value = disabled_providers.join(","); s.save! }
  end

  redirect_to collavre.admin_settings_path, notice: t("admin.settings.updated")
rescue ActiveRecord::RecordInvalid => e
  flash.now[:alert] = e.record.errors.full_messages.join(", ")
  @help_link = params[:help_link]
  @mcp_tool_approval = params[:mcp_tool_approval] == "1"
  @creatives_login_required = params[:creatives_login_required] == "1"
  @home_page_path = params[:home_page_path]
  @max_login_attempts = params[:max_login_attempts].to_i.positive? ? params[:max_login_attempts].to_i : SystemSetting::DEFAULT_MAX_LOGIN_ATTEMPTS
  @lockout_duration_minutes = params[:lockout_duration_minutes].to_i.positive? ? params[:lockout_duration_minutes].to_i : SystemSetting::DEFAULT_LOCKOUT_DURATION_MINUTES
  @password_min_length = [ [ params[:password_min_length].to_i, SystemSetting::DEFAULT_PASSWORD_MIN_LENGTH ].max, 72 ].min
  @session_timeout_minutes = [ params[:session_timeout_minutes].to_i, 0 ].max
  @password_reset_rate_limit = params[:password_reset_rate_limit].to_i.positive? ? params[:password_reset_rate_limit].to_i : SystemSetting::DEFAULT_PASSWORD_RESET_RATE_LIMIT
  @password_reset_rate_period_minutes = params[:password_reset_rate_period_minutes].to_i.positive? ? params[:password_reset_rate_period_minutes].to_i : SystemSetting::DEFAULT_PASSWORD_RESET_RATE_PERIOD_MINUTES
  @api_rate_limit = params[:api_rate_limit].to_i.positive? ? params[:api_rate_limit].to_i : SystemSetting::DEFAULT_API_RATE_LIMIT
  @api_rate_period_minutes = params[:api_rate_period_minutes].to_i.positive? ? params[:api_rate_period_minutes].to_i : SystemSetting::DEFAULT_API_RATE_PERIOD_MINUTES
  @llm_request_timeout_seconds = params[:llm_request_timeout_seconds].to_i.positive? ? params[:llm_request_timeout_seconds].to_i : SystemSetting::DEFAULT_LLM_REQUEST_TIMEOUT_SECONDS
  @enabled_auth_providers = params[:auth_providers] || []
  render :index, status: :unprocessable_entity
end

#update_uiuxObject



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
# File 'app/controllers/collavre/admin/settings_controller.rb', line 47

def update_uiux
  SystemSetting.transaction do
    light_theme_id = params[:default_light_theme_id].to_s.strip
    light_theme_setting = SystemSetting.find_or_initialize_by(key: "default_light_theme_id")
    light_theme_setting.value = light_theme_id.present? ? light_theme_id : nil
    light_theme_setting.save!

    dark_theme_id = params[:default_dark_theme_id].to_s.strip
    dark_theme_setting = SystemSetting.find_or_initialize_by(key: "default_dark_theme_id")
    dark_theme_setting.value = dark_theme_id.present? ? dark_theme_id : nil
    dark_theme_setting.save!

    # Creative display settings
    dl = params[:display_level].to_i
    dl = SystemSetting::DEFAULT_DISPLAY_LEVEL if dl < 1
    SystemSetting.find_or_initialize_by(key: "display_level").tap { |s| s.value = dl.to_s; s.save! }

    cm = params[:completion_mark].to_s
    SystemSetting.find_or_initialize_by(key: "completion_mark").tap { |s| s.value = cm; s.save! }
  end

  redirect_to collavre.admin_uiux_path, notice: t("admin.settings.updated")
rescue ActiveRecord::RecordInvalid => e
  flash.now[:alert] = e.record.errors.full_messages.join(", ")
  @default_light_theme_id = params[:default_light_theme_id]
  @default_dark_theme_id = params[:default_dark_theme_id]
  @available_themes = Collavre::UserTheme.all.order(:name)
  @display_level = params[:display_level].to_i.positive? ? params[:display_level].to_i : SystemSetting::DEFAULT_DISPLAY_LEVEL
  @completion_mark = params[:completion_mark].to_s
  render :uiux, status: :unprocessable_entity
end