priv/repo/migrations/20260820211218_add_cli_device_authorizations.exs

main at 58e6347eeb72 · 1 KB

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

  def change do
    create table(:device_authorizations, primary_key: false) do
      add :id, :binary_id, primary_key: true, default: fragment("gen_random_uuid()")
      add :device_code_digest, :binary, null: false
      add :user_code_digest, :binary, null: false
      add :state, :string, null: false, default: "pending"
      add :scopes, {:array, :string}, null: false, default: ["forge:write"]
      add :interval_seconds, :integer, null: false, default: 5
      add :poll_count, :integer, null: false, default: 0
      add :last_polled_at, :utc_datetime_usec
      add :expires_at, :utc_datetime_usec, null: false
      add :approved_at, :utc_datetime_usec
      add :denied_at, :utc_datetime_usec
      add :claimed_at, :utc_datetime_usec

      add :user_id, references(:users, type: :binary_id, on_delete: :delete_all)

      add :api_token_id,
          references(:api_tokens, type: :binary_id, on_delete: :nilify_all)

      timestamps(type: :utc_datetime_usec)
    end

    create unique_index(:device_authorizations, [:device_code_digest])
    create unique_index(:device_authorizations, [:user_code_digest])
    create index(:device_authorizations, [:expires_at])

    create constraint(:device_authorizations, :device_authorizations_state_check,
             check: "state IN ('pending', 'approved', 'denied', 'claimed')"
           )

    create constraint(:device_authorizations, :device_authorizations_interval_check,
             check: "interval_seconds BETWEEN 1 AND 30"
           )

    create constraint(:device_authorizations, :device_authorizations_poll_count_check,
             check: "poll_count >= 0"
           )
  end
end