# frozen_string_literal: true class PublishedPage < ActiveRecord::Base belongs_to :topic validates_presence_of :slug validates_uniqueness_of :slug, :topic_id validate :slug_format def slug_format if slug !~ /^[a-zA-Z\-\_0-9]+$/ errors.add(:slug, I18n.t("publish_page.slug_errors.invalid")) elsif %w[check-slug by-topic].include?(slug) errors.add(:slug, I18n.t("publish_page.slug_errors.unavailable")) end end def path "/pub/#{slug}" end def url "#{Discourse.base_url}#{path}" end def self.publish!(publisher, topic, slug, options = {}) pp = nil results = transaction do pp = find_or_initialize_by(topic: topic) pp.slug = slug.strip pp.public = options[:public] || false if pp.save StaffActionLogger.new(publisher).log_published_page(topic.id, slug) [true, pp] end end results || [false, pp] end def self.unpublish!(publisher, topic) if pp = PublishedPage.find_by(topic_id: topic.id) pp.destroy! StaffActionLogger.new(publisher).log_unpublished_page(topic.id, pp.slug) end end end # == Schema Information # # Table name: published_pages # # id :bigint not null, primary key # topic_id :bigint not null # slug :string not null # created_at :datetime not null # updated_at :datetime not null # public :boolean default(FALSE), not null # # Indexes # # index_published_pages_on_slug (slug) UNIQUE # index_published_pages_on_topic_id (topic_id) UNIQUE #