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