示例#1
0
        private async Task BroadcastOperationAsync(
            ChangeStreamOperationType operationType,
            RecordedEventDocument document
            )
        {
            switch (operationType)
            {
            case ChangeStreamOperationType.Insert:
            {
                var recordedEvent = RecordedEvent.FromDocument(document);
                Console.WriteLine("Broadcasting insert:");
                Console.WriteLine(Encoding.UTF8.GetString(recordedEvent.Data));
                await _hub.Clients.All.EventRecorded(recordedEvent);

                break;
            }

            case ChangeStreamOperationType.Update:
            case ChangeStreamOperationType.Replace:
            case ChangeStreamOperationType.Delete:
            case ChangeStreamOperationType.Invalidate:
            case ChangeStreamOperationType.Rename:
            case ChangeStreamOperationType.Drop:
                break;

            default:
                throw new ArgumentOutOfRangeException(nameof(operationType), operationType, null);
            }
        }
示例#2
0
        public static RecordedEvent FromDocument(RecordedEventDocument document)
        {
            var recordedEvent = new RecordedEvent(
                document.Id,
                document.Stream,
                document.EventId,
                document.EventType,
                document.EventNumber,
                document.Created,
                document.Data,
                document.Metadata
                );

            return(recordedEvent);
        }
示例#3
0
        public async Task <IActionResult> AppendEventAsync(
            string name,
            [FromBody] AppendEventRequest request,
            CancellationToken cancellationToken
            )
        {
            var latestEvent = await _events
                              .Find(e => e.Stream == name)
                              .SortByDescending(e => e.EventNumber)
                              .FirstOrDefaultAsync(cancellationToken);

            var document = new RecordedEventDocument
            {
                Stream      = name,
                EventId     = request.EventId,
                EventType   = request.EventType,
                EventNumber = (latestEvent?.EventNumber ?? -1L) + 1L,
                Created     = _clock.UtcNow.UtcDateTime,
                Data        = request.Data,
                Metadata    = request.Metadata
            };

            try
            {
                await _events.InsertOneAsync(document, null, cancellationToken);
            }
            catch (MongoWriteException ex)
            {
                if (ex.WriteError.Category == ServerErrorCategory.DuplicateKey)
                {
                    return(Conflict());
                }

                throw;
            }

            return(Ok());
        }