public async Task AddEventAsync(BaseItemEvent evt) { var entity = new EventStoreEntity(); switch (evt) { case ItemCreatedEvent created: entity.Type = nameof(ItemCreatedEvent); entity.ItemName = created.Name; break; case ItemDeletedEvent deleted: entity.Type = nameof(ItemDeletedEvent); break; case ItemUpdatedEvent updated: entity.Type = nameof(ItemUpdatedEvent); entity.ItemName = updated.Name; break; default: throw new ArgumentOutOfRangeException($"Specified type {evt.GetType()} is not supported"); } entity.EventId = evt.EventId; entity.EventDate = evt.EventDate; entity.ItemId = evt.ItemId; entity.UserName = evt.UserName; entity.Version = evt.Version; await this.collection.InsertOneAsync(entity); }
public async Task <EventStoreEntity> InsertEntityAsync(string streamId, string sequence, ConferenceModel model) { var entity = new EventStoreEntity(streamId, sequence) { EventType = model.Event, Payload = JsonConvert.SerializeObject(model.Data) }; var insertOrMergeOperation = TableOperation.Insert(entity); var result = await _eventStoreTable.ExecuteAsync(insertOrMergeOperation); return(result.Result as EventStoreEntity); }
public static async Task UpdateConferenceLookUpProjectionAsync(CloudTable eventProjectionsTable, EventStoreEntity entity) { var projection = eventProjectionsTable .CreateQuery <EventProjectionsEntity>() .Where(x => x.PartitionKey == "LookUps" && x.RowKey == "AllConferences") .Select(x => x) .SingleOrDefault() ?? await CreateLookUpProjectionAsync(eventProjectionsTable); var data = !string.IsNullOrEmpty(projection.Payload) ? JsonConvert.DeserializeObject <List <ConferenceDataModel> >(projection.Payload) : new List <ConferenceDataModel>(); var eventData = JsonConvert.DeserializeObject <ConferenceDataModel>(entity?.Payload); var conferenceData = data.SingleOrDefault(x => x.Id == eventData.Id); switch (entity?.EventType) { case "Conference.Created": data.Add(eventData); break; case "Conference.SeatsAdded": if (conferenceData != null) { conferenceData.Seats += eventData.Seats; } break; case "Conference.SeatsRemoved": if (conferenceData != null) { conferenceData.Seats -= eventData.Seats; } break; } projection.Payload = JsonConvert.SerializeObject(data); var insertOrMergeOperation = TableOperation.InsertOrReplace(projection); await eventProjectionsTable.ExecuteAsync(insertOrMergeOperation); }