/// <summary> /// /// </summary> /// <param name="doc"></param> /// <param name="nationalityCode"></param> /// <returns>LogID returned by Yakeen validation. Returns 0 if business rules do not require validation at Yakeen to be done.</returns> private async Task <int> ValidateAtYakeen(PassengerTravelDocument doc, string nationalityCode, string userName, string password, string chargeCode, string serviceUrl, string timeoutSeconds) { var reference = ""; // DateTime.UtcNow.ToString("yyyyMMdd_HHmmss"); var logId = 0; var dobStr = doc.DOB.ToString("MM-yyyy"); var client = YakeenClient.Instance; if (!int.TryParse(timeoutSeconds, out int seconds)) { seconds = 5; } client.InnerChannel.OperationTimeout = new TimeSpan(0, 0, seconds); client.Endpoint.Address = new EndpointAddress(serviceUrl); doc.DocNumber = doc.DocNumber.Trim(); if (nationalityCode == "SA") { if (doc.DocTypeCode == "N") { var response = await client.getCitizenInfoByIDAsync(new citizenInfoByIDRequest { userName = userName, password = password, chargeCode = chargeCode, referenceNumber = reference, nin = doc.DocNumber, dateOfBirth = dobStr }); logId = response.CitizenInfoByIDResult.logId; } else if (doc.DocTypeCode == "P") { var response = await client.getCitizenInfoByPassportAsync(new citizenInfoByPassportRequest { userName = userName, password = password, chargeCode = chargeCode, referenceNumber = reference, passportNumber = doc.DocNumber, dateOfBirth = dobStr }); logId = response.CitizenInfoByPassportResult.logId; } } else { if (doc.DocTypeCode == "P") { var response = await client.getAlienInfoByPassportAsync(new alienInfoByPassportRequest { userName = userName, password = password, chargeCode = chargeCode, referenceNumber = reference, passportNumber = doc.DocNumber, nationalityCode = YakeenHelper.GetYakeenCountryCode(doc.IssuedByCode) }); logId = response.AlienInfoByPassportResult.logId; } else if (doc.DocTypeCode == "I") { var response = await client.getAlienInfoByIqamaAsync(new alienInfoByIqamaRequest { userName = userName, password = password, chargeCode = chargeCode, referenceNumber = reference, iqamaNumber = doc.DocNumber, dateOfBirth = dobStr }); logId = response.AlienInfoByIqamaResult.logId; } } return(logId); }
private async Task ValidateTravelDoc(PassengerTravelDocument doc, Booking booking, string nationalityCode, List <string> comments, ISessionBagService sessionBag, Dictionary <string, string> settings, IMemoryCache cache) { if (comments != null && comments.Count > 0) { var existingComment = comments.Find( c => c.StartsWith(_commentPrefix) && c.Contains("DocNum=" + doc.DocNumber)); if (!string.IsNullOrEmpty(existingComment)) { return; } } if (booking.BookingComments != null && booking.BookingComments.Length > 0) { var existingComment = booking.BookingComments.ToList().Find( c => c.CommentText.StartsWith(_commentPrefix) && c.CommentText.Contains("DocNum=" + doc.DocNumber)); if (existingComment != null) { return; } } var isRestingFromYakeenChecks = cache.Get <bool>("Yakeen_RestingFromChecks"); if (isRestingFromYakeenChecks) { // dont do yakeen check var newComment = string.Format("NotPerformed. Tries=0, DocNum={0}, DocType={1}, Reason={2}", doc.DocNumber, doc.DocTypeCode, "Excessive service timeouts"); await StoreBookingComment(newComment, sessionBag, comments); return; } var yakeenCountSessionKey = string.Format("yakeenCountSession_{0}_{1}", doc.DocNumber, doc.DocTypeCode); var sessionStr = await sessionBag.GetCustomSessionValue(yakeenCountSessionKey) ?? "0"; int.TryParse(sessionStr, out int validationFailureCount); if (!int.TryParse(settings["YakeenMaxFailures"], out int yakeenMaxFailures)) { yakeenMaxFailures = 2; } if (validationFailureCount >= yakeenMaxFailures) { return; } try { var logId = await ValidateAtYakeen(doc, nationalityCode, settings["YakeenUsername"], settings["YakeenPassword"], settings["YakeenChargeCode"], settings["YakeenServiceUrl"], settings["YakeenTimeoutSeconds"]); if (logId == 0) // 0 means no validation was required at yakeen therefore not performed { return; } var newComment = string.Format("Success. LogId={0}, DocNum={1}, DocType={2}", logId, doc.DocNumber, doc.DocTypeCode); await StoreBookingComment(newComment, sessionBag, comments); } catch (Exception e) { validationFailureCount++; Logger logger = LogManager.GetCurrentClassLogger(); logger.Warn(string.Format("[{0}] Tries={1}, DocNum={2}, DocType={3} Reason={4}", ResponseErrorCode.TravelDocumentValidationFailure.ToString(), validationFailureCount, doc.DocNumber, doc.DocTypeCode, e.Message)); sessionBag.SetCustomSessionValue(yakeenCountSessionKey, validationFailureCount.ToString()).GetAwaiter().GetResult(); var isTimeout = e is TimeoutException || (e.InnerException != null && e.InnerException is TimeoutException); if (validationFailureCount >= yakeenMaxFailures) { var reason = isTimeout ? "Query timeout" : e.Message; var newComment = string.Format("Failed. Tries={0}, DocNum={1}, DocType={2}, Reason={3}", validationFailureCount, doc.DocNumber, doc.DocTypeCode, reason); await StoreBookingComment(newComment, sessionBag, comments); return; } if (isTimeout) { if (!int.TryParse(settings["YakeenExcessiveTimeoutCount"], out int excessiveTimeoutCountSetting)) { excessiveTimeoutCountSetting = 20; } if (!int.TryParse(settings["YakeenExcessiveTimeoutRestSeconds"], out int excessiveTimeoutRestSecondsSetting)) { excessiveTimeoutRestSecondsSetting = 3600; } if (!int.TryParse(settings["YakeenExcessiveTimeoutPeriodSeconds"], out int excessiveTimeoutPeriodSecondsSetting)) { excessiveTimeoutPeriodSecondsSetting = 300; } lock (_syncRoot) { var timePeriodIsRunning = cache.Get <bool>("Yakeen_PeriodIsRunning"); var globalTimeoutCount = timePeriodIsRunning ? cache.Get <int>("Yakeen_GlobalTimeoutCount") + 1 : 1; cache.Set("Yakeen_GlobalTimeoutCount", globalTimeoutCount); if (timePeriodIsRunning) { if (globalTimeoutCount >= excessiveTimeoutCountSetting) { cache.Set("Yakeen_RestingFromChecks", true, new TimeSpan(0, 0, excessiveTimeoutRestSecondsSetting)); cache.Remove("Yakeen_GlobalTimeoutCount"); cache.Remove("Yakeen_PeriodIsRunning"); } } else { cache.Set("Yakeen_PeriodIsRunning", true, new TimeSpan(0, 0, excessiveTimeoutPeriodSecondsSetting)); } } } throw; } }