using System.Net.Http.Headers;
using ComplytekTransactionParser.Clients.Models;
using ComplytekTransactionParser.Services.Models;
using Microsoft.Extensions.Caching.Memory;
namespace ComplytekTransactionParser.Services;
public class RegTekService
private readonly IConfiguration _configuration;
private readonly IMemoryCache _cache;
public RegTekService(IConfiguration configuration, IMemoryCache cache)
_configuration = configuration;
public async Task<TokenResponse> GetTokenAsync()
if (_cache.TryGetValue("Token", out TokenResponse cachedToken))
var request = new TokenRequest()
Username = _configuration.GetSection("RegTekService").GetValue<string>("Username"),
Password = _configuration.GetSection("RegTekService").GetValue<string>("Password")
var formContent = new FormUrlEncodedContent(new[]
new KeyValuePair<string, string>("grant_type", "password"),
new KeyValuePair<string, string>("username", request.Username),
new KeyValuePair<string, string>("password", request.Password)
var baseUrl = _configuration["RegTekService:BaseUrl"]
?? throw new InvalidOperationException("RegTek BaseUrl configuration cannot be empty");
var tokenClient = new HttpClient();
tokenClient.BaseAddress = new Uri(baseUrl);
var response = await tokenClient.PostAsync("/token", formContent);
var responseResult = await response.Content.ReadAsStringAsync();
var responseObject = JsonConvert.DeserializeObject<TokenResponse>(responseResult);
if (responseObject == null) throw new InvalidOperationException("Error getting token");
_cache.Set("Token", responseObject, TimeSpan.FromMinutes(20));
public async Task<bool> TranScreen(TranScreenRequest model)
var tokenResponse = await GetTokenAsync();
if (tokenResponse == null)
throw new InvalidOperationException("Error getting token");
var baseUrl = _configuration["RegTekService:BaseUrl"]
?? throw new InvalidOperationException("RegTek BaseUrl configuration cannot be empty");
var apiClient = new HttpClient();
apiClient.BaseAddress = new Uri(baseUrl);
apiClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", tokenResponse.AccessToken);
var response = await apiClient.PostAsJsonAsync("/api/ikyccalls/transactionScreening", model);
if (!response.IsSuccessStatusCode)