priv/repo/migrations/20260506163000_create_mailglass_inbound_storage_foundation.exs

defmodule MailglassInbound.Migrations.CreateStorageFoundation do
  @moduledoc false
  use Ecto.Migration

  def change do
    create table(:mailglass_inbound_records, primary_key: false) do
      add :id, :uuid, primary_key: true
      add :tenant_id, :text, null: false
      add :provider, :text, null: false
      add :provider_message_id, :text
      add :message_id, :text
      add :envelope_recipient, :text
      add :from, {:array, :map}, null: false, default: []
      add :to, {:array, :map}, null: false, default: []
      add :cc, {:array, :map}, null: false, default: []
      add :bcc, {:array, :map}, null: false, default: []
      add :reply_to, {:array, :map}, null: false, default: []
      add :subject, :text
      add :headers, :map, null: false, default: %{}
      add :sent_at, :utc_datetime_usec
      add :received_at, :utc_datetime_usec, null: false
      add :text_body, :text
      add :html_body, :text
      add :attachments, {:array, :map}, null: false, default: []

      timestamps(type: :utc_datetime_usec)
    end

    create index(:mailglass_inbound_records, [:tenant_id])
    create index(:mailglass_inbound_records, [:tenant_id, :provider])

    create table(:mailglass_inbound_evidence, primary_key: false) do
      add :id, :uuid, primary_key: true
      add :tenant_id, :text, null: false
      add :provider, :text, null: false

      add :inbound_record_id,
          references(:mailglass_inbound_records, type: :uuid, on_delete: :nothing),
          null: false

      add :raw_payload, :map, null: false, default: %{}
      add :raw_headers, :map, null: false, default: %{}
      add :raw_mime, :binary
      add :verification_facts, :map, null: false, default: %{}
      add :parse_warnings, :map, null: false, default: %{}
      add :attachment_blobs, :map, null: false, default: %{}

      timestamps(type: :utc_datetime_usec)
    end

    create unique_index(:mailglass_inbound_evidence, [:inbound_record_id])
    create index(:mailglass_inbound_evidence, [:tenant_id])

    create table(:mailglass_inbound_replay_runs, primary_key: false) do
      add :id, :uuid, primary_key: true
      add :tenant_id, :text, null: false
      add :replay_id, :text, null: false
      add :mailbox, :text, null: false
      add :outcome, :text
      add :outcome_reason, :text
      add :failure, :map, null: false, default: %{}
      add :executed_at, :utc_datetime_usec, null: false
      add :metadata, :map, null: false, default: %{}

      add :inbound_record_id,
          references(:mailglass_inbound_records, type: :uuid, on_delete: :nothing),
          null: false

      add :inbound_evidence_id,
          references(:mailglass_inbound_evidence, type: :uuid, on_delete: :nothing),
          null: false

      timestamps(type: :utc_datetime_usec)
    end

    create unique_index(:mailglass_inbound_replay_runs, [:tenant_id, :replay_id])
    create index(:mailglass_inbound_replay_runs, [:tenant_id, :inbound_record_id])
    create index(:mailglass_inbound_replay_runs, [:tenant_id, :inbound_evidence_id])
  end
end