priv/repo/migrations/20260823141005_create_box_assignments_and_scoped_credentials.exs

58e6347eeb72 · 2 KB

defmodule OpenAgents.Repo.Migrations.CreateBoxAssignmentsAndScopedCredentials do
  use Ecto.Migration

  def change do
    create table(:forge_assignments, primary_key: false) do
      add :id, :binary_id, primary_key: true

      add :conversation_box_id,
          references(:conversation_boxes, type: :binary_id, on_delete: :restrict), null: false

      add :repository_id, references(:repositories, type: :binary_id, on_delete: :restrict),
        null: false

      add :issue_id, references(:issues, on_delete: :restrict), null: false
      add :run_id, references(:box_runs, type: :binary_id, on_delete: :nilify_all)
      add :requesting_principal, :map, null: false
      add :branch, :string, null: false
      add :state, :string, null: false, default: "admitted"
      add :terminal_branch, :string
      add :terminal_commit, :string
      add :failure_reason, :string
      add :deadline_at, :utc_datetime_usec, null: false
      add :admitted_at, :utc_datetime_usec, null: false
      add :started_at, :utc_datetime_usec
      add :finished_at, :utc_datetime_usec
      timestamps(type: :utc_datetime_usec)
    end

    create unique_index(:forge_assignments, [:conversation_box_id],
             name: :forge_assignments_one_active_box_index,
             where: "state IN ('admitted', 'running')"
           )

    create unique_index(:forge_assignments, [:issue_id],
             name: :forge_assignments_one_active_issue_index,
             where: "state IN ('admitted', 'running')"
           )

    create index(:forge_assignments, [:repository_id, :issue_id])

    create constraint(:forge_assignments, :forge_assignments_state_check,
             check: "state IN ('admitted', 'running', 'completed', 'failed', 'cancelled')"
           )

    create table(:forge_assignment_credentials, primary_key: false) do
      add :id, :binary_id, primary_key: true

      add :assignment_id,
          references(:forge_assignments, type: :binary_id, on_delete: :delete_all),
          null: false

      add :token_digest, :binary, null: false
      add :last_four, :string, null: false
      add :repository_id, :binary_id, null: false
      add :branch, :string, null: false
      add :expires_at, :utc_datetime_usec, null: false
      add :revoked_at, :utc_datetime_usec
      timestamps(type: :utc_datetime_usec)
    end

    create unique_index(:forge_assignment_credentials, [:token_digest])
    create unique_index(:forge_assignment_credentials, [:assignment_id])
    create index(:forge_assignment_credentials, [:expires_at])

    create constraint(:forge_assignment_credentials, :forge_assignment_credentials_digest_length,
             check: "octet_length(token_digest) = 32"
           )
  end
end