Fix 1813
This commit is contained in:
@@ -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);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user