Behaviour and struct builder for domain events.
An event represents something that happened in the system. Events are immutable facts — they are never rejected or retried.
Defining an event
defmodule MyApp.Tasks.Events.AssessmentCompleted do
use Orkestra.Event
field :task_id, :string, required: true
field :expert_name, :string, required: true
field :action_name, :string, required: true
field :status, :string, required: true
field :result, :map, default: %{}
field :cost_usd, :float, default: 0.0
endEmitting an event
{:ok, event} = AssessmentCompleted.new(%{
task_id: "task_123",
expert_name: "architect",
action_name: "perform-assessment",
status: "success",
result: %{...}
})
# From a command (preserves correlation, sets causation)
{:ok, event} = AssessmentCompleted.from_command(command, %{
task_id: "task_123",
...
})
Summary
Types
@type t() :: %{ __struct__: atom(), id: String.t(), type: String.t(), data: map(), metadata: Orkestra.Metadata.t(), occurred_at: DateTime.t() }
Callbacks
@callback field_definitions() :: [field_definition()]