Files
customer-service/lib/customer_service/projectors/customer.ex
HaimKortovich 4519f797fd
All checks were successful
Build and Publish / build-release (push) Successful in 3m7s
partition by org_id and add auth
2026-05-15 10:08:54 -05:00

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: CustomerId.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: CustomerId.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 = CustomerId.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 = CustomerId.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