Ejemplo n.º 1
0
        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);
        }