using DealerSelection.Api.CommonUtil; using DealerSelection.Api.Interface; using DealerSelection.Api.Models; using DealerSelection.Common.Interfaces.HttpClient; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Logging; namespace DealerSelection.Api; public class MulesoftTokenApi : IMulesoftTokenApi { private readonly ILogger _logger; private readonly IMemoryCache cache; IHttpClientHandler ClientHandler { get; } public MulesoftTokenApi(IMemoryCache cache, IHttpClientHandler clientHandler , ILogger logger) { this.cache = cache; ClientHandler = clientHandler; _logger = logger; } public async Task FetchToken() { string token = string.Empty; try { // if cache doesn't contain // an entry called TOKEN // error handling mechanism is mandatory if (!cache.TryGetValue("TOKEN", out token)) { var tokenmodel = await GetTokenFromApi(); // keep the value within cache for // given amount of time // if value is not accessed within the expiry time // delete the entry from the cache if (tokenmodel.ExpiresIn > 0) { var options = new MemoryCacheEntryOptions() .SetAbsoluteExpiration( TimeSpan.FromSeconds(tokenmodel.ExpiresIn - 300)); cache.Set("TOKEN", tokenmodel.Value, options); token = tokenmodel.Value; _logger.LogInformation("MulesoftTokenApi at FetchToken - token Generated Successfully :- " + DateTime.Now); } } } catch (Exception ex) { _logger.LogError("MulesoftTokenApi Api:- FetchToken:- " + ex.Message.ToString()); } return token; } private async Task GetTokenFromApi() { // get api implementation happens here // returns a token model _logger.LogInformation("MulesoftTokenApi at GetTokenFromApi Started :- " + DateTime.Now); MulesoftToken token = await MuleSoftIntegration.generateToken(ClientHandler); return token; } }