public async Task <HttpResponseMessage> RunAsync(HttpRequestMessage req, CancellationToken cancellationToken) { _log.LogDebug($"Context: {_context.InvocationId} {_context.FunctionName} {_context.FunctionDirectory} {_context.FunctionAppDirectory}"); var ruleName = _context.FunctionName; var aggregatorVersion = GetCustomAttribute <System.Reflection.AssemblyInformationalVersionAttribute>()?.InformationalVersion; _log.LogInformation($"Aggregator v{aggregatorVersion} executing rule '{ruleName}'"); cancellationToken.ThrowIfCancellationRequested(); // Get request body var eventData = await GetWebHookEvent(req); if (eventData == null) { return(req.CreateErrorResponse(HttpStatusCode.BadRequest, "Request body is empty")); } // sanity check if (!DevOpsEvents.IsValidEvent(eventData.EventType) || eventData.PublisherId != DevOpsEvents.PublisherId) { return(req.CreateErrorResponse(HttpStatusCode.BadRequest, "Not a good Azure DevOps post...")); } var eventContext = CreateContextFromEvent(eventData); if (eventContext.IsTestEvent()) { return(req.CreateTestEventResponse(aggregatorVersion, ruleName)); } var configContext = GetConfigurationContext(); var configuration = AggregatorConfiguration.ReadConfiguration(configContext) .UpdateFromUrl(ruleName, req.RequestUri); var logger = new ForwarderLogger(_log); var ruleProvider = new AzureFunctionRuleProvider(logger, _context.FunctionDirectory); var ruleExecutor = new RuleExecutor(logger, configuration); using (_log.BeginScope($"WorkItem #{eventContext.WorkItemPayload.WorkItem.Id}")) { try { var rule = await ruleProvider.GetRule(ruleName); var execResult = await ruleExecutor.ExecuteAsync(rule, eventContext, cancellationToken); if (string.IsNullOrEmpty(execResult)) { return(req.CreateResponse(HttpStatusCode.OK)); } else { _log.LogInformation($"Returning '{execResult}' from '{rule.Name}'"); return(req.CreateResponse(HttpStatusCode.OK, execResult)); } } catch (Exception ex) { _log.LogWarning($"Rule '{ruleName}' failed: {ex.Message}"); return(req.CreateErrorResponse(HttpStatusCode.NotImplemented, ex)); } } }
public async Task <IActionResult> RunAsync(/*HttpRequest request, */ WebHookEvent eventData, CancellationToken cancellationToken) { _log.LogDebug($"Context: {_executionContext.InvocationId} {_executionContext.FunctionName} {_executionContext.FunctionDirectory} {_executionContext.FunctionAppDirectory}"); var ruleName = _executionContext.FunctionName; var aggregatorVersion = RequestHelper.AggregatorVersion; _log.LogInformation($"Aggregator v{aggregatorVersion} executing rule '{ruleName}'"); cancellationToken.ThrowIfCancellationRequested(); if (eventData == null) { return(BadRequest("Request body is empty")); } // sanity check if (!DevOpsEvents.IsValidEvent(eventData.EventType) || eventData.PublisherId != DevOpsEvents.PublisherId) { _log.LogDebug("return BadRequest"); return(BadRequest(new { Error = "Not a good Azure DevOps post..." })); } var helper = new RequestHelper(_log); var eventContext = helper.CreateContextFromEvent(eventData); if (eventContext.IsTestEvent()) { Response.AddCustomHeaders(aggregatorVersion, ruleName); return(RespondToTestEventMessage(aggregatorVersion, ruleName)); } var configContext = GetConfigurationContext(); var configuration = AggregatorConfiguration.ReadConfiguration(configContext) .UpdateFromUrl(ruleName, GetRequestUri()); var logger = new ForwarderLogger(_log); var ruleProvider = new AzureFunctionRuleProvider(logger, _executionContext.FunctionDirectory); var ruleExecutor = new RuleExecutor(logger, configuration); using (_log.BeginScope($"WorkItem #{eventContext.WorkItemPayload.WorkItem.Id}")) { try { var rule = await ruleProvider.GetRule(ruleName); var execResult = await ruleExecutor.ExecuteAsync(rule, eventContext, cancellationToken); if (string.IsNullOrEmpty(execResult)) { return(Ok()); } else { _log.LogInformation($"Returning '{execResult}' from '{rule.Name}'"); return(Ok(execResult)); } } catch (Exception ex) { _log.LogWarning($"Rule '{ruleName}' failed: {ex.Message}"); return(BadRequest(ex.Message)); } } }