Files
Elecciones-2025/Elecciones-Web/src/Elecciones.Infrastructure/Services/ElectoralApiService.cs

149 lines
7.6 KiB
C#
Raw Normal View History

using Elecciones.Core.DTOs;
using Microsoft.Extensions.Configuration;
using System.Collections.Generic;
using System.Net.Http;
using System.Net.Http.Json;
using System.Threading.Tasks;
2025-08-15 17:31:51 -03:00
using static Elecciones.Core.DTOs.BancaDto;
namespace Elecciones.Infrastructure.Services;
public class ElectoralApiService : IElectoralApiService
{
private readonly IHttpClientFactory _httpClientFactory;
private readonly IConfiguration _configuration;
public ElectoralApiService(IHttpClientFactory httpClientFactory, IConfiguration configuration)
{
_httpClientFactory = httpClientFactory;
_configuration = configuration;
}
public async Task<string?> GetAuthTokenAsync()
{
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
var username = _configuration["ElectoralApi:Username"];
var password = _configuration["ElectoralApi:Password"];
if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) return null;
2025-08-16 13:30:05 -03:00
var request = new HttpRequestMessage(HttpMethod.Get, "/api/createtoken/");
request.Headers.Add("username", username);
request.Headers.Add("password", password);
var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) return null;
var tokenResponse = await response.Content.ReadFromJsonAsync<TokenResponse>();
2025-08-16 13:30:05 -03:00
return (tokenResponse is { Success: true, Data.AccessToken: not null }) ? tokenResponse.Data.AccessToken : null;
}
2025-08-16 12:00:51 -03:00
public async Task<CatalogoDto?> GetCatalogoAmbitosAsync(string authToken, int categoriaId)
{
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
2025-08-16 11:47:10 -03:00
var request = new HttpRequestMessage(HttpMethod.Get, $"/api/catalogo/getCatalogo?categoriaId={categoriaId}");
request.Headers.Add("Authorization", $"Bearer {authToken}");
var response = await client.SendAsync(request);
2025-08-16 13:30:05 -03:00
return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<CatalogoDto>() : null;
}
public async Task<List<AgrupacionDto>?> GetAgrupacionesAsync(string authToken, string distritoId, int categoriaId)
{
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
2025-08-16 13:30:05 -03:00
var requestUri = $"/api/catalogo/getAgrupaciones?distritoId={distritoId}&categoriaId={categoriaId}";
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
request.Headers.Add("Authorization", $"Bearer {authToken}");
var response = await client.SendAsync(request);
2025-08-16 13:30:05 -03:00
return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<List<AgrupacionDto>>() : null;
}
2025-08-17 20:08:38 -03:00
public async Task<ResultadosDto?> GetResultadosAsync(string authToken, string distritoId, string seccionId, string? municipioId, int categoriaId)
{
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
2025-08-17 20:08:38 -03:00
// Construimos la URL base
var requestUri = $"/api/resultados/getResultados?distritoId={distritoId}&seccionId={seccionId}&categoriaId={categoriaId}";
// Añadimos el municipioId a la URL SÓLO si no es nulo o vacío
if (!string.IsNullOrEmpty(municipioId))
{
requestUri += $"&municipioId={municipioId}";
}
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
request.Headers.Add("Authorization", $"Bearer {authToken}");
var response = await client.SendAsync(request);
2025-08-16 13:30:05 -03:00
return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<ResultadosDto>() : null;
2025-08-15 17:31:51 -03:00
}
2025-08-19 09:37:13 -03:00
public async Task<RepartoBancasDto?> GetBancasAsync(string authToken, string distritoId, string? seccionProvincialId, int categoriaId)
2025-08-15 17:31:51 -03:00
{
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
2025-08-19 09:37:13 -03:00
var requestUri = $"/api/resultados/getBancas?distritoId={distritoId}&categoriaId={categoriaId}";
// Añadimos el seccionProvincialId a la URL SÓLO si tiene un valor.
if (!string.IsNullOrEmpty(seccionProvincialId))
{
requestUri += $"&seccionProvincialId={seccionProvincialId}";
}
2025-08-15 17:31:51 -03:00
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
request.Headers.Add("Authorization", $"Bearer {authToken}");
var response = await client.SendAsync(request);
2025-08-16 11:39:15 -03:00
return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<RepartoBancasDto>() : null;
2025-08-15 17:31:51 -03:00
}
2025-08-18 17:47:11 -03:00
public async Task<List<string[]>?> GetTelegramasTotalizadosAsync(string authToken, string distritoId, string seccionId, int? categoriaId = null)
2025-08-15 17:31:51 -03:00
{
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
2025-08-16 13:30:05 -03:00
var requestUri = $"/api/resultados/getTelegramasTotalizados?distritoId={distritoId}&seccionId={seccionId}";
2025-08-18 17:47:11 -03:00
// Añadimos el parámetro categoriaId a la URL SÓLO si se proporciona un valor.
if (categoriaId.HasValue)
{
requestUri += $"&categoriaId={categoriaId.Value}";
}
2025-08-15 17:31:51 -03:00
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
request.Headers.Add("Authorization", $"Bearer {authToken}");
var response = await client.SendAsync(request);
2025-08-18 17:47:11 -03:00
// Si la respuesta es 400, devolvemos null para que el worker sepa que falló.
2025-08-16 11:39:15 -03:00
return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<List<string[]>>() : null;
2025-08-15 17:31:51 -03:00
}
public async Task<TelegramaFileDto?> GetTelegramaFileAsync(string authToken, string mesaId)
{
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
2025-08-16 13:30:05 -03:00
var requestUri = $"/api/resultados/getFile?mesaId={mesaId}";
2025-08-15 17:31:51 -03:00
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
request.Headers.Add("Authorization", $"Bearer {authToken}");
var response = await client.SendAsync(request);
2025-08-16 11:39:15 -03:00
return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<TelegramaFileDto>() : null;
2025-08-15 17:31:51 -03:00
}
2025-08-15 17:31:51 -03:00
public async Task<ResumenDto?> GetResumenAsync(string authToken, string distritoId)
{
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
2025-08-16 13:30:05 -03:00
var requestUri = $"/api/resultados/getResumen?distritoId={distritoId}";
2025-08-15 17:31:51 -03:00
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
request.Headers.Add("Authorization", $"Bearer {authToken}");
var response = await client.SendAsync(request);
return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<ResumenDto>() : null;
}
2025-08-17 20:08:38 -03:00
public async Task<EstadoRecuentoGeneralDto?> GetEstadoRecuentoGeneralAsync(string authToken, string distritoId, int categoriaId)
2025-08-15 17:31:51 -03:00
{
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
2025-08-17 20:08:38 -03:00
// La URL ahora usa el parámetro 'categoriaId' que se recibe
var requestUri = $"/api/estados/estadoRecuento?distritoId={distritoId}&categoriaId={categoriaId}";
2025-08-15 17:31:51 -03:00
var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
request.Headers.Add("Authorization", $"Bearer {authToken}");
var response = await client.SendAsync(request);
return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<EstadoRecuentoGeneralDto>() : null;
}
public async Task<List<CategoriaDto>?> GetCategoriasAsync(string authToken)
{
var client = _httpClientFactory.CreateClient("ElectoralApiClient");
var request = new HttpRequestMessage(HttpMethod.Get, "/api/catalogo/getCategorias");
request.Headers.Add("Authorization", $"Bearer {authToken}");
var response = await client.SendAsync(request);
2025-08-16 11:39:15 -03:00
return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<List<CategoriaDto>>() : null;
}
}