From 178ee1211d1e56b55f09f50572392fa5cc2ff0e3 Mon Sep 17 00:00:00 2001 From: UsamaEquinorAFK Date: Thu, 30 Nov 2023 12:17:51 +0100 Subject: [PATCH] Add function for sending generated report to Teams channel --- .../InspectionFindingEventHandler.cs | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/backend/api/EventHandlers/InspectionFindingEventHandler.cs b/backend/api/EventHandlers/InspectionFindingEventHandler.cs index 2a1a8e577..c3d340f5e 100644 --- a/backend/api/EventHandlers/InspectionFindingEventHandler.cs +++ b/backend/api/EventHandlers/InspectionFindingEventHandler.cs @@ -1,7 +1,10 @@ using System.Globalization; +using System.Net.Http.Headers; using System.Text; using Api.Database.Models; using Api.Services; +using Azure.Identity; +using Azure.Security.KeyVault.Secrets; namespace Api.EventHandlers { public class InspectionFindingEventHandler(IConfiguration configuration, @@ -33,6 +36,14 @@ protected override async Task ExecuteAsync(CancellationToken stoppingToken) string messageString = GenerateReportFromFindingsReportsList(findingsList); string adaptiveCardJson = GenerateAdaptiveCard(messageString); + + string url = GetWebhookURL("TeamsInspectionFindingsWebhook"); + + var client = new HttpClient(); + client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + var content = new StringContent(adaptiveCardJson, Encoding.UTF8, "application/json"); + var response = await client.PostAsync(url, content, stoppingToken); + //if (response.StatusCode == StatusCodes.Status201Created) ; } } catch (OperationCanceledException) { throw; } @@ -122,6 +133,37 @@ public static string GenerateAdaptiveCard(string messageContent) }}"; return adaptiveCardJson; } + public static string GetWebhookURL(string secretName) + { + string environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT")!; + + string projectPath = Path.Combine( + Directory.GetParent(Directory.GetCurrentDirectory())!.FullName, + "api" + ); + + var config = new ConfigurationBuilder() + .SetBasePath(projectPath) + .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) + .AddJsonFile($"appsettings.{environment}.json", optional: true) + .AddEnvironmentVariables() + .Build(); + + string? keyVaultUri = config.GetSection("KeyVault")["VaultUri"] ?? throw new KeyNotFoundException("No key vault in config"); + + var keyVault = new SecretClient( + new Uri(keyVaultUri), + new DefaultAzureCredential( + new DefaultAzureCredentialOptions { ExcludeSharedTokenCacheCredential = true } + ) + ); + + string webhookURL = keyVault + .GetSecret(secretName) + .Value.Value; + + return webhookURL; + } } public class Finding(string tagId, string plantName, string areaName, string findingDescription, DateTime timestamp, string robotName)