save method

Future<AggregateStateResult<TEvent, TValue, TId, TState>> save(
  1. TAggregate aggregate
)

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(),
    );
  }
}