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

Defines "Event" modules.

# `aggregate_identifier_opt`

```elixir
@type aggregate_identifier_opt() ::
  atom()
  | {key_name :: atom(), type :: atom()}
  | {key_name :: atom(), type :: module()}
```

The aggregate identifier key of the event.

If it's a tuple, the type must be a module that implements the `Trogon.Commanded.ValueObject` module or [`Ecto` built-in types](https://hexdocs.pm/ecto/Ecto.Schema.html#module-types-and-casting)

# `t`

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

A struct that represents an event.

# `__using__`
*macro* 

```elixir
@spec __using__(opts :: [{:aggregate_identifier, aggregate_identifier_opt()}]) ::
  any()
```

Converts the module into an `t:t/0`.

### Options

- `:aggregate_identifier` - The aggregate identifier key.

## Aggregate Identifier

The `aggregate_identifier` is used to identify the aggregate that the event is associated with. It uses the
`@primary_key` attribute to define the column and type.

> #### Schema Field Registration {: .info}
> `aggregate_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.ValueObject`

## Usage

    defmodule MyEvent do
      use Trogon.Commanded.Event, aggregate_identifier: :id

      embedded_schema do
        # ...
      end
    end

You can also define a custom type as the aggregate identifier:

    defmodule IdentityRoleId do
      use Trogon.Commanded.ValueObject

      embedded_schema do
        field :identity_id, :string
        field :role_id, :string
      end
    end

    defmodule IdentityRoleAssigned do
      use Trogon.Commanded.Event,
        aggregate_identifier: {:id, IdentityRoleId}

      embedded_schema do
        # ...
      end
    end

---

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