lib/openagents/compensation/outcome_decision.ex

58e6347eeb72 · 1 KB

defmodule OpenAgents.Compensation.OutcomeDecision do
  @moduledoc "Independent acceptance or rejection of one immutable module outcome."
  use Ecto.Schema
  import Ecto.Changeset

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

  schema "compensation_outcome_decisions" do
    belongs_to :tool_step, OpenAgents.Conversations.ToolStep
    field :invocation_key, :string
    field :outcome_receipt_ref, :string
    field :outcome_digest, :string
    field :decision, :string
    field :reason_code, :string
    field :actor_id, :string
    field :auth_method, :string
    field :decision_receipt_ref, :string
    timestamps()
  end

  @type t :: %__MODULE__{}

  def changeset(record, attributes) do
    record
    |> cast(
      attributes,
      ~w(tool_step_id invocation_key outcome_receipt_ref outcome_digest decision reason_code actor_id auth_method decision_receipt_ref)a
    )
    |> validate_required(
      ~w(tool_step_id invocation_key outcome_receipt_ref outcome_digest decision reason_code actor_id auth_method decision_receipt_ref)a
    )
    |> validate_inclusion(:decision, ~w(accepted rejected))
    |> validate_format(:invocation_key, ~r/\A[0-9a-f]{64}\z/)
    |> validate_format(:outcome_digest, ~r/\A[0-9a-f]{64}\z/)
    |> validate_length(:reason_code, min: 1, max: 64)
    |> foreign_key_constraint(:tool_step_id)
    |> unique_constraint(:tool_step_id)
    |> unique_constraint(:outcome_receipt_ref)
    |> unique_constraint(:decision_receipt_ref)
  end
end