# frozen_string_literal: true module SeedData class Topics def self.with_default_locale SeedData::Topics.new(SiteSetting.default_locale) end def initialize(locale) @locale = locale end def create(site_setting_names: nil, include_welcome_topics: true) I18n.with_locale(@locale) do topics(site_setting_names, include_welcome_topics).each { |params| create_topic(**params) } end end def update(site_setting_names: nil, skip_changed: false) I18n.with_locale(@locale) do topics(site_setting_names).each do |params| params.except!(:category, :after_create) params[:skip_changed] = skip_changed update_topic(**params) end end end def reseed_options I18n.with_locale(@locale) do topics .map do |params| post = find_post(params[:site_setting_name]) next unless post { id: params[:site_setting_name], name: post.topic.title, selected: unchanged?(post) } end .compact end end private def topics(site_setting_names = nil, include_welcome_topics = true) staff_category = Category.find_by(id: SiteSetting.staff_category_id) topics = [ # Terms of Service { site_setting_name: "tos_topic_id", title: I18n.t("tos_topic.title"), raw: I18n.t( "tos_topic.body", company_name: setting_value("company_name"), base_url: Discourse.base_url, contact_email: setting_value("contact_email"), governing_law: setting_value("governing_law"), city_for_disputes: setting_value("city_for_disputes"), ), category: staff_category, static_first_reply: true, }, # FAQ/Guidelines { site_setting_name: "guidelines_topic_id", title: I18n.t("guidelines_topic.title"), raw: I18n.t("guidelines_topic.body", base_path: Discourse.base_path), category: staff_category, static_first_reply: true, }, # Privacy Policy { site_setting_name: "privacy_topic_id", title: I18n.t("privacy_topic.title"), raw: I18n.t("privacy_topic.body"), category: staff_category, static_first_reply: true, }, ] if include_welcome_topics # Welcome Topic if general_category = Category.find_by(id: SiteSetting.general_category_id) topics << { site_setting_name: "welcome_topic_id", title: I18n.t("discourse_welcome_topic.title"), raw: I18n.t("discourse_welcome_topic.body", base_path: Discourse.base_path), category: general_category, after_create: proc { |post| post.topic.update_pinned(true, true) }, } end # Admin Quick Start Guide topics << { site_setting_name: "admin_quick_start_topic_id", title: DiscoursePluginRegistry.seed_data["admin_quick_start_title"] || I18n.t("admin_quick_start_title"), raw: admin_quick_start_raw, category: staff_category, } end if site_setting_names topics.select! { |t| site_setting_names.include?(t[:site_setting_name]) } end topics end def create_topic( site_setting_name:, title:, raw:, category: nil, static_first_reply: false, after_create: nil ) topic_id = SiteSetting.get(site_setting_name) return if topic_id > 0 || Topic.find_by(id: topic_id) post = PostCreator.create!( Discourse.system_user, title: title, raw: raw, skip_jobs: true, skip_validations: true, category: category&.id, ) if static_first_reply PostCreator.create!( Discourse.system_user, raw: first_reply_raw(title), skip_jobs: true, skip_validations: true, topic_id: post.topic_id, ) end after_create&.call(post) SiteSetting.set(site_setting_name, post.topic_id) end def update_topic(site_setting_name:, title:, raw:, static_first_reply: false, skip_changed:) post = find_post(site_setting_name) return if !post if !skip_changed || unchanged?(post) changes = { title: title, raw: raw } post.revise(Discourse.system_user, changes, skip_validations: true) end if static_first_reply && (reply = first_reply(post)) && (!skip_changed || unchanged?(reply)) changes = { raw: first_reply_raw(title) } reply.revise(Discourse.system_user, changes, skip_validations: true) end end def find_post(site_setting_name) topic_id = SiteSetting.get(site_setting_name) Post.find_by(topic_id: topic_id, post_number: 1) if topic_id > 0 end def unchanged?(post) post.last_editor_id == Discourse::SYSTEM_USER_ID end def setting_value(site_setting_key) SiteSetting.get(site_setting_key).presence || "#{site_setting_key}" end def first_reply(post) Post.find_by(topic_id: post.topic_id, post_number: 2, user_id: Discourse::SYSTEM_USER_ID) end def first_reply_raw(topic_title) I18n.t("static_topic_first_reply", page_name: topic_title) end def admin_quick_start_raw quick_start_filename = DiscoursePluginRegistry.seed_data["admin_quick_start_filename"] if !quick_start_filename || !File.exist?(quick_start_filename) # TODO Make the quick start guide translatable quick_start_filename = File.join(Rails.root, "docs", "ADMIN-QUICK-START-GUIDE.md") end File.read(quick_start_filename) end end end