Created
November 7, 2019 17:15
-
-
Save pksorensen/01cd11c52b155fe1a3f538517eace0be to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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