public async Task AppendEventsAsync(AppendEvents model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } await _unitOfWork.CommitOrUndoAsync(async() => { await _validatorFactory.GetValidator <AppendEvents>().ValidateAndThrowAsync(model); var stream = await _unitOfWork.StreamRepository.GetStreamByNameAsync(model.StreamName); if (stream == null) { stream = new Repository.Entities.Stream { Name = model.StreamName, Version = 0 }; await _unitOfWork.StreamRepository.AddStreamAsync(stream); } if (stream.Version != model.ExpectedVersion) { throw new ConcurrencyException($"Concurrency error - expected stream version to be {stream.Version} but got {model.ExpectedVersion}"); } var events = model.Events.Select(e => new Repository.Entities.Event { StreamId = stream.StreamId, Type = e.Type, Data = e.Data, Version = ++stream.Version }).ToList(); await _unitOfWork.StreamRepository.AddEventsAsync(events); await _unitOfWork.StreamRepository.UpdateStreamAsync(stream); }); }
public static Stream FromEntity(this Repository.Entities.Stream entity) => new Stream { Name = entity.Name, Version = entity.Version, CreatedAt = entity.CreatedAt, UpdatedAt = entity.UpdatedAt };