Skip to content

Instantly share code, notes, and snippets.

@pksorensen
Created November 7, 2019 17:15
Show Gist options
  • Save pksorensen/01cd11c52b155fe1a3f538517eace0be to your computer and use it in GitHub Desktop.
Save pksorensen/01cd11c52b155fe1a3f538517eace0be to your computer and use it in GitHub Desktop.
public class EventPublisher
{
private readonly EventGridConfiguration options;
private readonly IHostingEnvironment environment;
public EventPublisher(IOptions<EventGridConfiguration> options, IHostingEnvironment environment)
{
this.options = options?.Value ?? throw new ArgumentNullException(nameof(options));
this.environment = environment ?? throw new ArgumentNullException(nameof(environment));
}
public async Task<EventSubscription> CreateWebhookAsync( Guid subscriptionId, string collectionId, string targetUrl, params string[] events)
{
var tokenProvider = new AzureServiceTokenProvider();
var accessToken = await tokenProvider.GetAccessTokenAsync("https://management.azure.com/");
var eventGridManagementClient = new EventGridManagementClient(new TokenCredentials(accessToken))
{
SubscriptionId = options.ResourceId.Trim('/').Split('/').Skip(1).FirstOrDefault()
};
var domain = await eventGridManagementClient.Domains.GetAsync(options.ResourceId.Trim('/').Split('/').Skip(3).FirstOrDefault(), options.ResourceId.Trim('/').Split('/').LastOrDefault());
var topic = await eventGridManagementClient.DomainTopics.CreateOrUpdateAsync(
options.ResourceId.Trim('/').Split('/').Skip(3).FirstOrDefault(), options.ResourceId.Trim('/').Split('/').LastOrDefault(), $"topic-{(environment.IsProduction()?"prod":"test")}-{collectionId}");
var eventSubscription = new EventSubscription
{
Destination= new WebHookEventSubscriptionDestination()
{
EndpointUrl = targetUrl,
},
Filter = new EventSubscriptionFilter()
{
IncludedEventTypes= events?.Any()??false ? events : null,
SubjectBeginsWith = $"/subscriptions/{subscriptionId}/collections/{collectionId}/",
},
};
var sub= await eventGridManagementClient.EventSubscriptions.CreateOrUpdateAsync(topic.Id, $"webhook-{(environment.IsProduction() ? "prod" : "test")}-{Guid.NewGuid().ToString("N")}", eventSubscription);
return sub;
}
public async Task PublishEventAsync(EventMessage eventMessage)
{
string domainHostname = new Uri(options.Endpoint).Host;
TopicCredentials domainKeyCredentials = new TopicCredentials(options.Key);
EventGridClient client = new EventGridClient(domainKeyCredentials);
await client.PublishEventsAsync(domainHostname, new List<EventGridEvent> {
new EventGridEvent
{
Id = Guid.NewGuid().ToString(),
DataVersion = "2.0",
EventTime = eventMessage.RecordedAt.UtcDateTime,
Data = eventMessage,
Subject = $"/subscriptions/{eventMessage.SubscriptionId}/collections/{eventMessage.CollectionId}/eventTypes/{eventMessage.EventType}/events/{eventMessage.ContentMD5}",
EventType = eventMessage.EventType,
Topic = $"topic-{(environment.IsProduction()?"prod":"test")}-{eventMessage.CollectionId}"
}
});
}
public async Task DeleteWebhook(string subscriptionId, string collectionid, string hookName)
{
var tokenProvider = new AzureServiceTokenProvider();
var accessToken = await tokenProvider.GetAccessTokenAsync("https://management.azure.com/");
var eventGridManagementClient = new EventGridManagementClient(new TokenCredentials(accessToken))
{
SubscriptionId = options.ResourceId.Trim('/').Split('/').Skip(1).FirstOrDefault()
};
await eventGridManagementClient.EventSubscriptions.DeleteAsync(options.ResourceId,hookName);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment