Fix Solicitud de Token
This commit is contained in:
		| @@ -20,6 +20,10 @@ public class Worker : BackgroundService | ||||
|     private readonly ILogger<Worker> _logger; | ||||
|     private readonly IElectoralApiService _apiService; | ||||
|     private readonly IServiceProvider _serviceProvider; | ||||
|     // --- VARIABLES DE ESTADO PARA EL TOKEN --- | ||||
|     private string? _authToken; | ||||
|     // Usamos DateTimeOffset para manejar correctamente las zonas horarias. | ||||
|     private DateTimeOffset _tokenExpiration = DateTimeOffset.MinValue; | ||||
|  | ||||
|     public Worker(ILogger<Worker> logger, IElectoralApiService apiService, IServiceProvider serviceProvider) | ||||
|     { | ||||
| @@ -28,6 +32,36 @@ public class Worker : BackgroundService | ||||
|         _serviceProvider = serviceProvider; | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Obtiene un token de autenticación válido, solicitando uno nuevo solo si el actual | ||||
|     /// no existe o ha expirado. | ||||
|     /// </summary> | ||||
|     private async Task<string?> GetValidAuthTokenAsync(CancellationToken stoppingToken) | ||||
|     { | ||||
|         // Comprobamos si el token es nulo o si la fecha de expiración ya pasó. | ||||
|         // Añadimos un buffer de seguridad de 1 minuto para renovarlo un poco antes. | ||||
|         if (string.IsNullOrEmpty(_authToken) || DateTimeOffset.UtcNow >= _tokenExpiration.AddMinutes(-1)) | ||||
|         { | ||||
|             _logger.LogInformation("Token no válido o a punto de expirar. Solicitando uno nuevo..."); | ||||
|             var tokenResponse = await _apiService.GetAuthTokenAsync(); // Asumimos que el ApiService devuelve el objeto completo | ||||
|  | ||||
|             if (tokenResponse?.Data?.AccessToken != null) | ||||
|             { | ||||
|                 _authToken = tokenResponse.Data.AccessToken; | ||||
|                 // Calculamos la nueva fecha de expiración. La API nos da la duración en segundos. | ||||
|                 _tokenExpiration = DateTimeOffset.UtcNow.AddSeconds(tokenResponse.Data.ExpiresIn); | ||||
|                 _logger.LogInformation("Nuevo token obtenido. Válido hasta: {expiration}", _tokenExpiration); | ||||
|             } | ||||
|             else | ||||
|             { | ||||
|                 _logger.LogError("CRÍTICO: No se pudo obtener un nuevo token de autenticación."); | ||||
|                 _authToken = null; // Nos aseguramos de que el token viejo se invalide | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return _authToken; | ||||
|     } | ||||
|  | ||||
|     /// <summary> | ||||
|     /// Método principal del worker que se ejecuta en segundo plano. | ||||
|     /// </summary> | ||||
| @@ -48,10 +82,11 @@ public class Worker : BackgroundService | ||||
|             var cicloInicio = DateTime.UtcNow; | ||||
|             cicloContador++; | ||||
|  | ||||
|             var authToken = await _apiService.GetAuthTokenAsync(); | ||||
|             var authToken = await GetValidAuthTokenAsync(stoppingToken); | ||||
|  | ||||
|             if (string.IsNullOrEmpty(authToken)) | ||||
|             { | ||||
|                 _logger.LogError("CRÍTICO: No se pudo obtener el token. Reintentando en 1 minuto..."); | ||||
|                 _logger.LogError("No se pudo obtener un token válido. Reintentando en 1 minuto..."); | ||||
|                 await Task.Delay(TimeSpan.FromMinutes(1), stoppingToken); | ||||
|                 continue; | ||||
|             } | ||||
| @@ -112,8 +147,8 @@ public class Worker : BackgroundService | ||||
|         { | ||||
|             _logger.LogInformation("Iniciando sincronización de catálogos maestros..."); | ||||
|  | ||||
|             // PASO 1: Obtener el token de autenticación. Sin él, no podemos hacer nada. | ||||
|             var authToken = await _apiService.GetAuthTokenAsync(); | ||||
|             var authToken = await GetValidAuthTokenAsync(stoppingToken); | ||||
|  | ||||
|             if (string.IsNullOrEmpty(authToken) || stoppingToken.IsCancellationRequested) | ||||
|             { | ||||
|                 _logger.LogError("No se pudo obtener token para la sincronización de catálogos. La operación se cancela."); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user