public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "lmi/webhook")] HttpRequest?request, [DurableClient] IDurableOrchestrationClient starter) { try { logger.LogInformation("Received webhook request"); bool isDraftEnvironment = environmentValues.IsDraftEnvironment; using var streamReader = new StreamReader(request?.Body !); var requestBody = await streamReader.ReadToEndAsync().ConfigureAwait(false); if (string.IsNullOrEmpty(requestBody)) { logger.LogError($"{nameof(request)} body is null"); return(new BadRequestResult()); } string?instanceId = null; var webhookRequestModel = lmiWebhookReceiverService.ExtractEvent(requestBody); switch (webhookRequestModel.WebhookCommand) { case WebhookCommand.SubscriptionValidation: return(new OkObjectResult(webhookRequestModel.SubscriptionValidationResponse)); case WebhookCommand.PublishFromDraft: if (!isDraftEnvironment) { return(new BadRequestResult()); } instanceId = await starter.StartNewAsync(nameof(LmiImportOrchestrationTrigger.RefreshPublishedOrchestrator)).ConfigureAwait(false); break; case WebhookCommand.PurgeFromPublished: if (!isDraftEnvironment) { return(new BadRequestResult()); } instanceId = await starter.StartNewAsync(nameof(LmiImportOrchestrationTrigger.PurgePublishedOrchestrator)).ConfigureAwait(false); break; default: return(new BadRequestResult()); } logger.LogInformation($"Started orchestration with ID = '{instanceId}' for {webhookRequestModel.WebhookCommand}"); return(starter.CreateCheckStatusResponse(request, instanceId)); } catch (Exception ex) { logger.LogError(ex.ToString()); return(new StatusCodeResult((int)HttpStatusCode.InternalServerError)); } }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "lmi/webhook")] HttpRequest?request) { try { logger.LogInformation("Received webhook request"); using var streamReader = new StreamReader(request?.Body !); var requestBody = await streamReader.ReadToEndAsync().ConfigureAwait(false); if (string.IsNullOrEmpty(requestBody)) { logger.LogError($"{nameof(request)} body is null"); return(new BadRequestResult()); } var webhookRequestModel = lmiWebhookReceiverService.ExtractEvent(requestBody); switch (webhookRequestModel.WebhookCommand) { case WebhookCommand.SubscriptionValidation: return(new OkObjectResult(webhookRequestModel.SubscriptionValidationResponse)); case WebhookCommand.ReportDeltaForAll: if (!environmentValues.IsDraftEnvironment) { return(new BadRequestResult()); } return(new StatusCodeResult((int)await lmiWebhookReceiverService.ReportAll().ConfigureAwait(false))); case WebhookCommand.ReportDeltaForSoc: if (!environmentValues.IsDraftEnvironment) { return(new BadRequestResult()); } return(new StatusCodeResult((int)await lmiWebhookReceiverService.ReportSoc(webhookRequestModel.ContentId).ConfigureAwait(false))); default: return(new BadRequestResult()); } } catch (Exception ex) { logger.LogError(ex.ToString()); return(new StatusCodeResult((int)HttpStatusCode.InternalServerError)); } }
public async Task LmiWebhookHttpTriggerPostForSubscriptionValidationReturnsOk() { // Arrange var expectedResult = new StatusCodeResult((int)HttpStatusCode.OK); var function = new LmiWebhookHttpTrigger(fakeLogger, draftEnvironmentValues, fakeLmiWebhookReceiverService); var request = BuildRequestWithValidBody("a request body"); var webhookRequestModel = new WebhookRequestModel { WebhookCommand = WebhookCommand.SubscriptionValidation, }; A.CallTo(() => fakeLmiWebhookReceiverService.ExtractEvent(A <string> .Ignored)).Returns(webhookRequestModel); // Act var result = await function.Run(request, fakeDurableOrchestrationClient).ConfigureAwait(false); // Assert A.CallTo(() => fakeLmiWebhookReceiverService.ExtractEvent(A <string> .Ignored)).MustHaveHappenedOnceExactly(); A.CallTo(() => fakeDurableOrchestrationClient.StartNewAsync(A <string> .Ignored, A <SocRequestModel> .Ignored)).MustNotHaveHappened(); A.CallTo(() => fakeDurableOrchestrationClient.CreateCheckStatusResponse(A <HttpRequest> .Ignored, A <string> .Ignored, A <bool> .Ignored)).MustNotHaveHappened(); var statusResult = Assert.IsType <OkObjectResult>(result); Assert.Equal(expectedResult.StatusCode, statusResult.StatusCode); }
public async Task LmiWebhookHttpTriggerPostForSubscriptionValidationReturnsOk() { // Arrange var expectedResult = new StatusCodeResult((int)HttpStatusCode.OK); var function = new LmiWebhookHttpTrigger(fakeLogger, fakeLmiWebhookReceiverService); var request = BuildRequestWithValidBody("a request body"); var webhookRequestModel = new WebhookRequestModel { WebhookCommand = WebhookCommand.SubscriptionValidation, }; A.CallTo(() => fakeLmiWebhookReceiverService.ExtractEvent(A <string> .Ignored)).Returns(webhookRequestModel); // Act var result = await function.Run(request).ConfigureAwait(false); // Assert A.CallTo(() => fakeLmiWebhookReceiverService.ExtractEvent(A <string> .Ignored)).MustHaveHappenedOnceExactly(); A.CallTo(() => fakeLmiWebhookReceiverService.ReportAll()).MustNotHaveHappened(); A.CallTo(() => fakeLmiWebhookReceiverService.ReportSoc(A <Guid> .Ignored)).MustNotHaveHappened(); var statusResult = Assert.IsType <OkObjectResult>(result); Assert.Equal(expectedResult.StatusCode, statusResult.StatusCode); }
public async Task <IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "post", Route = "lmi/webhook")] HttpRequest?request, [DurableClient] IDurableOrchestrationClient starter) { try { logger.LogInformation("Received webhook request"); using var streamReader = new StreamReader(request?.Body !); var requestBody = await streamReader.ReadToEndAsync().ConfigureAwait(false); if (string.IsNullOrEmpty(requestBody)) { logger.LogError($"{nameof(request)} body is null"); return(new BadRequestResult()); } string? instanceId = null; SocRequestModel?socRequest = null; var webhookRequestModel = lmiWebhookReceiverService.ExtractEvent(requestBody); switch (webhookRequestModel.WebhookCommand) { case WebhookCommand.SubscriptionValidation: return(new OkObjectResult(webhookRequestModel.SubscriptionValidationResponse)); case WebhookCommand.TransformAllSocToJobGroup: socRequest = new SocRequestModel { Uri = webhookRequestModel.Url, }; instanceId = await starter.StartNewAsync(nameof(LmiOrchestrationTrigger.RefreshOrchestrator), socRequest).ConfigureAwait(false); break; case WebhookCommand.TransformSocToJobGroup: socRequest = new SocRequestModel { Uri = webhookRequestModel.Url, SocId = webhookRequestModel.ContentId, }; instanceId = await starter.StartNewAsync(nameof(LmiOrchestrationTrigger.RefreshJobGroupOrchestrator), socRequest).ConfigureAwait(false); break; case WebhookCommand.PurgeAllJobGroups: socRequest = new SocRequestModel { Uri = webhookRequestModel.Url, }; instanceId = await starter.StartNewAsync(nameof(LmiOrchestrationTrigger.PurgeOrchestrator), socRequest).ConfigureAwait(false); break; case WebhookCommand.PurgeJobGroup: socRequest = new SocRequestModel { Uri = webhookRequestModel.Url, SocId = webhookRequestModel.ContentId, }; instanceId = await starter.StartNewAsync(nameof(LmiOrchestrationTrigger.PurgeJobGroupOrchestrator), socRequest).ConfigureAwait(false); break; default: return(new BadRequestResult()); } logger.LogInformation($"Started orchestration with ID = '{instanceId}' for SOC {socRequest?.Uri}"); return(starter.CreateCheckStatusResponse(request, instanceId)); } catch (Exception ex) { logger.LogError(ex.ToString()); return(new StatusCodeResult((int)HttpStatusCode.InternalServerError)); } }