lib/openagents/agents/agent.ex

58e6347eeb72 · 1 KB

defmodule OpenAgents.Agents.Agent do
  @moduledoc false

  use Ecto.Schema
  import Ecto.Changeset

  @primary_key {:id, :binary_id, autogenerate: true}
  @foreign_key_type :binary_id
  @timestamps_opts [type: :utc_datetime_usec]

  schema "agents" do
    field :handle, :string
    field :display_name, :string
    field :description, :string
    field :status, :string, default: "active"
    field :suspended_at, :utc_datetime_usec
    field :suspension_reason, :string
    field :registration_ip_digest, :binary, redact: true

    has_many :tokens, OpenAgents.Agents.AgentToken
    has_many :user_links, OpenAgents.Agents.AgentUserLink
    has_many :box_control_grants, OpenAgents.Agents.AgentBoxGrant

    timestamps()
  end

  def changeset(agent, attrs) do
    agent
    |> cast(attrs, [
      :handle,
      :display_name,
      :description,
      :status,
      :suspended_at,
      :suspension_reason,
      :registration_ip_digest
    ])
    |> validate_required([:handle, :display_name, :registration_ip_digest])
    |> validate_length(:handle, min: 3, max: 39)
    |> validate_length(:display_name, min: 1, max: 255)
    |> validate_length(:description, max: 4_000)
    |> validate_inclusion(:status, ["active", "suspended"])
    |> unique_constraint(:handle, name: :agents_lower_handle_index)
    |> check_constraint(:handle, name: :agents_handle_check)
    |> check_constraint(:status, name: :agents_status_check)
  end
end