Try Separación de Metodos
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
using System;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace Elecciones.Infrastructure.Services;
|
||||
|
||||
public class SharedTokenService
|
||||
{
|
||||
private readonly IElectoralApiService _apiService;
|
||||
private readonly ILogger<SharedTokenService> _logger;
|
||||
private string? _authToken;
|
||||
private DateTimeOffset _tokenExpiration = DateTimeOffset.MinValue;
|
||||
|
||||
// Un SemaphoreSlim para asegurar que solo una tarea a la vez intente renovar el token.
|
||||
private readonly SemaphoreSlim _tokenSemaphore = new SemaphoreSlim(1, 1);
|
||||
|
||||
public SharedTokenService(IElectoralApiService apiService, ILogger<SharedTokenService> logger)
|
||||
{
|
||||
_apiService = apiService;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task<string?> GetValidAuthTokenAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
// Si el token es válido, lo devolvemos inmediatamente sin bloquear.
|
||||
if (!string.IsNullOrEmpty(_authToken) && DateTimeOffset.UtcNow < _tokenExpiration.AddMinutes(-1))
|
||||
{
|
||||
return _authToken;
|
||||
}
|
||||
|
||||
// Si el token necesita renovación, esperamos nuestro turno para intentar renovarlo.
|
||||
await _tokenSemaphore.WaitAsync(stoppingToken);
|
||||
try
|
||||
{
|
||||
// Volvemos a comprobar por si otra tarea ya lo renovó mientras esperábamos.
|
||||
if (!string.IsNullOrEmpty(_authToken) && DateTimeOffset.UtcNow < _tokenExpiration.AddMinutes(-1))
|
||||
{
|
||||
return _authToken;
|
||||
}
|
||||
|
||||
_logger.LogInformation("Token no válido o a punto de expirar. Solicitando uno nuevo...");
|
||||
var tokenResponse = await _apiService.GetAuthTokenAsync();
|
||||
|
||||
if (tokenResponse?.Data?.AccessToken != null)
|
||||
{
|
||||
_authToken = tokenResponse.Data.AccessToken;
|
||||
_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;
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
_tokenSemaphore.Release();
|
||||
}
|
||||
|
||||
return _authToken;
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,7 @@ using System.Reflection;
|
||||
[assembly: System.Reflection.AssemblyCompanyAttribute("Elecciones.Infrastructure")]
|
||||
[assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")]
|
||||
[assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+68dce9415e165633856e4fae9b2d71cc07b4e2ff")]
|
||||
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+19b37f73206d043982fc77f8c2359f2598889b64")]
|
||||
[assembly: System.Reflection.AssemblyProductAttribute("Elecciones.Infrastructure")]
|
||||
[assembly: System.Reflection.AssemblyTitleAttribute("Elecciones.Infrastructure")]
|
||||
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]
|
||||
|
||||
Reference in New Issue
Block a user