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: %CustomerId{} = id} = event) do %{event | id: id} end def decode(%{id: %LeadId{} = id} = event) do %{event | id: 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