Beispiel #1
0
        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
 };