defmodule WorkloadService.Projections.Task do @moduledoc """ Ecto schema for the task read model. ID format: "org_id:type:task_id" (e.g., "test:quote:uuid") """ use Ecto.Schema import Ecto.Changeset @derive {Flop.Schema, filterable: [:status, :org_id, :application_id, :provider_id], sortable: [:inserted_at, :updated_at, :status]} @primary_key {:id, :string, []} schema "tasks" do field(:org_id, :string) field(:application_id, :string) field(:provider_id, :string) field(:provider_name, :string) field(:task_info, :map) field(:submission, :map) field(:attachments, {:array, :string}) field(:status, :string) field(:version, :integer, default: 1) timestamps(type: :utc_datetime) end @statuses ["created", "draft", "approved", "completed"] def status_changeset(task, attrs) do task |> cast(attrs, [:status, :task_info, :submission, :attachments, :updated_at]) |> validate_inclusion(:status, @statuses) end def create_changeset(task, attrs) do task |> cast(attrs, [ :id, :org_id, :application_id, :provider_id, :provider_name, :task_info, :submission, :attachments, :status, :version ]) |> validate_required([ :id, :org_id, :application_id, :provider_id, :provider_name, :status ]) |> validate_inclusion(:status, @statuses) end end