using Microsoft.Extensions.Logging; using PARR.Core.Common.RabbitServices; using PARR.Domain.DTOs.RabbitApi; using PARR.Domain.Settings; using System.Net; using System.Net.Http.Headers; using System.Text; using System.Text.Json; namespace PARR.Infrastructure.Rabbit { internal class RabbitAdminService : IRabbitAdminService { private readonly HttpClient httpClient; private readonly ILogger logger; public RabbitAdminService(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 RabbitApiResult { IsSuccess = true, Response = json }; } else { logger.LogError($"Ошибка при запросе к RabbitMq, url: {url}, StatusCode: {result.StatusCode}"); return new RabbitApiResult { IsSuccess = false }; } } catch (Exception ex) { logger.LogError(ex, $"Ошибка при запросе к RabbitMQ, url: {url}"); return new RabbitApiResult { 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}"))); } } }