public async Task TakeAndSaveAsync(IAggregateRoot aggregate) { var snapshot = aggregate.ToSnapshot(); string insertScript = EventRepositoryScriptsAsStrings.InsertSnapshot(); await _databaseProvider.ExecuteAsync(insertScript, snapshot); Log.Information($"Snapshot for aggregate {aggregate.GetType().Name} has been created from version {aggregate.Version}"); }
public async Task <IEnumerable <IEvent> > GetFromAsync <T>(Guid aggregateId, int fromVersion = 0) { var getAggregateSql = EventRepositoryScriptsAsStrings.GetFromVersion(typeof(T).Name, aggregateId, fromVersion); var listOfEventData = await _databaseProvider.QueryAsync <EventData>(getAggregateSql, new { aggregateId }); if (listOfEventData == null || !listOfEventData.Any()) { throw new StocqresException("Aggregate doesn't exist"); } return(listOfEventData.OrderBy(e => e.Version).Select(x => x.DeserializeEvent())); }
public async Task ValidateVersionAsync <T>(Guid aggregateId, int originalVersion) { var aggregateTypeName = typeof(T).Name; var foundVersionQuery = EventRepositoryScriptsAsStrings.FindAggregateVersion(aggregateTypeName, aggregateId); var foundVersionResult = await _databaseProvider.ExecuteScalarAsync(foundVersionQuery); if ((int?)foundVersionResult >= originalVersion) { Log.Error("Concurrency Exception"); throw new Exception("Concurrency Exception"); } }
public async Task SaveAsync <T>(IEnumerable <IEvent> events, Guid aggregateId, int originalVersion) { var validator = ValidateVersionAsync <T>(aggregateId, originalVersion); var aggregateType = typeof(T).Name; var eventsToSave = events.Select(e => e.ToEventData(aggregateId, aggregateType, originalVersion++, DateTime.Now)); string insertScript = EventRepositoryScriptsAsStrings.InsertIntoAggregate(aggregateType); await validator; await _databaseProvider.ExecuteAsync(insertScript, eventsToSave); Log.Information($"Events for aggregate {aggregateType} with Id {aggregateId} has been saved."); }
public async Task<Snapshot> GetLastAsync(Guid aggregateId) { var sql = EventRepositoryScriptsAsStrings.GetAggregateSnapshot(aggregateId); return await _databaseProvider.QueryFirstOrDefaultAsync<Snapshot>(sql); }