Skip to content
Snippets Groups Projects
block.rb 2.64 KiB
Newer Older
Arnaud Levy's avatar
Arnaud Levy committed
# == Schema Information
#
# Table name: communication_blocks
#
#  id            :uuid             not null, primary key
#  about_type    :string           indexed => [about_id]
#  data          :jsonb
#  position      :integer          default(0), not null
Arnaud Levy's avatar
Arnaud Levy committed
#  template_kind :integer          default(NULL), not null
#  title         :string
Arnaud Levy's avatar
Arnaud Levy committed
#  created_at    :datetime         not null
#  updated_at    :datetime         not null
#  about_id      :uuid             indexed => [about_type]
#  university_id :uuid             not null, indexed
#
# Indexes
#
#  index_communication_blocks_on_university_id  (university_id)
#  index_communication_website_blocks_on_about  (about_type,about_id)
#
# Foreign Keys
#
#  fk_rails_18291ef65f  (university_id => universities.id)
#
class Communication::Block < ApplicationRecord
Arnaud Levy's avatar
Arnaud Levy committed
  include WithUniversity
Arnaud Levy's avatar
Arnaud Levy committed
  include WithPosition

  belongs_to :about, polymorphic: true

Sébastien Gaya's avatar
Sébastien Gaya committed
  # Used to purge images when unattaching them
Arnaud Levy's avatar
Arnaud Levy committed
  # template_blobs would be a better name, because there are files
  has_many_attached :template_images

Arnaud Levy's avatar
Arnaud Levy committed
  enum template_kind: {
Arnaud Levy's avatar
Arnaud Levy committed
    chapter: 50,
Arnaud Levy's avatar
Arnaud Levy committed
    image: 51,
Arnaud Levy's avatar
Arnaud Levy committed
    gallery: 300,
Arnaud Levy's avatar
Arnaud Levy committed
    video: 52,
Arnaud Levy's avatar
Arnaud Levy committed
    key_figures: 56,
Arnaud Levy's avatar
Arnaud Levy committed
    datatable: 54,
    files: 55,
    embed: 53,
    call_to_action: 900,
alexisben's avatar
alexisben committed
    testimonials: 400,
alexisben's avatar
alexisben committed
    timeline: 700,
alexisben's avatar
alexisben committed
    definitions: 800,
Arnaud Levy's avatar
Arnaud Levy committed
    organization_chart: 100,
    partners: 200,
    posts: 500,
    pages: 600,
Arnaud Levy's avatar
Arnaud Levy committed
  }

  CATEGORIES = {
    basic: [:chapter, :image, :video, :datatable],
    storytelling: [:key_figures, :gallery, :call_to_action, :testimonials, :timeline],
    references: [:pages, :posts, :organization_chart, :partners],
    utilities: [:files, :definitions, :embed]
Arnaud Levy's avatar
Arnaud Levy committed
  before_save :attach_template_blobs
Sébastien Gaya's avatar
Sébastien Gaya committed
  after_commit :save_and_sync_about, on: [:update, :destroy]
Arnaud Levy's avatar
Arnaud Levy committed
  # When we set data from json, we pass it to the template.
  # The json we save is first sanitized and prepared by the template.
Arnaud Levy's avatar
Arnaud Levy committed
  def data=(value)
Arnaud Levy's avatar
Arnaud Levy committed
    template.data = value
Arnaud Levy's avatar
Arnaud Levy committed
    super template.data
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  # Template data is clean and sanitized, and initialized with json
Arnaud Levy's avatar
Arnaud Levy committed
  def data
Arnaud Levy's avatar
Arnaud Levy committed
    template.data
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def git_dependencies
Arnaud Levy's avatar
Arnaud Levy committed
    template.git_dependencies
Arnaud Levy's avatar
Arnaud Levy committed
  end

  def last_ordered_element
    about.blocks.ordered.last
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def template
Arnaud Levy's avatar
Arnaud Levy committed
    @template ||= template_class.new self, self.attributes['data']
Arnaud Levy's avatar
Arnaud Levy committed
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def to_s
Arnaud Levy's avatar
Arnaud Levy committed
    title.blank?  ? "#{Communication::Block.model_name.human} #{position}"
                  : "#{title}"
Arnaud Levy's avatar
Arnaud Levy committed
  end
Arnaud Levy's avatar
Arnaud Levy committed
  def template_class
    "Communication::Block::Template::#{template_kind.classify}".constantize
  end

Arnaud Levy's avatar
Arnaud Levy committed
  def attach_template_blobs
    self.template_images = template.active_storage_blobs
  end
Sébastien Gaya's avatar
Sébastien Gaya committed

  def save_and_sync_about
    about&.save_and_sync unless about&.destroyed?
  end
Arnaud Levy's avatar
Arnaud Levy committed
end