priv/repo/migrations/20260820161342_create_scv_codex_driver_accounts.exs

58e6347eeb72 · 2 KB

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

  def change do
    create table(:scv_driver_accounts, primary_key: false) do
      add :id, :uuid, primary_key: true
      add :operator_id, references(:users, type: :uuid, on_delete: :restrict), null: false
      add :driver, :string, null: false
      add :credential_kind, :string, null: false
      add :label, :string, null: false
      add :status, :string, null: false
      add :secret_ref, :string, null: false
      add :credential_version, :bigint
      add :account_email, :string
      add :plan_type, :string
      add :available_models, {:array, :string}, null: false, default: []
      add :reasoning_efforts, {:array, :string}, null: false, default: []
      add :last_verified_at, :utc_datetime_usec
      add :last_error_code, :string
      add :disconnected_at, :utc_datetime_usec

      timestamps(type: :utc_datetime_usec)
    end

    create unique_index(:scv_driver_accounts, [:secret_ref])
    create index(:scv_driver_accounts, [:operator_id, :status])

    create constraint(:scv_driver_accounts, :scv_driver_accounts_driver_check,
             check: "driver = 'codex_app_server'"
           )

    create constraint(:scv_driver_accounts, :scv_driver_accounts_credential_kind_check,
             check: "credential_kind = 'managed_chatgpt'"
           )

    create constraint(:scv_driver_accounts, :scv_driver_accounts_status_check,
             check:
               "status IN ('pending','ready','failed','reauthentication_required','disconnected')"
           )

    create table(:scv_driver_login_attempts, primary_key: false) do
      add :id, :uuid, primary_key: true

      add :account_id,
          references(:scv_driver_accounts, type: :uuid, on_delete: :delete_all),
          null: false

      add :operator_id, references(:users, type: :uuid, on_delete: :restrict), null: false
      add :login_id, :string
      add :status, :string, null: false
      add :verification_url, :string
      add :user_code_digest, :binary
      add :expires_at, :utc_datetime_usec, null: false
      add :completed_at, :utc_datetime_usec
      add :failure_code, :string

      timestamps(type: :utc_datetime_usec)
    end

    create unique_index(:scv_driver_login_attempts, [:login_id], where: "login_id IS NOT NULL")
    create index(:scv_driver_login_attempts, [:account_id, :inserted_at])
    create index(:scv_driver_login_attempts, [:operator_id, :status])

    create constraint(:scv_driver_login_attempts, :scv_driver_login_attempts_status_check,
             check: "status IN ('starting','waiting','succeeded','failed','cancelled','expired')"
           )
  end
end