Skip to content
Snippets Groups Projects
post.rb 3.15 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
# == Schema Information
#
# Table name: communication_website_posts
#
#  id                       :uuid             not null, primary key
#  description              :text
Sébastien Gaya's avatar
Sébastien Gaya committed
#  featured_image_alt       :string
Arnaud Levy's avatar
Arnaud Levy committed
#  github_path              :text
#  old_text                 :text
pabois's avatar
pabois committed
#  pinned                   :boolean          default(FALSE)
Arnaud Levy's avatar
Arnaud Levy committed
#  published                :boolean          default(FALSE)
#  published_at             :datetime
Arnaud Levy's avatar
Arnaud Levy committed
#  slug                     :text
Arnaud Levy's avatar
Arnaud Levy committed
#  title                    :string
#  created_at               :datetime         not null
#  updated_at               :datetime         not null
pabois's avatar
pabois committed
#  author_id                :uuid
Arnaud Levy's avatar
Arnaud Levy committed
#  communication_website_id :uuid             not null
#  university_id            :uuid             not null
#
# Indexes
#
pabois's avatar
pabois committed
#  index_communication_website_posts_on_author_id                 (author_id)
Arnaud Levy's avatar
Arnaud Levy committed
#  index_communication_website_posts_on_communication_website_id  (communication_website_id)
#  index_communication_website_posts_on_university_id             (university_id)
#
# Foreign Keys
#
pabois's avatar
pabois committed
#  fk_rails_...  (author_id => administration_members.id)
Arnaud Levy's avatar
Arnaud Levy committed
#  fk_rails_...  (communication_website_id => communication_websites.id)
#  fk_rails_...  (university_id => universities.id)
#
class Communication::Website::Post < ApplicationRecord
Arnaud Levy's avatar
Arnaud Levy committed
  include WithGit
  include WithMedia
pabois's avatar
pabois committed
  include WithMenuItemTarget
Sébastien Gaya's avatar
Sébastien Gaya committed
  include WithSlug # We override slug_unavailable? method
pabois's avatar
pabois committed

  has_rich_text :text
Sébastien Gaya's avatar
Sébastien Gaya committed
  has_one_attached_deletable :featured_image
pabois's avatar
pabois committed
  has_one :imported_post,
          class_name: 'Communication::Website::Imported::Post',
          dependent: :destroy
Arnaud Levy's avatar
Arnaud Levy committed
  belongs_to :university
  belongs_to :website,
pabois's avatar
pabois committed
             class_name: 'Communication::Website',
Arnaud Levy's avatar
Arnaud Levy committed
             foreign_key: :communication_website_id
pabois's avatar
pabois committed
  belongs_to :author,
pabois's avatar
pabois committed
             class_name: 'Administration::Member',
pabois's avatar
pabois committed
             optional: true
pabois's avatar
pabois committed
  has_and_belongs_to_many :categories,
                          class_name: 'Communication::Website::Category',
                          join_table: 'communication_website_categories_posts',
                          foreign_key: 'communication_website_post_id',
                          association_foreign_key: 'communication_website_category_id'
Arnaud Levy's avatar
Arnaud Levy committed

  validates :title, presence: true

  before_validation :set_published_at, if: :published_changed?

  scope :ordered, -> { order(published_at: :desc, created_at: :desc) }
  scope :recent, -> { order(published_at: :desc).limit(5) }

pabois's avatar
pabois committed
  def path
Arnaud Levy's avatar
Arnaud Levy committed
    # used in menu_item#static_target
Arnaud Levy's avatar
Arnaud Levy committed
    "/#{website.posts_github_directory}/#{published_at.strftime "%Y/%m/%d"}/#{slug}/"
pabois's avatar
pabois committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def git_path_static
    "content/posts/#{published_at.year}/#{published_at.strftime "%Y-%m-%d"}-#{slug}.html" if published_at
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def git_dependencies_static
Sébastien Gaya's avatar
Sébastien Gaya committed
    [author] + categories + active_storage_blobs
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def git_destroy_dependencies_static
    explicit_active_storage_blobs
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def to_s
    "#{title}"
  end

  protected

  def slug_unavailable?(slug)
Arnaud Levy's avatar
Arnaud Levy committed
    self.class.unscoped
              .where(communication_website_id: self.communication_website_id, slug: slug)
              .where.not(id: self.id)
              .exists?

  def set_published_at
    self.published_at = published? ? Time.zone.now : nil
  end
Arnaud Levy's avatar
Arnaud Levy committed
end