public async Task <HttpResponseMessage> Run(HttpRequestMessage req) { log.Verbose($"Context: {context.InvocationId} {context.FunctionName} {context.FunctionDirectory} {context.FunctionAppDirectory}"); // TODO string aggregatorVersion = null; try { string rule = context.FunctionName; log.Info($"Welcome to {rule}"); } catch (Exception ex) { log.Warning($"Failed parsing headers: {ex.Message}"); } // Get request body string jsonContent = await req.Content.ReadAsStringAsync(); dynamic data = JsonConvert.DeserializeObject(jsonContent); // sanity check if ((data.eventType != "workitem.created" && data.eventType != "workitem.updated") || data.publisherId != "tfs") { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Not a good VSTS post..." })); } var config = new ConfigurationBuilder() .SetBasePath(context.FunctionAppDirectory) .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables() .Build(); var logger = new TraceWriterLogger(log); /* * public string FunctionDirectory { get; set; } * public string FunctionAppDirectory { get; set; } */ var wrapper = new RuleWrapper(config, logger, context.FunctionName, context.FunctionDirectory); string execResult = await wrapper.Execute(aggregatorVersion, data); log.Info($"Returning {execResult}"); var resp = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(execResult) }; return(resp); }
public async Task <HttpResponseMessage> RunAsync(HttpRequestMessage req, CancellationToken cancellationToken) { _log.LogDebug($"Context: {_context.InvocationId} {_context.FunctionName} {_context.FunctionDirectory} {_context.FunctionAppDirectory}"); var aggregatorVersion = GetCustomAttribute <System.Reflection.AssemblyInformationalVersionAttribute>()?.InformationalVersion; try { var rule = _context.FunctionName; _log.LogInformation($"Aggregator v{aggregatorVersion} executing rule '{rule}'"); } catch (Exception ex) { _log.LogWarning($"Failed parsing request headers: {ex.Message}"); } cancellationToken.ThrowIfCancellationRequested(); // Get request body var jsonContent = await req.Content.ReadAsStringAsync(); if (string.IsNullOrWhiteSpace(jsonContent)) { _log.LogWarning($"Failed parsing request body: empty"); var resp = new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent("Request body is empty") }; return(resp); } dynamic data = JsonConvert.DeserializeObject(jsonContent); string eventType = data.eventType; // sanity check if (!DevOpsEvents.IsValidEvent(eventType) || data.publisherId != DevOpsEvents.PublisherId) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Not a good Azure DevOps post..." })); } if (data.resource.url == "http://fabrikam-fiber-inc.visualstudio.com/DefaultCollection/_apis/wit/workItems/5") { var resp = req.CreateResponse(HttpStatusCode.OK, new { message = $"Hello from Aggregator v{aggregatorVersion} executing rule '{_context.FunctionName}'" }); resp.Headers.Add("X-Aggregator-Version", aggregatorVersion); resp.Headers.Add("X-Aggregator-Rule", _context.FunctionName); return(resp); } var config = new ConfigurationBuilder() .SetBasePath(_context.FunctionAppDirectory) .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables() .Build(); var configuration = AggregatorConfiguration.Read(config); configuration = InvokeOptions.ExtendFromUrl(configuration, req.RequestUri); var logger = new ForwarderLogger(_log); var wrapper = new RuleWrapper(configuration, logger, _context.FunctionName, _context.FunctionDirectory); try { string execResult = await wrapper.ExecuteAsync(data, cancellationToken); if (string.IsNullOrEmpty(execResult)) { var resp = new HttpResponseMessage(HttpStatusCode.OK); return(resp); } else { _log.LogInformation($"Returning '{execResult}' from '{_context.FunctionName}'"); var resp = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(execResult) }; return(resp); } } catch (Exception ex) { _log.LogWarning($"Rule '{_context.FunctionName}' failed: {ex.Message}"); var resp = new HttpResponseMessage(HttpStatusCode.NotImplemented) { Content = new StringContent(ex.Message) }; return(resp); } }
public async Task <HttpResponseMessage> Run(HttpRequestMessage req) { log.LogDebug($"Context: {context.InvocationId} {context.FunctionName} {context.FunctionDirectory} {context.FunctionAppDirectory}"); var aggregatorVersion = GetCustomAttribute <System.Reflection.AssemblyInformationalVersionAttribute>()?.InformationalVersion; try { string rule = context.FunctionName; log.LogInformation($"Aggregator v{aggregatorVersion} executing rule '{rule}'"); } catch (Exception ex) { log.LogWarning($"Failed parsing request headers: {ex.Message}"); } // Get request body string jsonContent = await req.Content.ReadAsStringAsync(); if (string.IsNullOrWhiteSpace(jsonContent)) { log.LogWarning($"Failed parsing request body: empty"); var resp = new HttpResponseMessage(HttpStatusCode.BadRequest) { Content = new StringContent("Request body is empty") }; return(resp); } dynamic data = JsonConvert.DeserializeObject(jsonContent); string eventType = data.eventType; // sanity check if (!DevOpsEvents.IsValidEvent(eventType) || data.publisherId != DevOpsEvents.PublisherId) { return(req.CreateResponse(HttpStatusCode.BadRequest, new { error = "Not a good Azure DevOps post..." })); } var config = new ConfigurationBuilder() .SetBasePath(context.FunctionAppDirectory) .AddJsonFile("local.settings.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables() .Build(); var configuration = AggregatorConfiguration.Read(config); var logger = new ForwarderLogger(log); var wrapper = new RuleWrapper(configuration, logger, context.FunctionName, context.FunctionDirectory); try { string execResult = await wrapper.Execute(data); if (string.IsNullOrEmpty(execResult)) { var resp = new HttpResponseMessage(HttpStatusCode.OK); return(resp); } else { log.LogInformation($"Returning '{execResult}' from '{context.FunctionName}'"); var resp = new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(execResult) }; return(resp); } } catch (Exception ex) { log.LogWarning($"Rule '{context.FunctionName}' failed: {ex.Message}"); var resp = new HttpResponseMessage(HttpStatusCode.NotImplemented) { Content = new StringContent(ex.Message) }; return(resp); } }