using System; using System.Collections.Generic; using Amazon.Lambda.Core; using Amazon.Lambda.APIGatewayEvents; using Newtonsoft.Json; using MySqlConnector; using System.Data; using classes; using System.Threading.Tasks; using Model; using Model.ResponseModel; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Text; namespace PMF { public class AllFines: Pmfbase { MySqlDataReader _reader = null; bool errorInducedEmpty = false; public async Task GetAllFines(APIGatewayProxyRequest request, ILambdaContext context) { APIGatewayProxyResponse response; List iForceFines = new List(); List eNatisFines = new List(); List accountIds = new List { }; string statement = "IForce and eNatis::GetAllFines"; string attribute = "2"; //ID attribute string phaseDetail = ""; string userId = ""; string idDocumentNumber = ""; string attributeValue = ""; string filter = ""; string idDocumentType = ""; bool fetchAccountFines = false; try { if (!Helper.IsRequestEmpty(request)) { if (request != null) { if (request.QueryStringParameters.ContainsKey("strIssuingAuthority")) { filter = request.QueryStringParameters["strIssuingAuthority"]; } string validationMessage = string.Empty; if (request.QueryStringParameters.ContainsKey("strIdNumber") && !string.IsNullOrEmpty(request.QueryStringParameters["strIdNumber"])) { if (request.QueryStringParameters.ContainsKey("strIdType")) { idDocumentType = request.QueryStringParameters["strIdType"].ToString(); } else { return HttpService.CreateResponse(400, payload: "idtype is null or empty"); } if (String.Equals(idDocumentType, "2") || String.Equals(idDocumentType, "02")) { var validRequest = Helper.ValidateRequestParameters(ref validationMessage, request.QueryStringParameters, "strIdNumber"); if (!validRequest) return HttpService.CreateResponse(400, payload: validationMessage); idDocumentNumber = request.QueryStringParameters["strIdNumber"]; //fixed id number attributeValue = idDocumentNumber; } else//None validated ID { idDocumentNumber = request.QueryStringParameters["strIdNumber"]; //fixed id number attributeValue = idDocumentNumber; } } else if (request.QueryStringParameters.ContainsKey("userId") && !string.IsNullOrEmpty(request.QueryStringParameters["userId"])) { var validRequest = Helper.ValidateRequestParameters(ref validationMessage, request.QueryStringParameters, "userId"); if (!validRequest) return HttpService.CreateResponse(400, payload: validationMessage); userId = request.QueryStringParameters["userId"]; fetchAccountFines = true; } else { //atleast one of Id or userId should be supplied. return HttpService.CreateResponse(400, payload: "Please provide a userId or idNumber"); } if (_con.State == ConnectionState.Closed) _con.Open(); if (fetchAccountFines) { statement = $"SELECT * FROM user WHERE UserID = '{userId}'"; GetAllAssociateIds(accountIds, statement); //Populate allCognitoIds with the associated cognitouuid ids if (accountIds.Count < 1) { return HttpService.CreateResponse(200, payload: "userId does not exist"); } /*IFORCE*/ var filterediForce = await GetBulkIForceIdsData(attribute, accountIds, filter); List transformedFines = new List(); foreach (var fineResponse in filterediForce) { var infringement = fineResponse.fines.Where(f => f.totalAmountDue != 0).ToList(); foreach (var fine in infringement) { var paidLocalStatus = PaymentChecker.CheckLocalPaymentStatus(fine.noticeNumber, _con); if (fine.paymentAllowed == false) paidLocalStatus = false; switch (fine.phase) { case 1: phaseDetail = "Notice"; break; case 2: phaseDetail = "Summons"; break; case 3: phaseDetail = "Court"; break; case 4: phaseDetail = "Warrant"; break; default: phaseDetail = "Unknown"; break; } if (fine.paymentAllowed == false) paidLocalStatus = false; if (!string.IsNullOrWhiteSpace(filter)) { if (fine.districtName == filter) { 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 = phaseDetail, 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 }); } } else { 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 = phaseDetail, 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 }); } } } if (filterediForce.Count > 0) { iForceFines.Add(new IForceQueryFinesResponseStatusModel { transactionId = filterediForce[0].transactionId, resultCode = filterediForce[0].resultCode, resultDescription = filterediForce[0].resultDescription, fines = transformedFines.ToList() }); } object IForceResult = iForceFines; if (filterediForce.Count == 0 && errorInducedEmpty) { IForceResult = Constants.NO_RESPONSE; } else if (filterediForce.Count == 0 && !errorInducedEmpty) { IForceResult = "No fines found"; } /*ENATIS*/ var filteredEnatis = await GeteNatisIdsData(accountIds, filter); var flatArr = filteredEnatis.SelectMany(arr => arr).Distinct().Where(f => f.payment.amount != 0).ToList(); foreach (var fine in flatArr) { var paidLocalStatus = PaymentChecker.CheckLocalPaymentStatus(fine.infringementNoticeNumber, _con); eNatisFines.Add(new ENatisQueryInfrigerResponseStatusModel { infringementNoticeNumber = fine.infringementNoticeNumber, IDNumber = fine.idNumber, date = fine.date, time = fine.time, location = fine.location, vehicle = fine.vehicle, charge = fine.charge, feesList = fine.feesList, payment = fine.payment, customerPaymentAllowed = paidLocalStatus }); } object EnatisResult = eNatisFines; if (filteredEnatis.Count == 0 && errorInducedEmpty) { EnatisResult = Constants.NO_RESPONSE; } else if (filteredEnatis.Count == 0 && !errorInducedEmpty) { EnatisResult = "No fines found"; } var resultBody = new { eNatis = EnatisResult, iForce = IForceResult }; if (filteredEnatis.Count == 0 && filterediForce.Count == 0 && !errorInducedEmpty) { return HttpService.CreateResponse(200, payload: "No fines found"); } return HttpService.CreateResponse(200, payload: resultBody); } else //SEARCH DONE BY IDNUMBER { List transformedFines = new List(); /*IFORCE*/ Object iForceresult; try { var handlerIForce = new HttpClientHandler(); handlerIForce.ServerCertificateCustomValidationCallback = Helper.ServerCertificateCustomValidation; var iForceClient = new HttpClient(handlerIForce) { BaseAddress = new Uri(baseUrl), Timeout = TimeSpan.FromSeconds(Constants.TimeDefaultValue) }; var iForceResponse = await iForceClient.GetAsync($"IForce/queryopenfines?Attribute={attribute}&FineQueryAttributeValue={attributeValue}"); var iForcebody = await iForceResponse.Content.ReadAsStringAsync(); if (iForceResponse.StatusCode == HttpStatusCode.OK) { var body = JsonConvert.DeserializeObject(iForcebody); var filteredBoy = new IForceQueryFinesResponse(); //apply filter if (!string.IsNullOrEmpty(filter)) { var filteredfines = body.fines.Where(x => x.districtName == filter).ToList(); filteredBoy = new IForceQueryFinesResponse { transactionId = body.transactionId, resultCode = body.resultCode, resultDescription = body.resultDescription, fines = filteredfines }; } else { filteredBoy = new IForceQueryFinesResponse { transactionId = body.transactionId, resultCode = body.resultCode, resultDescription = body.resultDescription, fines = body.fines }; } foreach (var fine in filteredBoy.fines) { var paidLocalStatus = PaymentChecker.CheckLocalPaymentStatus(fine.noticeNumber, _con); switch (fine.phase) { case 1: phaseDetail = "Notice"; break; case 2: phaseDetail = "Summons"; break; case 3: phaseDetail = "Court"; break; case 4: phaseDetail = "Warrant"; break; default: phaseDetail = "Unknown"; break; } 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 = phaseDetail, 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 }); } iForceFines.Add(new IForceQueryFinesResponseStatusModel { transactionId = body.transactionId, resultCode = body.resultCode, resultDescription = body.resultDescription, fines = transformedFines.ToList() }); iForceresult = iForceFines; } else //"No data" returned for all errors { var errorResponse = JsonConvert.DeserializeObject(iForcebody); _logger.WriteLog(userId, statement, errorResponse.message, "iForce"); iForceresult = $"No fines found for {attributeValue}"; //return HttpService.CreateResponse(errorResponse.resultCode, result: dict); --> uncomment if we want a one fail all fail scenario } } catch { iForceresult = Constants.NO_RESPONSE; } //eNatis Object ENatisresult; try { var handler = new HttpClientHandler(); handler.ServerCertificateCustomValidationCallback = Helper.ServerCertificateCustomValidation; var enatisClient = new HttpClient(handler) { BaseAddress = new Uri(baseUrl), Timeout = TimeSpan.FromSeconds(Constants.TimeDefaultValue) }; var eNatisResponse = await enatisClient.GetAsync($"infringement/queryinfringer?IdDocumentType={idDocumentType}&IdDocumentNumber={idDocumentNumber}"); var eNatisbody = await eNatisResponse.Content.ReadAsStringAsync(); List filteredeNatis = new List { }; if (eNatisResponse.StatusCode == HttpStatusCode.OK) { eNatisbody = await eNatisResponse.Content.ReadAsStringAsync(); var body = JsonConvert.DeserializeObject>(eNatisbody); body = body.Where(f => f.payment.amount != 0).ToList(); foreach (var fine in body) { var paidLocalStatus = PaymentChecker.CheckLocalPaymentStatus(fine.infringementNoticeNumber, _con); eNatisFines.Add(new ENatisQueryInfrigerResponseStatusModel { infringementNoticeNumber = fine.infringementNoticeNumber, IDNumber = idDocumentNumber, date = fine.date, time = fine.time, location = fine.location, vehicle = fine.vehicle, charge = fine.charge, feesList = fine.feesList, payment = fine.payment, customerPaymentAllowed = paidLocalStatus }); } if (!string.IsNullOrEmpty(filter)) { filteredeNatis = eNatisFines.Where(x => x.location.issAuthority.description == filter).ToList(); } else { filteredeNatis = eNatisFines; } ENatisresult = filteredeNatis; } else { var errorResponse = JsonConvert.DeserializeObject(eNatisbody); _logger.WriteLog(userId, statement, errorResponse.message, "eNatis"); ENatisresult = $"No fines found for {attributeValue}"; //Error so give back empty body? } } catch { ENatisresult = Constants.NO_RESPONSE; } var responseBody = new { eNatis = ENatisresult, iForce = iForceresult }; _logger.WriteLog(userId, statement, responseBody.ToString(), "eNatis, TMT"); //add to db options in the log table return HttpService.CreateResponse(200, payload: responseBody); } } else { _logger.WriteLog(userId, statement, "Missing argument: IDNumber or CognitoUuid", "eNatis, TMT"); return HttpService.CreateResponse(401, payload: "Missing argument: IDNumber or CognitoUuid"); } } else { _logger.LogMessage(context, $"Processing request failed invalid request"); return HttpService.CreateResponse(400, payload: "No parameters provided"); } } catch (Exception ex) { response = HttpService.CreateResponse(500, exception: ex); //error picked up before calling iforce _logger.WriteLog(userId, statement, response.Body.ToString(), "TMT, eNatis"); return response; } finally { if (_con != null || _con.State == ConnectionState.Open) _con.Close(); } } public async Task GetPaginatedFines(APIGatewayProxyRequest request, ILambdaContext context) { APIGatewayProxyResponse response; IForcePaginatedQueryFinesResponseStatusModel iForceFines = new IForcePaginatedQueryFinesResponseStatusModel(); List eNatisFines = new List(); List accountIds = new List { }; string statement = "IForce and eNatis::GetAllFines"; string userId = ""; string idDocumentNumber = ""; string attributeValue = ""; string filter = ""; string idDocumentType = ""; int pageSize = 10; int pageStart = 1; int pageEnd = 1; try { if (!Helper.IsRequestEmpty(request)) { if (request != null) { if (request.QueryStringParameters.ContainsKey("strIssuingAuthority")) { filter = request.QueryStringParameters["strIssuingAuthority"]; } string validationMessage = string.Empty; if (request.QueryStringParameters.ContainsKey("strIdNumber") && !string.IsNullOrEmpty(request.QueryStringParameters["strIdNumber"])) { if (request.QueryStringParameters.ContainsKey("strIdType")) { idDocumentType = request.QueryStringParameters["strIdType"].ToString(); } else { return HttpService.CreateResponse(400, payload: "idtype is null or empty"); } if (string.Equals(idDocumentType, "2") || String.Equals(idDocumentType, "02")) { var validRequest = Helper.ValidateRequestParameters(ref validationMessage, request.QueryStringParameters, "strIdNumber"); if (!validRequest) return HttpService.CreateResponse(400, payload: validationMessage); idDocumentNumber = request.QueryStringParameters["strIdNumber"]; //fixed id number attributeValue = idDocumentNumber; } else//None validated ID { idDocumentNumber = request.QueryStringParameters["strIdNumber"]; //fixed id number attributeValue = idDocumentNumber; } accountIds.Add(new Id { IdNumber = idDocumentNumber, IdType = idDocumentType }); } else if (request.QueryStringParameters.ContainsKey("userId") && !string.IsNullOrEmpty(request.QueryStringParameters["userId"])) { var validRequest = Helper.ValidateRequestParameters(ref validationMessage, request.QueryStringParameters, "userId"); if (!validRequest) return HttpService.CreateResponse(400, payload: validationMessage); userId = request.QueryStringParameters["userId"]; if (_con.State == ConnectionState.Closed) _con.Open(); statement = $"SELECT * FROM user WHERE UserID = '{userId}'"; GetAllAssociateIds(accountIds, statement); //Populate allCognitoIds with the associated cognitouuid ids if (accountIds.Count < 1) { return HttpService.CreateResponse(200, payload: "userId does not exist"); } } else { //atleast one of Id or userId should be supplied. return HttpService.CreateResponse(400, payload: "Please provide a userId or idNumber"); } if (request.QueryStringParameters.ContainsKey("pageSize")) { if (int.TryParse(request.QueryStringParameters["pageSize"], out int result)) { pageSize = result; } } if (request.QueryStringParameters.ContainsKey("pageStart")) { if (int.TryParse(request.QueryStringParameters["pageStart"], out int result)) { pageStart = result; } } if (request.QueryStringParameters.ContainsKey("pageEnd")) { if (int.TryParse(request.QueryStringParameters["pageEnd"], out int result)) { pageEnd = result; } } /*IFORCE*/ accountIds = accountIds.Select(x => new Id { IdNumber = x.IdNumber, IdType = "2" }).ToList(); 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 }); } if (filterediForce.fines.Count > 0) { iForceFines = new IForcePaginatedQueryFinesResponseStatusModel { totalCases = filterediForce.totalCases, fines = transformedFines.ToList() }; } object IForceResult = iForceFines; if (filterediForce.fines.Count == 0 && errorInducedEmpty) { IForceResult = Constants.NO_RESPONSE; } else if (filterediForce.fines.Count == 0 && !errorInducedEmpty) { IForceResult = "No fines found"; } /*ENATIS*/ accountIds = accountIds.Select(x => new Id { IdNumber = x.IdNumber, IdType = "02" }).ToList(); var filteredEnatis = await GeteNatisIdsData(accountIds, filter); var flatArr = filteredEnatis.SelectMany(arr => arr).Distinct().Where(f => f.payment.amount != 0).ToList(); foreach (var fine in flatArr) { var paidLocalStatus = PaymentChecker.CheckLocalPaymentStatus(fine.infringementNoticeNumber, _con); eNatisFines.Add(new ENatisQueryInfrigerResponseStatusModel { infringementNoticeNumber = fine.infringementNoticeNumber, IDNumber = fine.idNumber, date = fine.date, time = fine.time, location = fine.location, vehicle = fine.vehicle, charge = fine.charge, feesList = fine.feesList, payment = fine.payment, customerPaymentAllowed = paidLocalStatus }); } object EnatisResult = eNatisFines; if (filteredEnatis.Count == 0 && errorInducedEmpty) { EnatisResult = Constants.NO_RESPONSE; } else if (filteredEnatis.Count == 0 && !errorInducedEmpty) { EnatisResult = "No fines found"; } var resultBody = new { eNatis = EnatisResult, iForce = IForceResult }; if (filteredEnatis.Count == 0 && filterediForce.fines.Count == 0 && !errorInducedEmpty) { return HttpService.CreateResponse(200, payload: "No fines found"); } return HttpService.CreateResponse(200, payload: resultBody); } else { _logger.WriteLog(userId, statement, "Missing argument: IDNumber or CognitoUuid", "eNatis, TMT"); return HttpService.CreateResponse(401, payload: "Missing argument: IDNumber or CognitoUuid"); } } else { _logger.LogMessage(context, $"Processing request failed invalid request"); return HttpService.CreateResponse(400, payload: "No parameters provided"); } } catch (Exception ex) { response = HttpService.CreateResponse(500, exception: ex); //error picked up before calling iforce _logger.WriteLog(userId, statement, response.Body.ToString(), "TMT, eNatis"); return response; } finally { if (_con != null || _con.State == ConnectionState.Open) _con.Close(); } } private void GetAllAssociateIds(List allCognitoIds, string statement) { using var cmd = new MySqlCommand(); cmd.Connection = _con; cmd.CommandText = statement; cmd.ExecuteNonQuery(); string userId = ""; _reader = cmd.ExecuteReader(); if (_reader.HasRows) { while (_reader.Read()) { userId = _reader.GetValue(0).ToString(); allCognitoIds.Add(new Id { IdNumber = _reader.GetValue(14).ToString(), IdType = _reader.GetValue(4).ToString() }); } } _reader.Close(); statement = $"SELECT * FROM userIdNumber WHERE refUserID = '{userId}'"; cmd.CommandText = statement; cmd.ExecuteNonQuery(); _reader = cmd.ExecuteReader(); if (_reader.HasRows) { while (_reader.Read()) { allCognitoIds.Add(new Id { IdNumber = _reader.GetValue(5).ToString(), IdType = _reader.GetValue(4).ToString() }); } } _reader.Close(); } private async Task> GetIForceIdsData(string attribute, List allCognitoIds, string filter) { List urlsIForce = new List { }; var handlerIForce = new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; IEnumerable responses = null; 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")); foreach (var id in allCognitoIds) { urlsIForce.Add($"IForce/queryopenfines?Attribute={attribute}&FineQueryAttributeValue={id.IdNumber}"); } //Start requests for all of them var requests = urlsIForce.Select ( url => client.GetAsync(url) ).ToList(); //Wait for all the requests to finish await Task.WhenAll(requests); //Get the responses responses = requests.Select ( task => task.Result ); } catch (Exception) { errorInducedEmpty = true; } List iForceQueryFinesResponses = new List { }; if (responses != null) { foreach (var response in responses) { // Extract the message body var content = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { var body = JsonConvert.DeserializeObject(content); iForceQueryFinesResponses.Add(body); } else { errorInducedEmpty = false; _logger.WriteLog("iForce request failed", content, response.RequestMessage.ToString(), "DB"); } } if (!string.IsNullOrEmpty(filter)) { return iForceQueryFinesResponses.Where(x => x.fines.Any(y => y.districtName == filter)).ToList(); } return iForceQueryFinesResponses; } return iForceQueryFinesResponses; } private async Task> GetBulkIForceIdsData(string attribute, List allCognitoIds, string filter) { List urlsIForce = new List { }; var handlerIForce = new HttpClientHandler { AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }; List iForceQueryFinesResponses = new List { }; 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(new { Attribute = Convert.ToInt32(id.IdType), FineQueryAttributeValue = id.IdNumber }); } var stringContent = new StringContent(JsonConvert.SerializeObject(queryIds), Encoding.UTF8, "application/json"); var response = await client.PostAsync("IForce/bulkqueryopenfines", stringContent); var content = await response.Content.ReadAsStringAsync(); if (response.IsSuccessStatusCode) { var iforceQueryFinesResponses = JsonConvert.DeserializeObject>(content); foreach (var iforceQueryFinesResponse in iforceQueryFinesResponses) { iForceQueryFinesResponses.Add(iforceQueryFinesResponse); } } else { errorInducedEmpty = false; _logger.WriteLog("iForce request failed", content, response.RequestMessage.ToString(), "DB"); } if (!string.IsNullOrEmpty(filter)) { iForceQueryFinesResponses = iForceQueryFinesResponses.Where(x => x.fines.Any(y => y.districtName == filter)).ToList(); } } catch (Exception) { errorInducedEmpty = true; } return iForceQueryFinesResponses; } 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); } else { errorInducedEmpty = false; _logger.WriteLog("iForce request failed", content, response.RequestMessage.ToString(), "DB"); } } catch (Exception) { errorInducedEmpty = true; } return iForceQueryFinesResponses; } private async Task>> GeteNatisIdsData(List allCognitoIds, string filter) { List urlsEnatis = new List { }; errorInducedEmpty = false; IEnumerable eNatisresponses = null; List> eNatisQueryInfrigerResponses = new List> { }; var handler = new HttpClientHandler(); try { handler.ServerCertificateCustomValidationCallback = Helper.ServerCertificateCustomValidation; var enatisClient = new HttpClient(handler) { BaseAddress = new Uri(baseUrl) }; foreach (var id in allCognitoIds) { urlsEnatis.Add($"infringement/queryinfringer?IdDocumentType={id.IdType}&IdDocumentNumber={id.IdNumber}"); } //Start requests for all of them var eNatisrequests = urlsEnatis.Select ( url => enatisClient.GetAsync(url) ).ToList(); //Wait for all the requests to finish await Task.WhenAll(eNatisrequests); //Get the responses eNatisresponses = eNatisrequests.Select ( task => task.Result ); } catch { errorInducedEmpty = true; } if (eNatisresponses != null) { foreach (var response in eNatisresponses) { // Extract the message body var content = await response.Content.ReadAsStringAsync(); string path = response.RequestMessage.RequestUri.PathAndQuery.ToString(); var id = path.Substring(path.LastIndexOf('=') + 1); if (response.IsSuccessStatusCode) { var body = JsonConvert.DeserializeObject>(content); body.ToList().ForEach(x => x.idNumber = id); eNatisQueryInfrigerResponses.Add(body); } else { errorInducedEmpty = false; _logger.WriteLog("eNatis request failed", content, response.RequestMessage.ToString(), "DB"); } } if (!string.IsNullOrEmpty(filter)) { if(!filter.Equals("ALL")) return eNatisQueryInfrigerResponses.Where(x => x.Any(s => s.location.issAuthority.code == filter)).ToList(); } return eNatisQueryInfrigerResponses; } return eNatisQueryInfrigerResponses; } } }