public async Task <IActionResult> Post() { var subscriber = new EventGridSubscriber(); using var ms = new MemoryStream(); await Request.Body.CopyToAsync(ms); ms.Position = 0; using var sr = new StreamReader(ms); var message = await sr.ReadToEndAsync(); ms.Position = 0; var events = subscriber.DeserializeEventGridEvents(ms); _logger.LogInformation($"{events.Length} Message(s) Received"); foreach (var evt in events) { _logger.LogInformation($"Handling {evt.EventType}: {evt.GetType().Name}"); evt.Validate(); _ = evt.Data switch { SubscriptionValidationEventData validationEvent => HandleValidationEvent(validationEvent), IotHubDeviceTelemetryEventData iotData => await HandleIotData(iotData), _ => HandleUnknown(evt.Data) }; } return(Ok()); }
private IActionResult HandleValidation(SubscriptionValidationEventData validationEventData) { return(new OkObjectResult( new SubscriptionValidationResponse { ValidationResponse = validationEventData.ValidationCode })); }
private IActionResult HandleValidationEvent(SubscriptionValidationEventData validationEvent) { _logger.LogInformation($"{validationEvent.ValidationCode}: {validationEvent.ValidationUrl}"); var d = new Dictionary <string, string> { ["validationResponse"] = validationEvent.ValidationCode }; return(Ok(d)); }
/// <summary> /// Validate an event grid subscription event. /// </summary> /// <param name="gridEvent">The event to validate.</param> /// <returns>The validation response with the validation code.</returns> /// <exception cref="Exception">Thrown if validation failed.</exception> public SubscriptionValidationResponse Validate(EventGridEvent gridEvent) { string data = gridEvent.Data.ToString(); SubscriptionValidationEventData eventData = JsonConvert.DeserializeObject <SubscriptionValidationEventData>(data); if (eventData == null || string.IsNullOrEmpty(eventData.ValidationCode)) { throw new Exception(); } return(new SubscriptionValidationResponse(eventData.ValidationCode)); }
public void LmiWebhookReceiverServiceExtractEventReturnsExpectedSubscriptionRequest() { // Arrange var subscriptionValidationEventData = new SubscriptionValidationEventData("a validation code", "a validation url"); var expectedResult = new WebhookRequestModel { WebhookCommand = WebhookCommand.SubscriptionValidation, SubscriptionValidationResponse = new SubscriptionValidationResponse { ValidationResponse = subscriptionValidationEventData.ValidationCode }, }; var eventGridEvents = BuildValidEventGridEvent(Microsoft.Azure.EventGrid.EventTypes.EventGridSubscriptionValidationEvent, subscriptionValidationEventData); var requestBody = JsonConvert.SerializeObject(eventGridEvents); // Act var result = lmiWebhookReceiverService.ExtractEvent(requestBody); // Assert Assert.Equal(expectedResult.WebhookCommand, result.WebhookCommand); Assert.Equal(expectedResult.SubscriptionValidationResponse.ValidationResponse, result.SubscriptionValidationResponse?.ValidationResponse); }
public async Task <IActionResult> HandleStorageEvent( [FromBody] EventGridEvent[] eventGridEvents ) { try { Container storageEventsContainer = _cosmosClient.GetContainer(_cosmosDefaultDb, "StorageEvents"); foreach (var eventGridEvent in eventGridEvents) { if (eventGridEvent.EventType == EventTypes.EventGridSubscriptionValidationEvent) { SubscriptionValidationEventData subscriptionValidationEventData = JsonConvert.DeserializeObject <SubscriptionValidationEventData>(eventGridEvent.Data.ToString()); return(Ok(new SubscriptionValidationResponse { ValidationResponse = subscriptionValidationEventData.ValidationCode })); } StorageEventPayload payload = new StorageEventPayload( eventGridEvent.Id, eventGridEvent.EventType, eventGridEvent.EventTime, eventGridEvent.Subject, eventGridEvent.Data?.ToString() ); var result = await storageEventsContainer.CreateItemAsync <StorageEventPayload>(payload, new PartitionKey(payload.EventType)); } return(Ok()); } catch (Exception ex) { return(StatusCode(500, ex.Message)); } }