defmodule WorkloadService.Events do @moduledoc """ All domain events for the workload service. Contains helpers for common event functionality. """ alias WorkloadService.Aggregates.TaskId alias WorkloadService.Aggregates.ApplicationId defmacro __using__(_opts) do quote do defimpl Commanded.Serialization.JsonDecoder do def decode(%{id: %{org_id: org_id, type: type, task_id: task_id}} = event) do event = %{event | id: TaskId.new(org_id, type, task_id)} if Map.has_key?(event, :application_id) && is_map(event.application_id) do %{event | application_id: ApplicationId.parse!(event.application_id)} else event end end def decode(event), do: event end end end end defmodule WorkloadService.Events.TaskCreated do @moduledoc """ Emitted when a new task is created (quote or solicitation). ID format: "org_id:type:task_id" (e.g., "test:quote:uuid") - TaskId struct """ use WorkloadService.Events @derive Jason.Encoder defstruct [:id, :application_id, :task_info, :attachments] end defmodule WorkloadService.Events.SubmissionUpdated do @moduledoc """ Emitted when submission is updated (user provides response data). """ use WorkloadService.Events @derive Jason.Encoder defstruct [:id, :submission, :attachments] end defmodule WorkloadService.Events.SubmissionApproved do @moduledoc """ Emitted when submission is approved and ready to send. """ use WorkloadService.Events @derive Jason.Encoder defstruct [:id] end defmodule WorkloadService.Events.TaskCompleted do @moduledoc """ Emitted when task is completed and sent to policy-service. Triggers RabbitMQ publish. """ use WorkloadService.Events @derive Jason.Encoder defstruct [:id, :completed_by] end