diff --git a/lib/workload_service/aggregates/application_id.ex b/lib/workload_service/aggregates/application_id.ex new file mode 100644 index 0000000..4e725bd --- /dev/null +++ b/lib/workload_service/aggregates/application_id.ex @@ -0,0 +1,52 @@ +defmodule WorkloadService.Aggregates.ApplicationId do + @moduledoc """ + Application identifier with org_id, application_id, and policy_type. + Used to track which policy-service application this task belongs to. + """ + + @derive Jason.Encoder + defstruct [:org_id, :application_id, :policy_type] + + def new(org_id, application_id, policy_type) do + %__MODULE__{ + org_id: org_id, + application_id: application_id, + policy_type: policy_type + } + end + + def parse(map) when is_map(map) do + case map do + %{org_id: org_id, application_id: application_id, policy_type: policy_type} -> + {:ok, new(org_id, application_id, policy_type)} + + _ -> + {:error, :invalid_application_id} + end + end + + def parse!(map) do + case parse(map) do + {:ok, id} -> id + {:error, reason} -> raise ArgumentError, "invalid application_id #{inspect(map)}: #{reason}" + end + end + + defimpl String.Chars do + def to_string(%WorkloadService.Aggregates.ApplicationId{ + org_id: org_id, + application_id: application_id, + policy_type: policy_type + }) do + "#{org_id}:#{policy_type}:#{application_id}" + end + end + + defimpl Commanded.Serialization.JsonDecoder do + def decode(%{org_id: org_id, application_id: application_id, policy_type: policy_type}) do + WorkloadService.Aggregates.ApplicationId.new(org_id, application_id, policy_type) + end + + def decode(id), do: id + end +end \ No newline at end of file diff --git a/lib/workload_service/consumers/quote_requested_consumer.ex b/lib/workload_service/consumers/quote_requested_consumer.ex index 8a567ba..d017836 100644 --- a/lib/workload_service/consumers/quote_requested_consumer.ex +++ b/lib/workload_service/consumers/quote_requested_consumer.ex @@ -50,19 +50,20 @@ defmodule WorkloadService.Consumers.QuoteRequestedConsumer do end end - defp handle_event( - %{ - "id" => %{"org_id" => org_id} = application_id, - "provider_id" => provider_id, - "policy_details" => policy_details, - "applicant_info" => applicant_info - } = event - ) do +defp handle_event( + %{ + "id" => %{"org_id" => org_id, "application_id" => app_id, "policy_type" => policy_type} = application_id, + "provider_id" => provider_id, + "policy_details" => policy_details, + "applicant_info" => applicant_info + } = event + ) do task_id = WorkloadService.Aggregates.TaskId.new(org_id, "quote", Ecto.UUID.generate()) + app_id_struct = WorkloadService.Aggregates.ApplicationId.new(org_id, app_id, policy_type) command = %QuoteTask.CreateTask{ id: task_id, - application_id: application_id, + application_id: app_id_struct, attachments: [], task_info: %{ "provider_id" => provider_id, diff --git a/lib/workload_service/events/task.ex b/lib/workload_service/events/task.ex index c7b6532..b65d15e 100644 --- a/lib/workload_service/events/task.ex +++ b/lib/workload_service/events/task.ex @@ -5,12 +5,19 @@ defmodule WorkloadService.Events do """ 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 | id: TaskId.new(org_id, type, task_id)} + 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 diff --git a/lib/workload_service/projectors/task_projector.ex b/lib/workload_service/projectors/task_projector.ex index 118422d..1c59357 100644 --- a/lib/workload_service/projectors/task_projector.ex +++ b/lib/workload_service/projectors/task_projector.ex @@ -10,13 +10,12 @@ defmodule WorkloadService.Projectors.TaskProjector do import Ecto.Query project(%Events.TaskCreated{} = e, _meta, fn multi -> - task_id = TaskId.parse!(to_string(e.id)) - %{org_id: org_id} = task_id + application_id_str = to_string(e.application_id) Ecto.Multi.insert(multi, :task, %Task{ id: to_string(e.id), - org_id: org_id, - application_id: e.application_id, + org_id: e.org_id, + application_id: to_string(e.application_id), task_info: e.task_info, attachments: e.attachments || [], status: "created" @@ -56,4 +55,4 @@ defmodule WorkloadService.Projectors.TaskProjector do Ecto.Changeset.change(task, %{status: "completed"}) end) end) -end \ No newline at end of file +end