# frozen_string_literal: true class SidebarSection < ActiveRecord::Base MAX_TITLE_LENGTH = 30 belongs_to :user has_many :sidebar_section_links, -> { order("position") }, dependent: :destroy has_many :sidebar_urls, through: :sidebar_section_links, source: :linkable, source_type: "SidebarUrl" accepts_nested_attributes_for :sidebar_urls, allow_destroy: true, limit: -> { SiteSetting.max_sidebar_section_links } before_save :set_system_user_for_public_section validates :title, presence: true, uniqueness: { scope: %i[user_id], }, length: { maximum: MAX_TITLE_LENGTH, } scope :public_sections, -> { where("public") } enum :section_type, { community: 0 }, scopes: false, suffix: true def reset_community! ActiveRecord::Base.transaction do self.update!(title: "Community") self.sidebar_section_links.destroy_all community_urls = SidebarUrl::COMMUNITY_SECTION_LINKS.map do |url_data| "('#{url_data[:name]}', '#{url_data[:path]}', '#{url_data[:icon]}', '#{url_data[:segment]}', false, now(), now())" end result = DB.query <<~SQL INSERT INTO sidebar_urls(name, value, icon, segment, external, created_at, updated_at) VALUES #{community_urls.join(",")} RETURNING sidebar_urls.id SQL sidebar_section_links = result.map.with_index do |url, index| "(-1, #{url.id}, 'SidebarUrl', #{self.id}, #{index}, now(), now())" end DB.query <<~SQL INSERT INTO sidebar_section_links(user_id, linkable_id, linkable_type, sidebar_section_id, position, created_at, updated_at) VALUES #{sidebar_section_links.join(",")} SQL end end private def set_system_user_for_public_section self.user_id = Discourse.system_user.id if self.public end end # == Schema Information # # Table name: sidebar_sections # # id :bigint not null, primary key # user_id :integer not null # title :string(30) not null # created_at :datetime not null # updated_at :datetime not null # public :boolean default(FALSE), not null # section_type :integer # # Indexes # # index_sidebar_sections_on_section_type (section_type) UNIQUE # index_sidebar_sections_on_user_id_and_title (user_id,title) UNIQUE #