Exemple #1
0
        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;
            }
        }