handle application_id correctly
All checks were successful
Build and Publish / build-release (push) Successful in 1m24s

This commit is contained in:
2026-04-17 12:44:02 -05:00
parent 571cc94711
commit 1187b8e1a8
4 changed files with 74 additions and 15 deletions

View File

@@ -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

View File

@@ -50,19 +50,20 @@ defmodule WorkloadService.Consumers.QuoteRequestedConsumer do
end end
end end
defp handle_event( defp handle_event(
%{ %{
"id" => %{"org_id" => org_id} = application_id, "id" => %{"org_id" => org_id, "application_id" => app_id, "policy_type" => policy_type} = application_id,
"provider_id" => provider_id, "provider_id" => provider_id,
"policy_details" => policy_details, "policy_details" => policy_details,
"applicant_info" => applicant_info "applicant_info" => applicant_info
} = event } = event
) do ) do
task_id = WorkloadService.Aggregates.TaskId.new(org_id, "quote", Ecto.UUID.generate()) 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{ command = %QuoteTask.CreateTask{
id: task_id, id: task_id,
application_id: application_id, application_id: app_id_struct,
attachments: [], attachments: [],
task_info: %{ task_info: %{
"provider_id" => provider_id, "provider_id" => provider_id,

View File

@@ -5,12 +5,19 @@ defmodule WorkloadService.Events do
""" """
alias WorkloadService.Aggregates.TaskId alias WorkloadService.Aggregates.TaskId
alias WorkloadService.Aggregates.ApplicationId
defmacro __using__(_opts) do defmacro __using__(_opts) do
quote do quote do
defimpl Commanded.Serialization.JsonDecoder do defimpl Commanded.Serialization.JsonDecoder do
def decode(%{id: %{org_id: org_id, type: type, task_id: task_id}} = event) 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 end
def decode(event), do: event def decode(event), do: event

View File

@@ -10,13 +10,12 @@ defmodule WorkloadService.Projectors.TaskProjector do
import Ecto.Query import Ecto.Query
project(%Events.TaskCreated{} = e, _meta, fn multi -> project(%Events.TaskCreated{} = e, _meta, fn multi ->
task_id = TaskId.parse!(to_string(e.id)) application_id_str = to_string(e.application_id)
%{org_id: org_id} = task_id
Ecto.Multi.insert(multi, :task, %Task{ Ecto.Multi.insert(multi, :task, %Task{
id: to_string(e.id), id: to_string(e.id),
org_id: org_id, org_id: e.org_id,
application_id: e.application_id, application_id: to_string(e.application_id),
task_info: e.task_info, task_info: e.task_info,
attachments: e.attachments || [], attachments: e.attachments || [],
status: "created" status: "created"
@@ -56,4 +55,4 @@ defmodule WorkloadService.Projectors.TaskProjector do
Ecto.Changeset.change(task, %{status: "completed"}) Ecto.Changeset.change(task, %{status: "completed"})
end) end)
end) end)
end end