public List <WebhookMessage> Create(IReadOnlyList <GroupEventSubscriptionStateEntity> state,
                                            IReadOnlyList <GroupEvent> groupEvent, UserSubscriptionsGroupEventMessage message)
        {
            var messages = new List <WebhookMessage>();

            if (message.OnCreated)
            {
                var createdEvents = GetNewlyCreatedEvents(state, groupEvent);
                messages.AddRange(CreateMessages(createdEvents, "Created", message.EndpointUrl));
            }

            if (message.OnUpdated)
            {
                var updatedEvents = GetUpdatedEvents(state, groupEvent);
                messages.AddRange(CreateMessages(updatedEvents, "Updated", message.EndpointUrl));
            }

            if (message.OnDeleted)
            {
                var deletedEvents = GetDeletedStates(state, groupEvent);
                messages.AddRange(deletedEvents.Select(x => new WebhookMessage()
                {
                    Id          = x.RowKey,
                    Updated     = SystemDateTime.UtcNow,
                    Created     = x.Created,
                    Status      = "Deleted",
                    Type        = "GroupEvent",
                    EndpointUrl = message.EndpointUrl
                }));
            }

            return(messages);
        }
        public static async Task Run(
            [QueueTrigger(QueueNames.GroupEventSubscription, Connection = "AzureWebJobsStorage")]
            UserSubscriptionsGroupEventMessage message,
            [Table(TableNames.GroupEventSubscriptionState, Connection = "AzureWebJobsStorage")]
            CloudTable stateTable,
            TraceWriter log)
        {
            var states = stateTable.CreateQuery <GroupEventSubscriptionStateEntity>()
                         .Where(x => x.PartitionKey == message.SubscriptionId)
                         .ToList();

            var client = new GroupEventsClient(new MeetupHttpClientFactory(new HttpClientHandler()));

            var groupEvents = await client.GetGroupEventsAsync(message.UrlName, message.AccessToken);

            var webhooks = new GroupEventsWebhookFactory()
                           .Create(states, groupEvents, message);

            var updatedStates = states.Join(webhooks, entity => entity.RowKey, webhook => webhook.Id,
                                            (entity, webhook) =>
                                            new GroupEventSubscriptionStateEntity()
            {
                PartitionKey = message.SubscriptionId,
                RowKey       = entity.RowKey,
                LastStatus   = webhook.Status,
                LastUpdated  = webhook.Updated,
                Created      = entity.Created,
                IsDeleted    = entity.IsDeleted
            });


            foreach (var entity in updatedStates)
            {
                var update = TableOperation.Replace(entity);

                var result = stateTable.Execute(update);

                if (!result.IsSuccessStatusCode())
                {
                    log.Error($"Unexpected status code of {result.HttpStatusCode} while updating state {entity.PartitionKey}, {entity.RowKey}");
                }
            }
        }