public static async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] HttpRequest req, ILogger log) { log.LogInformation("C# HTTP trigger function processed a request."); var storageAccount = CloudStorageAccount.DevelopmentStorageAccount; var tableClient = storageAccount.CreateCloudTableClient(new TableClientConfiguration()); var eventStoreTable = tableClient.GetTableReference("EventStoreTable"); eventStoreTable.CreateIfNotExists(); var eventProjectionsTable = tableClient.GetTableReference("EventProjectionsTable"); eventProjectionsTable.CreateIfNotExists(); var linqQuery = eventStoreTable.CreateQuery <EventStoreEntity>().ToList(); var partitions = linqQuery.GroupBy(x => x.PartitionKey).Select(x => x.Key); var conferenceList = new List <ConferenceDataModel>(); TableOperation insertOrMergeOperation; foreach (var partition in partitions) { var events = linqQuery .Where(x => x.PartitionKey == partition) .OrderBy(x => x.Timestamp); var entity = ProjectionService.CreateConferenceProjection(eventProjectionsTable, new Message { Stream = "Conference", Id = partition }, events); conferenceList.Add(JsonConvert.DeserializeObject <ConferenceDataModel>(entity.Payload)); insertOrMergeOperation = TableOperation.InsertOrReplace(entity); await eventProjectionsTable.ExecuteAsync(insertOrMergeOperation); } var allConferences = new EventProjectionsEntity { PartitionKey = "LookUps", RowKey = "AllConferences", Payload = JsonConvert.SerializeObject(conferenceList) }; insertOrMergeOperation = TableOperation.InsertOrReplace(allConferences); await eventProjectionsTable.ExecuteAsync(insertOrMergeOperation); return(new OkObjectResult("")); }
public static async Task <EventProjectionsEntity> CreateLookUpProjectionAsync(CloudTable eventProjectionsTable) { var allConferences = new EventProjectionsEntity { PartitionKey = "LookUps", RowKey = "AllConferences", Payload = string.Empty }; var insertOrMergeOperation = TableOperation.InsertOrReplace(allConferences); var result = await eventProjectionsTable.ExecuteAsync(insertOrMergeOperation); return(result.Result as EventProjectionsEntity); }
public static EventProjectionsEntity CreateConferenceProjection(CloudTable eventProjectionsTable, Message message, IEnumerable <EventStoreEntity> list) { var projection = eventProjectionsTable .CreateQuery <EventProjectionsEntity>() .Where(x => x.PartitionKey == "Conference" && x.RowKey == message.Id) .Select(x => x) .SingleOrDefault() ?? new EventProjectionsEntity(message.Stream, message.Id); var dataModel = !string.IsNullOrEmpty(projection.Payload) ? JsonConvert.DeserializeObject <ConferenceDataModel>(projection.Payload) : new ConferenceDataModel(); var lastSequenceRun = string.Empty; foreach (var item in list.OrderBy(x => x.Timestamp)) { lastSequenceRun = item.RowKey; ConferenceDataModel data; switch (item.EventType) { case "Conference.Created": dataModel = JsonConvert.DeserializeObject <ConferenceDataModel>(item.Payload); break; case "Conference.SeatsAdded": data = JsonConvert.DeserializeObject <ConferenceDataModel>(item.Payload); dataModel.Seats += data.Seats; break; case "Conference.SeatsRemoved": data = JsonConvert.DeserializeObject <ConferenceDataModel>(item.Payload); dataModel.Seats -= data.Seats; break; } } var entity = new EventProjectionsEntity(message.Stream, message.Id) { LastSequenceRun = lastSequenceRun, Payload = JsonConvert.SerializeObject(dataModel) }; return(entity); }