Defining events
An event updates the state of the aggregate once it has been published. So, a function that is defined inside of the events
object can be seen as an event handler that reacts to a particular event and updates the aggregate's state.
To define an event add an appropriately named function to the events
object of the aggregate the event refers to. This function receives two parameters: the aggregate instance, and the event.
Inside of the function, add code that modifies the aggregate state. For that use the setState
function of the aggregate.
Always handle events synchronously
You should be careful not to have any logic in an event, besides updating the state. That's why, unlike commands, events are always synchronous. Therefore, you must not use the
async
keyword here.
E.g., to handle an issued
event and set the isIssued
property to true
, use the following code:
const events = {
issued (invoice, event) {
invoice.setState({
isIssued: true
});
}
};
For a detailed list of an event's properties, see the data structure of events.
Reserved event names
Do not name an event
transferredOwnership
orauthorized
, since these are reserved names.
Accessing the event data
To set the aggregate state you may need to access the event data. For that, use the event.data
property.
E.g., to set the requiresAttention
property depending on the amount that is given in the issued
event, use the following code:
invoice.setState({
requiresAttention: event.data.amount > 2500
});
To get the aggregate ID, access the property id
of the aggregate directly, as the ID is not part of the state.