priv/repo/migrations/20260820074227_create_api_tokens.exs

58e6347eeb72 · 1 KB

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

  def up do
    create table(:api_tokens, primary_key: false) do
      add :id, :binary_id, primary_key: true
      add :user_id, references(:users, type: :binary_id, on_delete: :delete_all), null: false
      add :name, :string, null: false
      add :token_digest, :binary, null: false
      add :scopes, {:array, :string}, null: false
      add :expires_at, :utc_datetime_usec, null: false
      add :last_used_at, :utc_datetime_usec
      add :revoked_at, :utc_datetime_usec

      timestamps(type: :utc_datetime_usec)
    end

    create unique_index(:api_tokens, [:token_digest])
    create index(:api_tokens, [:user_id, :inserted_at])
    create constraint(:api_tokens, :api_tokens_scopes_present, check: "cardinality(scopes) > 0")

    create constraint(:api_tokens, :api_tokens_scopes_allowed,
             check: "scopes <@ ARRAY['forge:write']::varchar[]"
           )

    create constraint(:api_tokens, :api_tokens_expiry_after_creation,
             check: "expires_at > inserted_at"
           )

    create constraint(:api_tokens, :api_tokens_digest_length,
             check: "octet_length(token_digest) = 32"
           )
  end

  def down do
    drop table(:api_tokens)
  end
end