save method
Save AggregateState of given aggregate
to this store
Implementation
Future<AggregateStateResult<TEvent, TValue, TId, TState>> save(
TAggregate aggregate) async {
if (!aggregate.isChanged) {
return AggregateStateNoOp(aggregate.current);
}
try {
var position = aggregate.expectedVersion.value;
final append = await _events.appendEvents(
StreamName.from(aggregate),
aggregate.changes.map(
(e) => toStreamEvent(e, ++position),
),
aggregate.expectedVersion,
);
if (append.isOk) {
final result = aggregate.commit();
await _saveState(aggregate);
return result;
}
return AggregateStateResult.error(
(append as AppendEventsError).cause,
aggregate,
);
} on StreamNotFoundException {
return AggregateStateResult.error(
AggregateNotFoundException(
TAggregate,
aggregate.id,
),
aggregate,
);
} on Exception catch (error) {
return AggregateStateResult.error(
error,
aggregate..rollback(),
);
}
}