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
|
||||||
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,
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user