Packages
one_piece_commanded
0.19.1
0.26.0
0.25.2
0.25.1
0.25.0
0.24.0
0.23.0
0.22.0
0.21.4
0.21.3
0.21.2
0.21.1
0.21.0
0.20.0
0.19.1
0.19.0
0.18.0
0.17.0
0.16.0
0.15.2
0.15.1
0.15.0
0.14.0
0.13.0
0.12.0
0.11.1
0.11.0
0.10.1
0.10.0
0.9.1
0.9.0
0.8.0
0.7.4
0.7.3
0.7.2
0.7.1
0.7.0
0.6.0
0.5.0
0.4.1
0.4.0
0.3.0
0.2.1
0.2.0
0.1.3
0.1.2
0.1.1
0.1.0
Extend Commanded package
Current section
Files
Jump to
Current section
Files
lib/one_piece/commanded/aggregate.ex
defmodule OnePiece.Commanded.Aggregate do
@moduledoc """
Defines "Aggregate" modules.
"""
@typedoc """
A struct that represents an aggregate.
"""
@type t :: struct()
@type event :: struct()
@doc """
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
"""
@callback apply(aggregate :: t(), event :: event()) :: t()
@doc """
Convert the module into a `Aggregate` behaviour and a `t:t/0`.
It adds an `apply/2` callback to the module as a fallback, return the aggregate as it is.
## Using
- `OnePiece.Commanded.Entity`
## 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
"""
@spec __using__(opts :: []) :: any()
defmacro __using__(opts \\ []) do
quote do
use OnePiece.Commanded.Entity, unquote(opts)
@behaviour OnePiece.Commanded.Aggregate
@before_compile OnePiece.Commanded.Aggregate
end
end
defmacro __before_compile__(env) do
quote do
@impl OnePiece.Commanded.Aggregate
def apply(%unquote(env.module){} = aggregate, _event) do
aggregate
end
end
end
end