using FindAndDrive.Domain.Interfaces.Gateways; using FindAndDrive.Domain.Models.DTO.Request; using Newtonsoft.Json; using System.Text; using FindAndDrive.Domain.Models.Settings; using Microsoft.Extensions.Options; using System.Xml.Serialization; using Newtonsoft.Json.Linq; using FindAndDrive.Domain.Models.DTO.Response; using System.Data.SqlTypes; using System.Runtime.Serialization; using System.Xml; using System.Runtime.Serialization.Json; using System.Text.Json; using System.Collections.Generic; using FindAndDrive.Domain.Models.Exceptions; using System.Runtime.InteropServices; using FindAndDrive.Domain.Models.Gateways.Transunion; using System.Text.RegularExpressions; namespace FindAndDrive.Gateway.TransUnion; public class TransUnionGateway : ITransUnionGateway { private readonly HttpClient _httpClient; private readonly TransUnionSettings _settings; public TransUnionGateway(HttpClient httpClient, IOptions settings) { _httpClient = httpClient; _settings = settings.Value; } public async Task DoCreditInfo(TransUnionRequest request) { var httpContent = new StringContent(request.xmlRequest, Encoding.UTF8, "application/soap+xml"); var httpResponse = await _httpClient.PostAsync("https://autotest.transunion.co.za/TUQuickCreditAndFraudv2/TransUnionQuickCrtAndFrd.asmx", httpContent); if (!httpResponse.IsSuccessStatusCode) { throw new GatewayErrorException(httpResponse.ReasonPhrase ?? "Transunion Gateway failed with a status code of:" + httpResponse.StatusCode); } var content = await httpResponse.Content.ReadAsStringAsync(); var response = ParseXmlToTransUnionResponse(content); if (response.TransUnionAddress == null && response.TransUnionConsumerInfo == null && response.TransUnionCreditScore.Credit_Score == "-") { throw new BadRequestException("Transunion sent back no data for the provided details"); } if(response.TransUnionCreditScore.Credit_Score == "-") { throw new BadRequestException("No credit score data found for given details"); } if (response.TransUnionAddress == null) { throw new BadRequestException("TransUnion sent back no Address data on the provided details"); } if (response.TransUnionConsumerInfo == null) { throw new BadRequestException("TransUnion sent back no ConsumerInfo data on the provided details"); } if (response.TransUnionCreditScore == null) { throw new BadRequestException("TransUnion sent back no CreditScore data on the provided details"); } if (response.AuditLog == null) { throw new BadRequestException("TransUnion sent back no AuditLog data on the provided details"); } return response; } private TransUnionResponse ParseXmlToTransUnionResponse(string content) { try { var xmlResponse = new XmlDocument(); xmlResponse.LoadXml(content); var soapNamespaceManager = new System.Xml.XmlNamespaceManager(xmlResponse.NameTable); soapNamespaceManager.AddNamespace("soap", "http://www.w3.org/2003/05/soap-envelope"); soapNamespaceManager.AddNamespace("ns", "http://tempuri.org/"); var resultNode = xmlResponse.SelectSingleNode("//ns:doQuickCreditAndFraudResult", soapNamespaceManager); string resultJson = resultNode.InnerText; JArray jsonArray = JArray.Parse(resultJson); TransUnionResponse response = null; TransUnionConsumerInfo consumerInfo = null; TransUnionAddress address = null; TransunionCreditScore creditScore = null; string auditLog = null; JArray creditScoreArray = (JArray)jsonArray[0]["Value"]; foreach (var item in creditScoreArray) { var key = item[0].Value("Key"); if (key != null && key == "CreditScore") { creditScore = item[0]["Value"].ToObject(); } if (key != null && key == "ConsumerInfo") { consumerInfo = item[0]["Value"].ToObject(); if (item[1].Value("Key") != null && item[1].Value("Key") == "LastAddress") { address = item[1]["Value"].ToObject(); } } if (key != null && key == "AuditLog") { auditLog = item[0]["Value"].ToString(); } } response = new TransUnionResponse { TransUnionAddress = address, TransUnionConsumerInfo = consumerInfo, TransUnionCreditScore = creditScore, AuditLog = auditLog }; return response; } catch (Exception ex) { throw new GatewayErrorException($"Failed to parse Transunion data, with exception: {ex.Message}"); } } public async Task DoCreditInfoIndependent(TransUnionRequest request) { var httpContent = new StringContent(request.xmlRequest, Encoding.UTF8, "application/soap+xml"); var httpResponse = await _httpClient.PostAsync("https://autotest.transunion.co.za/TUQuickCreditAndFraudv2/TransUnionQuickCrtAndFrd.asmx", httpContent); if (!httpResponse.IsSuccessStatusCode) { throw new GatewayErrorException(httpResponse.ReasonPhrase ?? "Transunion Gateway failed with a status code of:" + httpResponse.StatusCode); } var content = await httpResponse.Content.ReadAsStringAsync(); var transUnionIndependentResponse = new TransUnionIndependentResponse { xmlResponse = content }; return transUnionIndependentResponse.xmlResponse; } private static readonly Regex sWhitespace = new Regex(@"\s+"); public static string ReplaceWhitespace(string input, string replacement) { return sWhitespace.Replace(input, replacement); } }