mirror of
https://github.com/discourse/discourse.git
synced 2024-11-24 00:51:03 +08:00
5fc1586abf
Checking if the topic exists happened often and that can cause performance issues.
91 lines
3.3 KiB
Ruby
91 lines
3.3 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
PRIVATE_BOOTSTRAP_MODE_MIN_USERS = 10
|
|
|
|
DiscourseEvent.on(:site_setting_changed) do |name, old_value, new_value|
|
|
Category.clear_subcategory_ids if name === :max_category_nesting
|
|
|
|
# Enabling `must_approve_users` on an existing site is odd, so we assume that the
|
|
# existing users are approved.
|
|
if name == :must_approve_users && new_value == true
|
|
User
|
|
.where(approved: false)
|
|
.joins("LEFT JOIN reviewables r ON r.target_id = users.id")
|
|
.where(r: { id: nil })
|
|
.update_all(approved: true)
|
|
end
|
|
|
|
if name == :emoji_set
|
|
Emoji.clear_cache
|
|
|
|
before = "/images/emoji/#{old_value}/"
|
|
after = "/images/emoji/#{new_value}/"
|
|
|
|
Scheduler::Defer.later("Fix Emoji Links") do
|
|
DB.exec(
|
|
"UPDATE posts SET cooked = REPLACE(cooked, :before, :after) WHERE cooked LIKE :like",
|
|
before: before,
|
|
after: after,
|
|
like: "%#{before}%",
|
|
)
|
|
end
|
|
end
|
|
|
|
# Set bootstrap min users for private sites to a lower default
|
|
if name == :login_required && SiteSetting.bootstrap_mode_enabled == true
|
|
if new_value == true &&
|
|
SiteSetting.bootstrap_mode_min_users == SiteSetting.defaults.get(:bootstrap_mode_min_users)
|
|
SiteSetting.bootstrap_mode_min_users = PRIVATE_BOOTSTRAP_MODE_MIN_USERS
|
|
end
|
|
|
|
# Set bootstrap min users for public sites back to the default
|
|
if new_value == false &&
|
|
SiteSetting.bootstrap_mode_min_users == PRIVATE_BOOTSTRAP_MODE_MIN_USERS
|
|
SiteSetting.bootstrap_mode_min_users = SiteSetting.defaults.get(:bootstrap_mode_min_users)
|
|
end
|
|
end
|
|
|
|
Stylesheet::Manager.clear_color_scheme_cache! if %i[base_font heading_font].include?(name)
|
|
|
|
Report.clear_cache(:storage_stats) if %i[backup_location s3_backup_bucket].include?(name)
|
|
|
|
if name == :slug_generation_method
|
|
Scheduler::Defer.later("Null topic slug") { Topic.update_all(slug: nil) }
|
|
end
|
|
|
|
Jobs.enqueue(:update_s3_inventory) if %i[enable_s3_inventory s3_upload_bucket].include?(name)
|
|
|
|
SvgSprite.expire_cache if name.to_s.include?("_icon")
|
|
|
|
SiteIconManager.ensure_optimized! if SiteIconManager::WATCHED_SETTINGS.include?(name)
|
|
|
|
# Make sure medium and high priority thresholds were calculated.
|
|
if name == :reviewable_low_priority_threshold && Reviewable.min_score_for_priority(:medium) > 0
|
|
Reviewable.set_priorities(low: new_value)
|
|
end
|
|
|
|
Emoji.clear_cache && Discourse.request_refresh! if name == :emoji_deny_list
|
|
|
|
Discourse.clear_urls! if %i[tos_topic_id privacy_topic_id].include?(name)
|
|
|
|
# Update seeded topics
|
|
if %i[title site_description].include?(name)
|
|
topics = SeedData::Topics.with_default_locale
|
|
topics.update(site_setting_names: ["welcome_topic_id"], skip_changed: true)
|
|
elsif %i[company_name contact_email governing_law city_for_disputes].include?(name)
|
|
topics = SeedData::Topics.with_default_locale
|
|
%w[tos_topic_id privacy_topic_id].each do |site_setting|
|
|
topic_id = SiteSetting.get(site_setting)
|
|
if topic_id > 0 && Topic.with_deleted.exists?(id: topic_id)
|
|
if SiteSetting.company_name.blank?
|
|
topics.delete(site_setting_names: [site_setting], skip_changed: true)
|
|
else
|
|
topics.update(site_setting_names: [site_setting], skip_changed: true)
|
|
end
|
|
elsif SiteSetting.company_name.present?
|
|
topics.create(site_setting_names: [site_setting])
|
|
end
|
|
end
|
|
end
|
|
end
|