using classes; using Model; using Model.ResponseModel; using MySqlConnector; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Text; using System.Threading.Tasks; namespace AwsDotnetCsharp.Services { public class IForceFineQueryService { private readonly string _baseUrl; bool errorInducedEmpty = false; private readonly MySqlConnection _con; private readonly Logger _logger; public IForceFineQueryService(string baseUrl, MySqlConnection con, Logger logger) { _baseUrl = baseUrl; _con = con; _logger = logger; } public async Task QueryAsync(List accountIds, string filter, int pageSize = 10, int pageStart = 1, int pageEnd = 1) { var filterediForce = await GePaginatedIForceIdsData(accountIds, filter, pageSize, pageStart, pageEnd); List transformedFines = new List(); foreach (var fine in filterediForce.fines) { var paidLocalStatus = PaymentChecker.CheckLocalPaymentStatus(fine.noticeNumber, _con); if (fine.paymentAllowed == false) paidLocalStatus = false; transformedFines.Add(new FineStatus { issuingAuthorityCode = fine.issuingAuthorityCode, districtName = fine.districtName, noticeNumber = fine.noticeNumber, offenceDate = fine.offenceDate, location = fine.location, idNumber = fine.idNumber, vehicleRegistrationNumber = fine.vehicleRegistrationNumber, phase = fine.phase, paymentAllowed = fine.paymentAllowed, paymentNotAllowedCode = fine.paymentNotAllowedCode, dueDate = fine.dueDate, totalAmountDue = fine.totalAmountDue, contemptOfCourtAmount = fine.contemptOfCourtAmount, summonsNumber = fine.summonsNumber, caseNumber = fine.caseNumber, courtCode = fine.courtCode, courtName = fine.courtName, courtDate = fine.courtDate, warrantOfArrestNumber = fine.warrantOfArrestNumber, warrantOfArrestPending = fine.warrantOfArrestPending, evidence = fine.evidence, customerPaymentAllowed = paidLocalStatus }); } return new IForcePaginatedQueryFinesResponseStatusModel { totalCases = filterediForce.totalCases, fines = transformedFines.ToList() }; } private async Task GePaginatedIForceIdsData(List allCognitoIds, string filter, int pageSize, int pageStart, int pageEnd) { var handlerIForce = new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; IForcePaginatedQueryFinesResponse iForceQueryFinesResponses = new IForcePaginatedQueryFinesResponse(); try { handlerIForce.ServerCertificateCustomValidationCallback = Helper.ServerCertificateCustomValidation; var client = new HttpClient(handlerIForce) { BaseAddress = new Uri(_baseUrl), Timeout = TimeSpan.FromSeconds(Constants.TimeDefaultValue), }; //client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); var queryIds = new List(); foreach (var id in allCognitoIds) { queryIds.Add(id.IdNumber); } var stringContent = new StringContent(JsonConvert.SerializeObject(new { Ids = queryIds, PageSize = pageSize, PageStart = pageStart, PageEnd = pageEnd, IssuingAuthorityCode = filter }), Encoding.UTF8, "application/json"); var response = await client.PostAsync("IForce/queryopaginatedfines", stringContent); var content = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { iForceQueryFinesResponses = JsonConvert.DeserializeObject(content); iForceQueryFinesResponses.fines = iForceQueryFinesResponses.fines.Where(x => x.totalAmountDue > 0).ToList(); } else { errorInducedEmpty = false; _logger.WriteLog("iForce request failed", content, response.RequestMessage.ToString(), "DB"); } } catch (Exception) { errorInducedEmpty = true; } return iForceQueryFinesResponses; } } }