lib/literature/migrations/postgres/v01.ex

defmodule Literature.Migrations.Postgres.V01 do
  @moduledoc """
    Beginning tables for Literature
  """
  use Ecto.Migration

  def up(_opts) do
    # create literature_publications
    create_if_not_exists table(:literature_publications, primary_key: false) do
      add(:id, :binary_id, primary_key: true)
      add(:slug, :string, null: false)
      add(:name, :string, null: false)
      add(:description, :text)
      add(:meta_title, :string)
      add(:meta_description, :string)
      add(:meta_keywords, :string)
      add(:og_image, :string)
      add(:og_title, :string)
      add(:og_description, :string)
      add(:twitter_image, :string)
      add(:twitter_title, :string)
      add(:twitter_description, :string)

      timestamps()
    end

    create_if_not_exists table(:literature_tags, primary_key: false) do
      add(:id, :binary_id, primary_key: true)
      add(:slug, :string, null: false)
      add(:name, :string, null: false)
      add(:description, :text)
      add(:feature_image, :string)
      add(:visibility, :boolean)
      add(:meta_title, :string)
      add(:meta_description, :string)
      add(:meta_keywords, :string)
      add(:og_image, :string)
      add(:og_title, :string)
      add(:og_description, :string)
      add(:twitter_image, :string)
      add(:twitter_title, :string)
      add(:twitter_description, :string)

      add(
        :publication_id,
        references(:literature_publications, on_delete: :nilify_all, type: :binary_id)
      )

      timestamps()
    end

    # literature_posts
    create_if_not_exists table(:literature_posts, primary_key: false) do
      add(:id, :binary_id, primary_key: true)
      add(:slug, :string, null: false)
      add(:title, :string, null: false)
      add(:feature_image, :string)
      add(:feature_image_alt, :string)
      add(:feature_image_caption, :string)
      add(:featured, :boolean, default: false)
      add(:published_at, :utc_datetime)
      add(:excerpt, :text)
      add(:editor_json, :json)
      add(:html, {:array, :text})
      add(:meta_title, :string)
      add(:meta_description, :string)
      add(:meta_keywords, :string)
      add(:og_image, :string)
      add(:og_title, :string)
      add(:og_description, :string)
      add(:twitter_image, :string)
      add(:twitter_title, :string)
      add(:twitter_description, :string)

      add(
        :publication_id,
        references(:literature_publications, on_delete: :nilify_all, type: :binary_id)
      )

      timestamps()
    end

    create_if_not_exists table(:literature_tags_posts, primary_key: false) do
      add(:tag_id, references(:literature_tags, on_delete: :delete_all, type: :binary_id))
      add(:post_id, references(:literature_posts, on_delete: :delete_all, type: :binary_id))
    end

    # create literature_authors
    create_if_not_exists table(:literature_authors, primary_key: false) do
      add(:id, :binary_id, primary_key: true)
      add(:slug, :string, null: false)
      add(:name, :string, null: false)
      add(:profile_image, :string)
      add(:cover_image, :string)
      add(:bio, :text)
      add(:website, :string)
      add(:location, :string)
      add(:facebook, :string)
      add(:twitter, :string)
      add(:meta_title, :string)
      add(:meta_description, :string)
      add(:meta_keywords, :string)

      add(
        :publication_id,
        references(:literature_publications, on_delete: :nilify_all, type: :binary_id)
      )

      timestamps()
    end

    # create literature_authors_posts
    create_if_not_exists table(:literature_authors_posts, primary_key: false) do
      add(:author_id, references(:literature_authors, on_delete: :delete_all, type: :binary_id))
      add(:post_id, references(:literature_posts, on_delete: :delete_all, type: :binary_id))
    end

    create_if_not_exists(unique_index(:literature_tags, [:publication_id, :slug]))
    create_if_not_exists(unique_index(:literature_publications, [:slug]))
    create_if_not_exists(unique_index(:literature_posts, [:publication_id, :slug]))
  end

  def down(_opts) do
    drop_if_exists(table(:literature_authors_posts))
    drop_if_exists(table(:literature_authors))
    drop_if_exists(table(:literature_tags_posts))
    drop_if_exists(table(:literature_posts))
    drop_if_exists(table(:literature_tags))
    drop_if_exists(table(:literature_publications))
  end
end