Some checks failed
Build and Publish / build-release (push) Has been cancelled
94 lines
2.7 KiB
Elixir
94 lines
2.7 KiB
Elixir
defmodule CustomerService.Projectors.Customer do
|
|
use Commanded.Projections.Ecto,
|
|
application: CustomerService.CommandedApp,
|
|
repo: CustomerService.Repo,
|
|
name: "CustomerService.Projetors.Customer",
|
|
consistency: :strong
|
|
|
|
alias CustomerService.Events
|
|
alias CustomerService.Projections.Customer
|
|
alias CustomerService.Aggregates.CustomerId
|
|
|
|
project(%Events.CustomerCreated{} = event, fn multi ->
|
|
%CustomerService.Aggregates.CustomerId{org_id: org_id, customer_id: customer_id} = event.id
|
|
|
|
Ecto.Multi.insert(multi, :customer, %Customer{
|
|
id: to_string(event.id),
|
|
org_id: org_id,
|
|
customer_id: customer_id,
|
|
customer_type: "individual",
|
|
first_name: event.first_name,
|
|
last_name: event.last_name,
|
|
birth_date: parse_date(event.birth_date),
|
|
gender: event.gender,
|
|
email: event.email,
|
|
phone: event.phone,
|
|
address: event.address,
|
|
document_id: event.document_id
|
|
})
|
|
end)
|
|
|
|
defp parse_date(nil), do: nil
|
|
defp parse_date(%Date{} = d), do: d
|
|
|
|
defp parse_date(str) when is_binary(str) do
|
|
case Date.from_iso8601(str) do
|
|
{:ok, d} -> d
|
|
_ -> nil
|
|
end
|
|
end
|
|
|
|
project(%Events.CorporateCustomerCreated{} = e, _meta, fn multi ->
|
|
%CustomerService.Aggregates.CustomerId{org_id: org_id, customer_id: customer_id} = e.id
|
|
|
|
Ecto.Multi.insert(multi, :customer, %Customer{
|
|
id: to_string(e.id),
|
|
org_id: org_id,
|
|
customer_id: customer_id,
|
|
customer_type: "corporate",
|
|
legal_name: e.legal_name,
|
|
commercial_name: e.commercial_name,
|
|
ruc: e.ruc,
|
|
legal_rep_name: e.legal_rep_name,
|
|
legal_rep_document_id: e.legal_rep_document_id,
|
|
email: e.email,
|
|
phone: e.phone,
|
|
address: e.address
|
|
})
|
|
end)
|
|
|
|
project(%Events.CustomerUpdated{} = e, _meta, fn multi ->
|
|
composite_id = to_string(e.id)
|
|
|
|
Ecto.Multi.update_all(multi, :customer, from(c in Customer, where: c.id == ^composite_id),
|
|
set: [
|
|
first_name: e.first_name,
|
|
last_name: e.last_name,
|
|
birth_date: parse_date(e.birth_date),
|
|
gender: e.gender,
|
|
email: e.email,
|
|
phone: e.phone,
|
|
address: e.address,
|
|
document_id: e.document_id
|
|
]
|
|
)
|
|
end)
|
|
|
|
project(%Events.CorporateCustomerUpdated{} = e, _meta, fn multi ->
|
|
composite_id = to_string(e.id)
|
|
|
|
Ecto.Multi.update_all(multi, :customer, from(c in Customer, where: c.id == ^composite_id),
|
|
set: [
|
|
legal_name: e.legal_name,
|
|
commercial_name: e.commercial_name,
|
|
ruc: e.ruc,
|
|
legal_rep_name: e.legal_rep_name,
|
|
legal_rep_document_id: e.legal_rep_document_id,
|
|
email: e.email,
|
|
phone: e.phone,
|
|
address: e.address
|
|
]
|
|
)
|
|
end)
|
|
end
|