using Microsoft.Extensions.Options; using System.Text; using System.Text.Json; using Tango.Portal.Chat.Web.Models; namespace Tango.Portal.Chat.Web.Services { public sealed class N8NService { private readonly HttpClient _httpClient; private readonly N8NOptions _options; private readonly ILogger _logger; public N8NService(HttpClient httpClient, IOptions options, ILogger logger) { _httpClient = httpClient; _options = options.Value; _logger = logger; // Set up basic authentication var credentials = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{_options.User}:{_options.Password}")); _httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", credentials); } public async Task PostAlertDataAsync(string name, string type, string chartType, string chartTitle, string instructions, object[] rows, CancellationToken cancellationToken = default) { try { var payload = new { Name = name, Type = type, Rows = rows, ChartType = chartType, ChartTitle = chartTitle, Instructions = instructions }; var json = JsonSerializer.Serialize(payload); var content = new StringContent(json, Encoding.UTF8, "application/json"); var response = await _httpClient.PostAsync(_options.URL, content, cancellationToken); if (response.IsSuccessStatusCode) { _logger.LogInformation("Successfully posted alert data for {Name} to n8n", name); return true; } else { _logger.LogWarning("Failed to post alert data for {Name} to n8n. Status: {StatusCode}, Response: {Response}", name, response.StatusCode, await response.Content.ReadAsStringAsync(cancellationToken)); return false; } } catch (Exception ex) { _logger.LogError(ex, "Exception occurred while posting alert data for {Name} to n8n", name); return false; } } } }