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