defmodule CustomerService.Events do @moduledoc """ Events macro for adding JsonDecoder to domain events. """ alias CustomerService.Aggregates.CustomerId alias CustomerService.Aggregates.LeadId defmacro __using__(_opts) do quote do defimpl Commanded.Serialization.JsonDecoder do def decode( %{ id: %{ org_id: org_id, customer_type: customer_type, customer_id: customer_id } } = event ) do %{ event | id: CustomerService.Aggregates.CustomerId.new(org_id, customer_type, customer_id) } end def decode( %{ id: %{ org_id: org_id, type: "lead", lead_id: lead_id } } = event ) do %{event | id: CustomerService.Aggregates.LeadId.new(org_id, lead_id)} end def decode(event), do: event end end end end defmodule CustomerService.Events.CustomerCreated do use CustomerService.Events @derive Jason.Encoder defstruct [ :id, :first_name, :last_name, :birth_date, :gender, :email, :phone, :address, :document_id ] end defmodule CustomerService.Events.CorporateCustomerCreated do use CustomerService.Events @derive Jason.Encoder defstruct [ :id, :legal_name, :commercial_name, :ruc, :legal_rep_name, :legal_rep_document_id, :email, :phone, :address ] end defmodule CustomerService.Events.CustomerUpdated do use CustomerService.Events @derive Jason.Encoder defstruct [ :id, :first_name, :last_name, :birth_date, :gender, :email, :phone, :address, :document_id ] end defmodule CustomerService.Events.CorporateCustomerUpdated do use CustomerService.Events @derive Jason.Encoder defstruct [ :id, :legal_name, :commercial_name, :ruc, :legal_rep_name, :legal_rep_document_id, :email, :phone, :address ] end defmodule CustomerService.Events.QuickLeadCreated do use CustomerService.Events @derive Jason.Encoder defstruct [ :id, :name, :email, :phone, :company_name, :status, :priority, :source, :notes, :assigned_to, :estimated_value, :expected_close_date ] end defmodule CustomerService.Events.QuickLeadUpdated do use CustomerService.Events @derive Jason.Encoder defstruct [ :id, :name, :email, :phone, :company_name, :notes, :assigned_to, :estimated_value, :expected_close_date ] end defmodule CustomerService.Events.LeadStatusUpdated do use CustomerService.Events @derive Jason.Encoder defstruct [:id, :status, :previous_status, :updated_at] end