This commit is contained in:
2025-08-15 18:13:10 -03:00
parent fe77add302
commit da6e9e9b8f

View File

@@ -13,71 +13,83 @@ namespace Elecciones.Infrastructure.Services;
// Implementación de emergencia que usa el comando 'curl' del sistema operativo // Implementación de emergencia que usa el comando 'curl' del sistema operativo
public class CurlElectoralApiService : IElectoralApiService public class CurlElectoralApiService : IElectoralApiService
{ {
private readonly ILogger<CurlElectoralApiService> _logger; private readonly ILogger<CurlElectoralApiService> _logger;
private readonly IConfiguration _configuration; private readonly IConfiguration _configuration;
private readonly string _baseUrl; private readonly string _baseUrl;
public CurlElectoralApiService(ILogger<CurlElectoralApiService> logger, IConfiguration configuration) public CurlElectoralApiService(ILogger<CurlElectoralApiService> logger, IConfiguration configuration)
{
_logger = logger;
_configuration = configuration;
_baseUrl = _configuration["ElectoralApi__BaseUrl"] ?? "";
}
private async Task<(int, string)> ExecuteCurlCommand(string arguments)
{
var process = new Process
{ {
_logger = logger; StartInfo = new ProcessStartInfo
_configuration = configuration; {
_baseUrl = _configuration["ElectoralApi:BaseUrl"] ?? ""; FileName = "curl",
Arguments = arguments,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
}
};
process.Start();
string output = await process.StandardOutput.ReadToEndAsync();
string error = await process.StandardError.ReadToEndAsync();
await process.WaitForExitAsync();
if (process.ExitCode != 0)
{
_logger.LogError("Error al ejecutar curl. Exit Code: {ExitCode}. Error: {Error}", process.ExitCode, error);
return (-1, error);
} }
private async Task<(int, string)> ExecuteCurlCommand(string arguments) // Extraemos el código de estado HTTP del final del stderr si usamos -w
// (Simplificación: asumimos 200 si el ExitCode es 0)
return (200, output);
}
public async Task<string?> GetAuthTokenAsync()
{
var username = _configuration["ElectoralApi__Username"];
var password = _configuration["ElectoralApi__Password"]; // OJO: Verifica el nombre exacto de la variable en tu .env
var arguments = $"-s -H \"username: {username}\" -H \"password: {password}\" \"{_baseUrl}/api/createtoken\"";
var (status, output) = await ExecuteCurlCommand(arguments);
if (status != 200)
{ {
var process = new Process _logger.LogError("Curl recibió un código de estado no exitoso. Respuesta: {Output}", output);
{ return null;
StartInfo = new ProcessStartInfo
{
FileName = "curl",
Arguments = arguments,
RedirectStandardOutput = true,
RedirectStandardError = true,
UseShellExecute = false,
CreateNoWindow = true,
}
};
process.Start();
string output = await process.StandardOutput.ReadToEndAsync();
string error = await process.StandardError.ReadToEndAsync();
await process.WaitForExitAsync();
if (process.ExitCode != 0)
{
_logger.LogError("Error al ejecutar curl. Exit Code: {ExitCode}. Error: {Error}", process.ExitCode, error);
return (-1, error);
}
// Extraemos el código de estado HTTP del final del stderr si usamos -w
// (Simplificación: asumimos 200 si el ExitCode es 0)
return (200, output);
} }
public async Task<string?> GetAuthTokenAsync() try
{ {
var username = _configuration["ElectoralApi:Username"]; var tokenResponse = JsonSerializer.Deserialize<TokenResponse>(output);
var password = _configuration["ElectoralApi:Password"]; return tokenResponse?.Data?.AccessToken;
var arguments = $"-s -H \"username: {username}\" -H \"password: {password}\" \"{_baseUrl}/api/createtoken\"";
var (status, output) = await ExecuteCurlCommand(arguments);
if (status != 200) return null;
var tokenResponse = JsonSerializer.Deserialize<TokenResponse>(output);
return tokenResponse?.Data?.AccessToken;
} }
catch (JsonException ex)
{
_logger.LogError(ex, "Falló la deserialización del JSON. La respuesta del servidor NO era un JSON válido. Respuesta recibida: {Output}", output);
return null;
}
}
// Implementa los demás métodos de la interfaz usando el mismo patrón // Implementa los demás métodos de la interfaz usando el mismo patrón
// ... // ...
// Por ahora, solo necesitamos GetAuthTokenAsync para validar la conexión. // Por ahora, solo necesitamos GetAuthTokenAsync para validar la conexión.
public Task<List<CategoriaDto>?> GetCategoriasAsync(string authToken) => Task.FromResult<List<CategoriaDto>?>(null); public Task<List<CategoriaDto>?> GetCategoriasAsync(string authToken) => Task.FromResult<List<CategoriaDto>?>(null);
public Task<List<CatalogoDto>?> GetCatalogoCompletoAsync(string authToken) => Task.FromResult<List<CatalogoDto>?>(null); public Task<List<CatalogoDto>?> GetCatalogoCompletoAsync(string authToken) => Task.FromResult<List<CatalogoDto>?>(null);
public Task<List<AgrupacionDto>?> GetAgrupacionesAsync(string authToken, string distritoId, int categoriaId) => Task.FromResult<List<AgrupacionDto>?>(null); public Task<List<AgrupacionDto>?> GetAgrupacionesAsync(string authToken, string distritoId, int categoriaId) => Task.FromResult<List<AgrupacionDto>?>(null);
public Task<ResultadosDto?> GetResultadosAsync(string authToken, string distritoId, string seccionId, string municipioId) => Task.FromResult<ResultadosDto?>(null); public Task<ResultadosDto?> GetResultadosAsync(string authToken, string distritoId, string seccionId, string municipioId) => Task.FromResult<ResultadosDto?>(null);
public Task<RepartoBancasDto?> GetBancasAsync(string authToken, string distritoId, string seccionId) => Task.FromResult<RepartoBancasDto?>(null); public Task<RepartoBancasDto?> GetBancasAsync(string authToken, string distritoId, string seccionId) => Task.FromResult<RepartoBancasDto?>(null);
public Task<List<string[]>?> GetTelegramasTotalizadosAsync(string authToken, string distritoId, string seccionId) => Task.FromResult<List<string[]>?>(null); public Task<List<string[]>?> GetTelegramasTotalizadosAsync(string authToken, string distritoId, string seccionId) => Task.FromResult<List<string[]>?>(null);
public Task<TelegramaFileDto?> GetTelegramaFileAsync(string authToken, string mesaId) => Task.FromResult<TelegramaFileDto?>(null); public Task<TelegramaFileDto?> GetTelegramaFileAsync(string authToken, string mesaId) => Task.FromResult<TelegramaFileDto?>(null);
public Task<ResumenDto?> GetResumenAsync(string authToken, string distritoId) => Task.FromResult<ResumenDto?>(null); public Task<ResumenDto?> GetResumenAsync(string authToken, string distritoId) => Task.FromResult<ResumenDto?>(null);
public Task<EstadoRecuentoGeneralDto?> GetEstadoRecuentoGeneralAsync(string authToken, string distritoId) => Task.FromResult<EstadoRecuentoGeneralDto?>(null); public Task<EstadoRecuentoGeneralDto?> GetEstadoRecuentoGeneralAsync(string authToken, string distritoId) => Task.FromResult<EstadoRecuentoGeneralDto?>(null);
} }