View Source OnePiece.Commanded.Aggregate behaviour (OnePiece.Commanded v0.19.1)

Defines "Aggregate" modules.

Summary

Types

t()

A struct that represents an aggregate.

Callbacks

Apply a given event to the aggregate returning the new aggregate state.

Functions

Convert the module into a Aggregate behaviour and a t/0.

Types

@type event() :: struct()
@type t() :: struct()

A struct that represents an aggregate.

Callbacks

@callback apply(aggregate :: t(), event :: event()) :: t()

Apply a given event to the aggregate returning the new aggregate state.

Example

def apply(%MyAggregate{} = aggregate, %MyEvent{} = event) do
  aggregate
  |> Map.put(:name, event.name)
  |> Map.put(:description, event.description)
end

Functions

Link to this macro

__using__(opts \\ [])

View Source (macro)
@spec __using__(opts :: []) :: any()

Convert the module into a Aggregate behaviour and a t/0.

It adds an apply/2 callback to the module as a fallback, return the aggregate as it is.

Using

Usage

defmodule Account do
  use OnePiece.Commanded.Aggregate, identifier: :name

  embedded_schema do
    field :description, :string
  end

  @impl OnePiece.Commanded.Aggregate
  def apply(%Account{} = aggregate, %AccountOpened{} = event) do
    aggregate
    |> Map.put(:name, event.name)
    |> Map.put(:description, event.description)
  end
end