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