Class: Admin::SettingsController

Inherits:
ApplicationController
  • Object
show all
Includes:
AuditLoggable
Defined in:
lib/generators/ruby_cms/templates/controllers/admin/settings_controller.rb

Instance Method Summary collapse

Instance Method Details

#indexObject



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
# File 'lib/generators/ruby_cms/templates/controllers/admin/settings_controller.rb', line 9

def index
  RubyCms::Settings.ensure_defaults!

  @registry_entries = sorted_registry_entries
  @categories = @registry_entries.map { |e| e.category.to_s }.uniq
  @active_tab = resolve_active_tab(params[:tab], @categories)
  @entries_for_tab = @active_tab == "overview" ? [] : @registry_entries.select { |entry| entry.category.to_s == @active_tab }

  # Preload all Preference rows for this tab in one query before .get loop.
  # Without this each entry triggers a SELECT (N+1).
  RubyCms::Settings.preload_keys(@entries_for_tab.map { |e| e.key.to_s })

  @values = @entries_for_tab.to_h do |entry|
    [ entry.key, RubyCms::Settings.get(entry.key, default: entry.default) ]
  end

  # Preload Preference timestamps for entries in this tab (avoids N+1 in view).
  @pref_updated_at = if @entries_for_tab.any?
                       keys = @entries_for_tab.map { |e| e.key.to_s }
                       Preference.where(key: keys).pluck(:key, :updated_at).to_h
  else
                       {}
  end

  load_overview_data if @active_tab == "overview"
end

#reset_defaultsObject



54
55
56
57
58
59
60
61
62
63
64
# File 'lib/generators/ruby_cms/templates/controllers/admin/settings_controller.rb', line 54

def reset_defaults
  RubyCms::SettingsRegistry.seed_defaults!

  RubyCms::SettingsRegistry.each do |entry|
    RubyCms::Settings.set(entry.key, entry.default)
  end

  audit!(:settings_reset, target: "Settings", summary: "Reset all settings to defaults")
  redirect_to admin_settings_path(redirect_settings_params),
              notice: t("ruby_cms.admin.settings.defaults_reset")
end

#updateObject



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/generators/ruby_cms/templates/controllers/admin/settings_controller.rb', line 36

def update
  updated_keys = apply_updates(extract_updates)
  updated_keys = apply_nav_order_update(updated_keys)

  if updated_keys.any?
    audit!(
      :settings_updated,
      target: "Settings",
      summary: "Updated #{updated_keys.size} setting(s): #{updated_keys.join(', ').truncate(200)}",
      meta: { keys: updated_keys }
    )
  end

  respond_with_update_success(updated_keys)
rescue StandardError => e
  respond_with_update_failure(e)
end

#update_nav_orderObject

Dedicated endpoint for saving nav order. Stores a JSON hash so cross-section moves (an item dragged from main → settings) are persisted as a section override.



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# File 'lib/generators/ruby_cms/templates/controllers/admin/settings_controller.rb', line 68

def update_nav_order
  payload = nav_order_payload_from_raw_body
  if payload["main"].blank? && payload["settings"].blank?
    return render json: {
                    success: false,
                    error: "nav_order_main and nav_order_bottom required"
                  },
                  status: :unprocessable_content
  end

  rec = Preference.find_or_initialize_by(key: "nav_order")
  rec.category = "navigation" if rec.new_record?
  rec.value_type = "json"
  rec.value = payload.to_json
  rec.save!
  render json: { success: true, updated_keys: [ "nav_order" ], updated_count: 1 }
rescue StandardError => e
  render json: { success: false, error: e.message }, status: :unprocessable_content
end