# `Trogon.Commanded.Aggregate`
[🔗](https://github.com/straw-hat-team/beam-monorepo/blob/trogon_commanded@v1.0.1/apps/trogon_commanded/lib/trogon/commanded/aggregate.ex#L1)

Defines "Aggregate" modules.

# `event`

```elixir
@type event() :: struct()
```

# `t`

```elixir
@type t() :: struct()
```

A struct that represents an aggregate.

# `apply`

```elixir
@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

# `__using__`
*macro* 

```elixir
@spec __using__(
  opts ::
    Trogon.Commanded.Entity.using_opts()
    | [{:identity_prefix, String.t() | nil | {module(), atom()}}]
) :: any()
```

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

- `Trogon.Commanded.Entity`

## Usage

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

      embedded_schema do
        field :description, :string
      end

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

---

*Consult [api-reference.md](api-reference.md) for complete listing*
