Packages
one_piece_commanded
0.25.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.
### Options
- `:identifier` - The aggregate identifier key.
- `:identity_prefix` (optional) - The prefix to be used for the identity.
## Identifier
The `identifier` is used to identify the aggregate. It uses the `@primary_key` attribute to define the column and type.
> #### Schema Field Registration {: .info}
> `identifier` is automatically registered as a field in the `embedded_schema`.
> Do not define the field in the `embedded_schema` yourself again.
## 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 ::
OnePiece.Commanded.Entity.using_opts()
| [identity_prefix: String.t() | nil]
) :: any()
defmacro __using__(opts \\ []) do
{opts, entity_opts} = Keyword.split(opts, [:identity_prefix])
identity_prefix = Keyword.get(opts, :identity_prefix)
quote generated: true do
use OnePiece.Commanded.Entity, unquote(entity_opts)
@behaviour OnePiece.Commanded.Aggregate
@before_compile OnePiece.Commanded.Aggregate
@doc """
Returns `#{inspect(unquote(identity_prefix))}` as the identity prefix.
"""
@spec identity_prefix :: String.t() | nil
def identity_prefix do
unquote(identity_prefix)
end
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