using Microsoft.Extensions.Logging; using PARR.BLL.Contracts.Interfaces; using PARR.BLL.Domain.Mq; using PARR.BLL.Services.Interfaces; using System.Net; using System.Net.Http.Headers; using System.Text; using System.Text.Json; namespace PARR.BLL.Services.Implementations { internal class MqAdminService : IMqAdminService { private readonly HttpClient httpClient; private readonly ILogger logger; public MqAdminService(HttpClient httpClient, ILogger logger) { this.httpClient = httpClient; this.logger = logger; } public async Task GetConnectionsAsync(IMqSettings mqSettings) { var url = $"http://{mqSettings.HostName}:15672/api/connections"; return await SendRequestAsync(mqSettings, url); } public async Task GetQueuesAsync(IMqSettings mqSettings) { var url = $"http://{mqSettings.HostName}:15672/api/queues"; return await SendRequestAsync(mqSettings, url); } private async Task SendRequestAsync(IMqSettings mqSettings, string url) { SetAuthorizationHeaders(mqSettings); try { var result = await httpClient.GetAsync(url); if (result.StatusCode == HttpStatusCode.OK) { var content = await result.Content.ReadAsStringAsync(); var json = JsonSerializer.Deserialize(content); return new MqApiResult { IsSuccess = true, Response = json }; } else { logger.LogError($"Ошибка при запросе к RabbitMq, url: {url}, StatusCode: {result.StatusCode}"); return new MqApiResult { IsSuccess = false }; } } catch (Exception ex) { logger.LogError(ex, $"Ошибка при запросе к RabbitMQ, url: {url}"); return new MqApiResult { IsSuccess = false, Exception = ex }; } } private void SetAuthorizationHeaders(IMqSettings mqSettings) { httpClient.DefaultRequestHeaders.Clear(); httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"{mqSettings.User}:{mqSettings.Password}"))); } } }