handle application_id correctly
All checks were successful
Build and Publish / build-release (push) Successful in 1m24s
All checks were successful
Build and Publish / build-release (push) Successful in 1m24s
This commit is contained in:
52
lib/workload_service/aggregates/application_id.ex
Normal file
52
lib/workload_service/aggregates/application_id.ex
Normal 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
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user