| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  | using Elecciones.Core.DTOs; | 
					
						
							|  |  |  | using Microsoft.Extensions.Configuration; | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  | using Microsoft.Extensions.Logging; | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  | using System.Collections.Generic; | 
					
						
							|  |  |  | using System.Net.Http; | 
					
						
							|  |  |  | using System.Net.Http.Json; | 
					
						
							| 
									
										
										
										
											2025-08-19 14:23:51 -03:00
										 |  |  | using System.Text.Json; | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  | using System.Threading.RateLimiting; | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  | using System.Threading.Tasks; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace Elecciones.Infrastructure.Services; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public class ElectoralApiService : IElectoralApiService | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     private readonly IHttpClientFactory _httpClientFactory; | 
					
						
							|  |  |  |     private readonly IConfiguration _configuration; | 
					
						
							| 
									
										
										
										
											2025-08-19 14:23:51 -03:00
										 |  |  |     private readonly ILogger<ElectoralApiService> _logger; | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |     private readonly RateLimiter _rateLimiter; | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |     public ElectoralApiService( | 
					
						
							|  |  |  |         IHttpClientFactory httpClientFactory,  | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  |         IConfiguration configuration, | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |         ILogger<ElectoralApiService> logger, | 
					
						
							|  |  |  |         RateLimiter rateLimiter) | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  |     { | 
					
						
							|  |  |  |         _httpClientFactory = httpClientFactory; | 
					
						
							|  |  |  |         _configuration = configuration; | 
					
						
							| 
									
										
										
										
											2025-08-19 14:23:51 -03:00
										 |  |  |         _logger = logger; | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |         _rateLimiter = rateLimiter; | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 15:03:19 -03:00
										 |  |  |     public async Task<TokenResponse?> GetAuthTokenAsync() | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |         using RateLimitLease lease = await _rateLimiter.AcquireAsync(1); | 
					
						
							|  |  |  |         if (lease.IsAcquired) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             var client = _httpClientFactory.CreateClient("ElectoralApiClient"); | 
					
						
							|  |  |  |             var username = _configuration["ElectoralApi:Username"]; | 
					
						
							|  |  |  |             var password = _configuration["ElectoralApi:Password"]; | 
					
						
							|  |  |  |             if (string.IsNullOrEmpty(username) || string.IsNullOrEmpty(password)) return null; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             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; | 
					
						
							|  |  |  |              | 
					
						
							|  |  |  |             return await response.Content.ReadFromJsonAsync<TokenResponse>(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return null; | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-16 12:00:51 -03:00
										 |  |  |     public async Task<CatalogoDto?> GetCatalogoAmbitosAsync(string authToken, int categoriaId) | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  |         // "Pedir una ficha". Este método ahora devuelve un "lease" (permiso). | 
					
						
							|  |  |  |         // Si no hay fichas, esperará aquí automáticamente hasta que se rellene el cubo. | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         /* | 
					
						
							|  |  |  |                 using RateLimitLease lease = await _rateLimiter.AcquireAsync(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // Si se nos concede el permiso para proceder... | 
					
						
							|  |  |  |                 if (lease.IsAcquired) | 
					
						
							|  |  |  |                 {*/ | 
					
						
							|  |  |  |         var client = _httpClientFactory.CreateClient("ElectoralApiClient"); | 
					
						
							|  |  |  |         var request = new HttpRequestMessage(HttpMethod.Get, $"/api/catalogo/getCatalogo?categoriaId={categoriaId}"); | 
					
						
							|  |  |  |         request.Headers.Add("Authorization", $"Bearer {authToken}"); | 
					
						
							|  |  |  |         var response = await client.SendAsync(request); | 
					
						
							|  |  |  |         return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<CatalogoDto>() : null; | 
					
						
							|  |  |  |         /* } | 
					
						
							|  |  |  |          // Si no se pudo obtener un permiso (ej. la cola está llena), devolvemos null. | 
					
						
							|  |  |  |          return null;*/ | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public async Task<List<AgrupacionDto>?> GetAgrupacionesAsync(string authToken, string distritoId, int categoriaId) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  |         // "Pedir una ficha". Este método ahora devuelve un "lease" (permiso). | 
					
						
							|  |  |  |         // Si no hay fichas, esperará aquí automáticamente hasta que se rellene el cubo. | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         /* | 
					
						
							|  |  |  |                 using RateLimitLease lease = await _rateLimiter.AcquireAsync(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // Si se nos concede el permiso para proceder... | 
					
						
							|  |  |  |                 if (lease.IsAcquired) | 
					
						
							|  |  |  |                 {*/ | 
					
						
							|  |  |  |         var client = _httpClientFactory.CreateClient("ElectoralApiClient"); | 
					
						
							|  |  |  |         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); | 
					
						
							|  |  |  |         return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<List<AgrupacionDto>>() : null; | 
					
						
							|  |  |  |         /* } | 
					
						
							|  |  |  |          // Si no se pudo obtener un permiso (ej. la cola está llena), devolvemos null. | 
					
						
							|  |  |  |          return null;*/ | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-17 20:08:38 -03:00
										 |  |  |     public async Task<ResultadosDto?> GetResultadosAsync(string authToken, string distritoId, string seccionId, string? municipioId, int categoriaId) | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  |         // "Pedir una ficha". Este método ahora devuelve un "lease" (permiso). | 
					
						
							|  |  |  |         // Si no hay fichas, esperará aquí automáticamente hasta que se rellene el cubo. | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         /* | 
					
						
							|  |  |  |                 using RateLimitLease lease = await _rateLimiter.AcquireAsync(1); | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |                 // Si se nos concede el permiso para proceder... | 
					
						
							|  |  |  |                 if (lease.IsAcquired) | 
					
						
							|  |  |  |                 {*/ | 
					
						
							|  |  |  |         var client = _httpClientFactory.CreateClient("ElectoralApiClient"); | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         // Construimos la URL base | 
					
						
							|  |  |  |         var requestUri = $"/api/resultados/getResultados?distritoId={distritoId}&seccionId={seccionId}&categoriaId={categoriaId}"; | 
					
						
							| 
									
										
										
										
											2025-08-17 20:08:38 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         // Añadimos el municipioId a la URL SÓLO si no es nulo o vacío | 
					
						
							|  |  |  |         if (!string.IsNullOrEmpty(municipioId)) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             requestUri += $"&municipioId={municipioId}"; | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -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<ResultadosDto>() : null; | 
					
						
							|  |  |  |         /* } | 
					
						
							|  |  |  |          // Si no se pudo obtener un permiso (ej. la cola está llena), devolvemos null. | 
					
						
							|  |  |  |          return 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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |         using RateLimitLease lease = await _rateLimiter.AcquireAsync(1); | 
					
						
							|  |  |  |         if (!lease.IsAcquired) return null; | 
					
						
							| 
									
										
										
										
											2025-08-19 09:37:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         var client = _httpClientFactory.CreateClient("ElectoralApiClient"); | 
					
						
							|  |  |  |         var requestUri = $"/api/resultados/getBancas?distritoId={distritoId}&categoriaId={categoriaId}"; | 
					
						
							|  |  |  |         if (!string.IsNullOrEmpty(seccionProvincialId)) | 
					
						
							| 
									
										
										
										
											2025-08-19 09:37:13 -03:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |             requestUri += $"&seccionProvincialId={seccionProvincialId}"; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-08-19 09:37:13 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         var request = new HttpRequestMessage(HttpMethod.Get, requestUri); | 
					
						
							|  |  |  |         request.Headers.Add("Authorization", $"Bearer {authToken}"); | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         try | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |             var response = await client.SendAsync(request); | 
					
						
							| 
									
										
										
										
											2025-08-19 18:33:54 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |             // --- CORRECCIÓN FINAL --- | 
					
						
							|  |  |  |             // Eliminamos la comprobación de ContentLength. Confiamos en el try-catch. | 
					
						
							|  |  |  |             if (response.IsSuccessStatusCode) | 
					
						
							| 
									
										
										
										
											2025-08-19 18:33:54 -03:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |                 try | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     return await response.Content.ReadFromJsonAsync<RepartoBancasDto>(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 catch (JsonException ex) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     // Esto se activará si el cuerpo está vacío o no es un JSON válido. | 
					
						
							|  |  |  |                     _logger.LogWarning(ex, "La API devolvió una respuesta no-JSON para getBancas. URI: {uri}", requestUri); | 
					
						
							|  |  |  |                     return null; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2025-08-19 18:33:54 -03:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |              | 
					
						
							|  |  |  |             _logger.LogWarning("La API devolvió un código de error {statusCode} para getBancas. URI: {uri}", response.StatusCode, requestUri); | 
					
						
							|  |  |  |             return null; | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |         catch (Exception ex) | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |             _logger.LogError(ex, "La petición HTTP a getBancas falló. URI: {uri}", requestUri); | 
					
						
							|  |  |  |             return null; | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-08-15 17:31:51 -03:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-19 14:07:19 -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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  |         // "Pedir una ficha". Este método ahora devuelve un "lease" (permiso). | 
					
						
							|  |  |  |         // Si no hay fichas, esperará aquí automáticamente hasta que se rellene el cubo. | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         /* | 
					
						
							|  |  |  |                 using RateLimitLease lease = await _rateLimiter.AcquireAsync(1); | 
					
						
							| 
									
										
										
										
											2025-08-18 17:47:11 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |                 // Si se nos concede el permiso para proceder... | 
					
						
							|  |  |  |                 if (lease.IsAcquired) | 
					
						
							|  |  |  |                 {*/ | 
					
						
							|  |  |  |         var client = _httpClientFactory.CreateClient("ElectoralApiClient"); | 
					
						
							|  |  |  |         var requestUri = $"/api/resultados/getTelegramasTotalizados?distritoId={distritoId}&seccionId={seccionId}"; | 
					
						
							| 
									
										
										
										
											2025-08-18 17:47:11 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         if (categoriaId.HasValue) | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             requestUri += $"&categoriaId={categoriaId.Value}"; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         var request = new HttpRequestMessage(HttpMethod.Get, requestUri); | 
					
						
							|  |  |  |         request.Headers.Add("Authorization", $"Bearer {authToken}"); | 
					
						
							|  |  |  |         var response = await client.SendAsync(request); | 
					
						
							| 
									
										
										
										
											2025-08-19 14:07:19 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         // Ahora deserializamos al tipo correcto: List<string> | 
					
						
							|  |  |  |         return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<List<string>>() : null; | 
					
						
							|  |  |  |         /* } | 
					
						
							|  |  |  |          // Si no se pudo obtener un permiso (ej. la cola está llena), devolvemos null. | 
					
						
							|  |  |  |          return null;*/ | 
					
						
							| 
									
										
										
										
											2025-08-15 17:31:51 -03:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public async Task<TelegramaFileDto?> GetTelegramaFileAsync(string authToken, string mesaId) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |         using RateLimitLease lease = await _rateLimiter.AcquireAsync(1); | 
					
						
							|  |  |  |         if (!lease.IsAcquired) return null; | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |         var client = _httpClientFactory.CreateClient("ElectoralApiClient"); | 
					
						
							|  |  |  |         var requestUri = $"/api/resultados/getFile?mesaId={mesaId}"; | 
					
						
							|  |  |  |         var request = new HttpRequestMessage(HttpMethod.Get, requestUri); | 
					
						
							|  |  |  |         request.Headers.Add("Authorization", $"Bearer {authToken}"); | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         try | 
					
						
							| 
									
										
										
										
											2025-08-19 14:23:51 -03:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |             var response = await client.SendAsync(request); | 
					
						
							| 
									
										
										
										
											2025-08-19 14:23:51 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |             // --- APLICAMOS LA MISMA CORRECCIÓN AQUÍ POR CONSISTENCIA --- | 
					
						
							|  |  |  |             if (response.IsSuccessStatusCode) | 
					
						
							| 
									
										
										
										
											2025-08-19 14:23:51 -03:00
										 |  |  |             { | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |                 try | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     return await response.Content.ReadFromJsonAsync<TelegramaFileDto>(); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |                 catch (JsonException ex) | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     _logger.LogWarning(ex, "La API devolvió una respuesta no-JSON para getFile para la mesa {mesaId}", mesaId); | 
					
						
							|  |  |  |                     return null; | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2025-08-19 14:23:51 -03:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |             _logger.LogWarning("La API devolvió un código de error {statusCode} para la mesa {mesaId}", response.StatusCode, mesaId); | 
					
						
							|  |  |  |             return null; | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |         catch (Exception ex) | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         { | 
					
						
							| 
									
										
										
										
											2025-08-20 18:02:17 -03:00
										 |  |  |             _logger.LogError(ex, "La petición HTTP a getFile falló para la mesa {mesaId}", mesaId); | 
					
						
							|  |  |  |             return null; | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2025-08-15 17:31:51 -03:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-08-15 17:31:51 -03:00
										 |  |  |     public async Task<ResumenDto?> GetResumenAsync(string authToken, string distritoId) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  |         // "Pedir una ficha". Este método ahora devuelve un "lease" (permiso). | 
					
						
							|  |  |  |         // Si no hay fichas, esperará aquí automáticamente hasta que se rellene el cubo. | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         /* | 
					
						
							|  |  |  |                 using RateLimitLease lease = await _rateLimiter.AcquireAsync(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // Si se nos concede el permiso para proceder... | 
					
						
							|  |  |  |                 if (lease.IsAcquired) | 
					
						
							|  |  |  |                 {*/ | 
					
						
							|  |  |  |         var client = _httpClientFactory.CreateClient("ElectoralApiClient"); | 
					
						
							|  |  |  |         var requestUri = $"/api/resultados/getResumen?distritoId={distritoId}"; | 
					
						
							|  |  |  |         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; | 
					
						
							|  |  |  |         /* } | 
					
						
							|  |  |  |          // Si no se pudo obtener un permiso (ej. la cola está llena), devolvemos null. | 
					
						
							|  |  |  |          return null;*/ | 
					
						
							| 
									
										
										
										
											2025-08-15 17:31:51 -03:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  |         // "Pedir una ficha". Este método ahora devuelve un "lease" (permiso). | 
					
						
							|  |  |  |         // Si no hay fichas, esperará aquí automáticamente hasta que se rellene el cubo. | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         /* | 
					
						
							|  |  |  |                 using RateLimitLease lease = await _rateLimiter.AcquireAsync(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // Si se nos concede el permiso para proceder... | 
					
						
							|  |  |  |                 if (lease.IsAcquired) | 
					
						
							|  |  |  |                 {*/ | 
					
						
							|  |  |  |         var client = _httpClientFactory.CreateClient("ElectoralApiClient"); | 
					
						
							|  |  |  |         // La URL ahora usa el parámetro 'categoriaId' que se recibe | 
					
						
							|  |  |  |         var requestUri = $"/api/estados/estadoRecuento?distritoId={distritoId}&categoriaId={categoriaId}"; | 
					
						
							|  |  |  |         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; | 
					
						
							|  |  |  |         /* } | 
					
						
							|  |  |  |          // Si no se pudo obtener un permiso (ej. la cola está llena), devolvemos null. | 
					
						
							|  |  |  |          return null;*/ | 
					
						
							| 
									
										
										
										
											2025-08-15 17:31:51 -03:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     public async Task<List<CategoriaDto>?> GetCategoriasAsync(string authToken) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2025-08-20 14:17:25 -03:00
										 |  |  |         // "Pedir una ficha". Este método ahora devuelve un "lease" (permiso). | 
					
						
							|  |  |  |         // Si no hay fichas, esperará aquí automáticamente hasta que se rellene el cubo. | 
					
						
							| 
									
										
										
										
											2025-08-20 16:28:17 -03:00
										 |  |  |         /* | 
					
						
							|  |  |  |                 using RateLimitLease lease = await _rateLimiter.AcquireAsync(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 // Si se nos concede el permiso para proceder... | 
					
						
							|  |  |  |                 if (lease.IsAcquired) | 
					
						
							|  |  |  |                 {*/ | 
					
						
							|  |  |  |         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); | 
					
						
							|  |  |  |         return response.IsSuccessStatusCode ? await response.Content.ReadFromJsonAsync<List<CategoriaDto>>() : null; | 
					
						
							|  |  |  |         /* } | 
					
						
							|  |  |  |          // Si no se pudo obtener un permiso (ej. la cola está llena), devolvemos null. | 
					
						
							|  |  |  |          return null;*/ | 
					
						
							| 
									
										
										
										
											2025-08-14 15:27:45 -03:00
										 |  |  |     } | 
					
						
							|  |  |  | } |