Пример #1
0
        private void RenderSiteHeader(StringBuilder sb, SiteMode currentMode)
        {
            RenderBodyOpenTag(sb);
            RenderHttpHead(sb, "",
                           "\n    processAjaxResult = function(resptext) { alert(resptext); }\n",
                           true);

            sb.AppendLine("    <h2>Сервис контроля состояния</h2>");
            sb.AppendLine();
            // рендерить "меню сайта"
            sb.AppendLine("    <hr/>");
            sb.AppendLine("      <p>");
            sb.AppendLine("        ");
            foreach (SiteMode mode in Enum.GetValues(typeof(SiteMode)))
            {
                var modeName = siteModeName[mode];
                if (mode == currentMode)
                {
                    sb.Append(" " + modeName);
                }
                else
                {
                    var query = siteModeQuery[mode];
                    sb.AppendFormat(" <a href=\"{0}\">{1}</a>", query, modeName);
                }
            }
            sb.AppendLine("      </p>");
            sb.AppendLine("    <hr/> <br/>");
        }
Пример #2
0
        private async Task <string[]> GetPdfTemplateFields(string customerCode, SiteMode siteMode)
        {
            var pdfGenerationSettings = await _pdfGenerationSettingsProvider.GetDefaultSettings(customerCode, siteMode);

            return(pdfGenerationSettings?.PdfTemplateSelector?.PdfTemplateFields != null && pdfGenerationSettings.PdfTemplateSelector.PdfTemplateFields.Any()
                ? pdfGenerationSettings.PdfTemplateSelector.PdfTemplateFields
                : _settings.PdfTemplateFields);
        }
Пример #3
0
        /// <summary>
        /// The execute impl.
        /// </summary>
        /// <param name="context">
        /// The context.
        /// </param>
        protected override void ExecuteImpl(IJobExecutionContext context)
        {
            lock (LockObject)
            {
                try
                {
                    // Останавливаем все триггеры
                    context.Scheduler.PauseAll();

                    // Ждем окончания всех работ
                    var waitInterupt = false;
                    while (!waitInterupt)
                    {
                        Thread.Sleep(1000);
                        var executingJobs = context.Scheduler.GetCurrentlyExecutingJobs();
                        if (executingJobs.Count == 1 && executingJobs.First().JobInstance == this)
                        {
                            waitInterupt = true;
                        }
                    }

                    // Вырубаем сайт
                    SiteMode.SetOfflineMode(CalculateOnlineDateTime());

                    // Сохраянем время начала синхронизации
                    SaveSyncStartOrFinishTime("_Start");

                    var atlServices = ObjectFactory.GetInstance <IAtlService>();
                    if (ConfigManager.SynchronizationSettings.SynchronizationNsi)
                    {
                        atlServices.RunSinhronizeNsi(context);
                    }

                    if (ConfigManager.SynchronizationSettings.SynchronizationToPvp)
                    {
                        atlServices.RunExportToPvp(context);
                    }

                    // Сохраянем время окончания синхронизации
                    SaveSyncStartOrFinishTime("_Finish");
                }
                finally
                {
                    // Запускаем снова все триггеры
                    context.Scheduler.ResumeAll();

                    // Переводим сайт в online
                    SiteMode.SetOnlineMode();
                }
            }
        }
Пример #4
0
        private string GetProductsJsonDownloadUrl(string customerCode, string productType, int[] ids, SiteMode siteMode)
        {
            var customerCodePart = GetCustomerCodeUrlPart(customerCode);

            //вариант для получения одним запросом(когда починят).
            return($"{_settings.BaseUrl}/{customerCodePart}invariant/{siteMode.ToString().ToLower()}/products/{productType}?Id={string.Join("{or}", ids)}");
        }
Пример #5
0
        public async Task <IEnumerable <T> > GetProducts <T>(string customerCode, string productType, int[] ids, SiteMode siteMode, string[] fields = null)
        {
            var productsJsons = await GetProductsJson(customerCode, productType, ids, siteMode, fields);

            return(JsonConvert.DeserializeObject <IEnumerable <T> >(productsJsons));
        }
Пример #6
0
        public async Task <RegionTags[]> GetRegionTags(string customerCode, int productId, SiteMode siteMode)
        {
            var url  = GetRegionTagsUrl(customerCode, productId, siteMode);
            var json = await MakeRequest(customerCode, url);

            return(JsonConvert.DeserializeObject <RegionTags[]>(json));
        }
Пример #7
0
        public async Task <T> GetProduct <T>(string customerCode, int id, bool allFields, SiteMode siteMode, string[] fields = null)
        {
            var productJson = await GetProductJson(customerCode, id, allFields, siteMode, fields);

            return(JsonConvert.DeserializeObject <T>(productJson));
        }
Пример #8
0
        public async Task <string> GetProductJson(string customerCode, int id, bool allFields, SiteMode siteMode, string[] fields = null)
        {
            var url = GetProductJsonDownloadUrl(customerCode, id, allFields, siteMode, fields);

            try
            {
                return(await MakeRequest(customerCode, url));
            }
            catch (Exception ex)
            {
                throw new GetProductJsonException($"Get product json with id = {id} error.", ex);
            }
        }
Пример #9
0
        private string GetRegionTagsUrl(string customerCode, int productId, SiteMode siteMode)
        {
            var customerCodePart = GetCustomerCodeUrlPart(customerCode);

            return($"{_settings.BaseUrl}/{customerCodePart}invariant/{siteMode.ToString().ToLower()}/products/RegionTags?ProductId={productId}");
        }
Пример #10
0
        public async Task <string> MapProductJson(string customerCode, int productId, string category, int?mapperId, int?templateId, bool forceDownload, SiteMode siteMode)
        {
            if (!mapperId.HasValue)
            {
                PdfTemplate pdfTemplate;
                if (templateId.HasValue)
                {
                    pdfTemplate = await _dpcApiClient.GetProduct <PdfTemplate>(customerCode, templateId.Value, siteMode);
                }
                else
                {
                    pdfTemplate = await _pdfTemplateSelector.GetPdfTemplateForProduct(customerCode, productId, category, siteMode);
                }
                mapperId = pdfTemplate.PdfScriptMapper.Id;
            }

            var mapper = await _dpcApiClient.GetProduct <PdfScriptMapper>(customerCode, mapperId.Value, true, siteMode);

//            var mapper = await _dpcApiDbApiClient.GetPdfScriptMapper(mapperId.Value);


            var productBase = await _dpcApiClient.GetProduct <DpcProductBase>(customerCode, productId, false, siteMode, new[] { "Id", "UpdateDate" });

            if (productBase == null)
            {
                throw new GetProductJsonException();
            }
            var productDownloadUrl = _dpcApiClient.GetProductJsonDownloadUrl(customerCode, productId, true, siteMode);

            var request = new PreviewJsonRequest
            {
                TariffData = new GenerateHtmlFileInfo
                {
                    Id            = productId,
                    Timestamp     = ConvertToTimestamp(productBase.UpdateDate),
                    ForceDownload = forceDownload,
                    DownloadUrl   = productDownloadUrl,
                    SiteMode      = siteMode.ToString()
                },

                MapperData = new GenerateHtmlFileInfo
                {
                    Id            = mapperId.Value,
                    Timestamp     = ConvertToTimestamp(mapper.Timestamp),
                    ForceDownload = forceDownload,
                    DownloadUrl   = $"{_settings.DpcStaticFilesScheme}:{mapper.PdfScriptMapperFile.AbsoluteUrl}",
                    SiteMode      = "db"
                },
            };

            var response = await MakeRequest(request);

            if (response.Success)
            {
                return(response.Json);
            }

            throw new ProductMappingException(response.Error?.Message ?? "Unknown error while mapping product");
        }
Пример #11
0
        /// <summary>
        /// The execute impl.
        /// </summary>
        /// <param name="context">
        /// The context.
        /// </param>
        protected override void ExecuteImpl(IJobExecutionContext context)
        {
            // 4. Если бэкап холодный, нужно (отключить всех пользователей).
            // 4.1 Переводим ПО в офлайн режим по конфигу (таким образом отключаем создание новых задач и всех пользователей онлайна)
            // 4.2 Ждем окончания уже запущенных задач кварца
            // 4.3 Создаем бэкап
            lock (LockObject)
            {
                // Ставим тригер на паузу, чтобы не плодить потоков, которые выпадут в ожидание по lock
                context.Scheduler.PauseTrigger(context.Trigger.Key);
                try
                {
                    if (ConfigManager.ExchangeSettings.DisconnectUsers)
                    {
                        // 4.1 Переводим ПО в офлайн режим по конфигу (таким образом отключаем создание новых задач и всех пользователей онлайна)
                        SiteMode.SetOfflineMode(context.JobRunTime.Add(new TimeSpan(0, 5, 0, 0)).ToString());
                        context.JobDetail.JobDataMap["progress"] = 20;

                        // 4.2 Ждем окончания уже запущенных задач кварца кроме той которая выполняет бэкап базы
                        var schedulerFactory = ObjectFactory.GetInstance <ISchedulerFactory>();
                        var scheduler        = schedulerFactory.GetScheduler();

                        // Останавливаем шедуллер (старт новых задач)
                        scheduler.PauseAll();

                        while (true)
                        {
                            // если осталась одна работа, то это выполнение бэкапа
                            if (scheduler.GetCurrentlyExecutingJobs().Count == 1)
                            {
                                break;
                            }

                            Thread.Sleep(5000);
                        }

                        context.JobDetail.JobDataMap["progress"] = 40;
                    }

                    // 4.3 Создаем бэкап
                    var session = ObjectFactory.GetInstance <ISessionFactory>().GetCurrentSession();

                    var currentDataBase = session.GetSessionImplementation().Connection.Database;

                    var dialect = session.GetSessionImplementation().Factory.Dialect;

                    if (dialect is Oracle8iDialect)
                    {
                        var filePath = Path.Combine(
                            ConfigManager.ExchangeSettings.BackupOutputFolder,
                            string.Format(
                                "{0}.{1}.dmp",
                                currentDataBase,
                                DateTime.UtcNow.ToString("yyyy.MM.dd HH.mm")));

                        // TODO: get from config
                        var userName    = string.Empty;
                        var password    = string.Empty;
                        var listener    = string.Empty;
                        var backupQuery =
                            session.CreateSQLQuery(
                                string.Format(
                                    @"exp {0}/{1}@{2} file={3} consistent=y",
                                    userName,
                                    password,
                                    listener,
                                    filePath));
                        backupQuery.UniqueResult();
                    }
                    else if (dialect is MsSql2000Dialect)
                    {
                        var filePath = Path.Combine(
                            ConfigManager.ExchangeSettings.BackupOutputFolder,
                            string.Format(
                                "{0}.{1}.bak",
                                currentDataBase,
                                DateTime.UtcNow.ToString("yyyy.MM.dd HH.mm")));
                        var sql         = @"BACKUP DATABASE {0}
          TO DISK = '{1}'
          WITH FORMAT,
          MEDIANAME = 'Z_SQLServerBackups',
          NAME = 'Full Backup of {2}';";
                        var backupQuery = session.CreateSQLQuery(string.Format(sql, currentDataBase, filePath, currentDataBase));
                        backupQuery.UniqueResult();
                    }

                    context.JobDetail.JobDataMap["progress"] = 100;
                    logger.Info("Процесс создания бэкапа успешно завершён");
                }
                catch (Exception exception)
                {
                    logger.Fatal("В процессе создания бэкапа произошла ошибка", exception);
                }
                finally
                {
                    context.Scheduler.ResumeTrigger(context.Trigger.Key);

                    // Выводим сайт из состояния офлайна
                    if (ConfigManager.ExchangeSettings.DisconnectUsers)
                    {
                        SiteMode.SetOnlineMode();
                        var schedulerFactory = ObjectFactory.GetInstance <ISchedulerFactory>();
                        var scheduler        = schedulerFactory.GetScheduler();
                        scheduler.ResumeAll();
                    }
                }
            }
        }
Пример #12
0
        public async Task <string> ReplaceTags(string customerCode, string input, int productId, SiteMode siteMode, int?regionId)
        {
            if (!regionId.HasValue)
            {
                return(input);
            }

            var regionTags = await _dpcApiClient.GetRegionTags(customerCode, productId, siteMode);

            if (regionTags == null || regionTags.Length == 0)
            {
                return(input);
            }


            var tags = regionTags.FirstOrDefault(x => x.ProductId == productId);

            if (tags?.RegionTagsArray == null || tags.RegionTagsArray.Length == 0)
            {
                return(input);
            }

            var dictionary = new Dictionary <string, string>();

            foreach (var regionTag in tags.RegionTagsArray)
            {
                //[replacement]tag=ab[/replacement]
                var key = $"[replacement]tag={regionTag.Title}[/replacement]";
                if (dictionary.ContainsKey(key))
                {
                    continue;
                }
                var value = regionTag.Values.FirstOrDefault(x => x.RegionsId.Contains(regionId.Value));
                if (value != null)
                {
                    dictionary.Add(key, value.Value);
                    dictionary.Add(key.Replace("=", "&#x3D;"), value.Value);
                }
                ;
            }

            if (dictionary.Keys.Any())
            {
                foreach (var key in dictionary.Keys)
                {
                    input = input.Replace(key, dictionary[key]);
                }
            }

            return(input);
        }
Пример #13
0
        private async Task <PdfTemplate> FindPdfTemplateInJson(string customerCode, string category, SiteMode siteMode, string productJson, string[] pdfTemplateFields, bool jsonIsArray)
        {
            if (productJson == null)
            {
                throw new GetProductJsonException();
            }
            JToken jObj;

            if (!jsonIsArray)
            {
                jObj = JObject.Parse(productJson);
            }
            else
            {
                var jArr = JArray.Parse(productJson);
                jObj = jArr.First();
            }

            var templateSearchArray = new List <int[]>();

            for (var i = 0; i < pdfTemplateFields.Length; i++)
            {
                var jsonPath     = $"$.{pdfTemplateFields[i]}[*].Id";
                var tokens       = jObj.SelectTokens(jsonPath).Values <int>();
                var castedTokens = tokens as int[] ?? tokens.ToArray();
                if (castedTokens.Any())
                {
                    templateSearchArray.Add(castedTokens);
                }
            }
            if (!templateSearchArray.Any())
            {
                throw new TemplateNotFoundException();
            }

            var distinctTemplateIds = templateSearchArray.SelectMany(x => x).Distinct().ToArray();
            var templates           = await _dpcApiClient.GetProducts <PdfTemplate>(customerCode, "pdf", distinctTemplateIds, siteMode, new[] { "*" });

            var dpcPdfTemplates = templates as IList <PdfTemplate> ?? templates.ToList();

            for (var i = 0; i < templateSearchArray.Count; i++)
            {
                var i1 = i;
                var matchedTemplate =
                    dpcPdfTemplates.FirstOrDefault(x => templateSearchArray[i1].Contains(x.Id) &&
                                                   x.PdfTemplateCategory.Alias.Equals(category,
                                                                                      StringComparison.InvariantCultureIgnoreCase));
                if (matchedTemplate != null)
                {
                    return(matchedTemplate);
                }
            }


            return(null);
        }
Пример #14
0
        public async Task <PdfTemplate> GetPdfTemplateForRoaming(string customerCode, string countryCode, string category, bool isB2B, SiteMode siteMode)
        {
            var fields = new List <string> {
                "Id"
            };

            var pdfTemplateFields = await GetRoamingPdfTemplateFields(customerCode, siteMode);

            fields.AddRange(pdfTemplateFields);
            var query = new NameValueCollection {
                { "Alias", countryCode }
            };
            var productJson = await _dpcApiClient.GetProductJson(customerCode, "RoamingCountry", query, false, siteMode, fields.ToArray());

            return(await FindPdfTemplateInJson(customerCode, category, siteMode, productJson, pdfTemplateFields, true));
        }
Пример #15
0
        public async Task <PdfTemplate> GetPdfTemplateForProduct(string customerCode, int productId, string category, SiteMode siteMode)
        {
            var fields = new List <string> {
                "Id"
            };
            var pdfTemplateFields = await GetPdfTemplateFields(customerCode, siteMode);

            fields.AddRange(pdfTemplateFields);
            var productJson = await _dpcApiClient.GetProductJson(customerCode, productId, false, siteMode, fields.ToArray());

            return(await FindPdfTemplateInJson(customerCode, category, siteMode, productJson, pdfTemplateFields, false));
        }
Пример #16
0
        public string GetProductJsonDownloadUrl(string customerCode, int id, bool allFields, SiteMode siteMode, string[] fields = null)
        {
            var customerCodePart = GetCustomerCodeUrlPart(customerCode);

            var url = $"{_settings.BaseUrl}/{customerCodePart}invariant/{siteMode.ToString().ToLower()}/products/{id}";

            if (allFields)
            {
                fields = new[] { "*" }
            }
            ;

            if (fields != null && fields.Any())
            {
                url += $"?fields={string.Join(",", fields)}";
            }
            return(url);
        }
Пример #17
0
        private string GetProductJsonDownloadUrl(string customerCode, string slug, NameValueCollection parameters, bool allFields, SiteMode siteMode, string[] fields)
        {
            var customerCodePart = GetCustomerCodeUrlPart(customerCode);
            var url = $"{_settings.BaseUrl}/{customerCodePart}invariant/{siteMode.ToString().ToLower()}/products/{slug}";

            if (parameters.HasKeys())
            {
                var queryParams = string.Join("&", parameters.AllKeys.Select(key => $"{key}={parameters[key]}"));
                url += $"?{queryParams}";
            }

            if (allFields)
            {
                fields = new[] { "*" }
            }
            ;

            if (fields != null && fields.Any())
            {
                url += parameters.HasKeys() ? "&" : "?";
                url += $"fields={string.Join(",", fields)}";
            }

            return(url);
        }
Пример #18
0
        public async Task <PdfGenerationSettings> GetDefaultSettings(string customerCode, SiteMode siteMode)
        {
            var settingsArray = await _dpcApiClient.GetProduct <PdfGenerationSettingsProduct[]>(customerCode, "pdfgenerationsettings",
                                                                                                new NameValueCollection
            {
                { "IsDefault", "true" }
            }, true, siteMode);

            var settings = settingsArray?.FirstOrDefault();

            return(string.IsNullOrWhiteSpace(settings?.ValueJson)
                ? null
                : JsonConvert.DeserializeObject <PdfGenerationSettings>(settings.ValueJson));
        }
Пример #19
0
        public async Task <string> GetProductJson(string customerCode, string slug, NameValueCollection parameters, bool allFields, SiteMode siteMode, string[] fields = null)
        {
            var url = GetProductJsonDownloadUrl(customerCode, slug, parameters, allFields, siteMode, fields);

            try
            {
                return(await MakeRequest(customerCode, url));
            }
            catch (Exception ex)
            {
                throw new GetProductJsonException($"Get product json with slug = {slug}", ex);
            }
        }
Пример #20
0
 public async Task <PdfGenerationSettings> GetSettings(string customerCode, PdfTemplate template, SiteMode siteMode)
 {
     return(string.IsNullOrWhiteSpace(template?.PdfGenerationSettings?.ValueJson)
         ? await GetDefaultSettings(customerCode, siteMode)
         : JsonConvert.DeserializeObject <PdfGenerationSettings>(template.PdfGenerationSettings.ValueJson));
 }
Пример #21
0
 public async Task <T> GetProduct <T>(string customerCode, int id, SiteMode siteMode)
 {
     return(await GetProduct <T>(customerCode, id, false, siteMode));
 }
Пример #22
0
        private void RenderSiteHeader(StringBuilder sb, SiteMode currentMode)
        {
            RenderBodyOpenTag(sb);
            RenderHttpHead(sb, "",
                "\n    processAjaxResult = function(resptext) { alert(resptext); }\n",
                true);

            sb.AppendLine("    <h2>Сервис контроля состояния</h2>");
            sb.AppendLine();
            // рендерить "меню сайта"
            sb.AppendLine("    <hr/>");
            sb.AppendLine("      <p>");
            sb.AppendLine("        ");
            foreach (SiteMode mode in Enum.GetValues(typeof (SiteMode)))
            {
                var modeName = siteModeName[mode];
                if (mode == currentMode)
                    sb.Append(" " + modeName);
                else
                {
                    var query = siteModeQuery[mode];
                    sb.AppendFormat(" <a href=\"{0}\">{1}</a>", query, modeName);
                }
            }
            sb.AppendLine("      </p>");
            sb.AppendLine("    <hr/> <br/>");
        }
Пример #23
0
        public async Task <T> GetProduct <T>(string customerCode, string slug, NameValueCollection parameters, bool allFields, SiteMode siteMode, string[] fields = null)
        {
            var productJson = await GetProductJson(customerCode, slug, parameters, allFields, siteMode, fields);

            return(JsonConvert.DeserializeObject <T>(productJson));
        }
 private void SetCookieWithMode( SiteMode mode )
 {
   var newCookie = new HttpCookie( LONG_TERM_VIEW_SELECTION_COOKIE_NAME, mode.ToString() )
                     {Expires = DateTime.Now.AddDays( 5 )};
   HttpContext.Current.Response.Cookies.Add( newCookie );
 }
Пример #25
0
        public async Task <string> GetProductsJson(string customerCode, string productType, int[] ids, SiteMode siteMode, string[] fields = null)
        {
            var url = GetProductsJsonDownloadUrl(customerCode, productType, ids, siteMode);

            if (fields != null && fields.Any())
            {
                url += $"&fields={string.Join(",", fields)}";
            }

            return(await MakeRequest(customerCode, url));
        }
Пример #26
0
        public async Task <string> GenerateHtml(string customerCode, int productId, string category, int?templateId,
                                                int?regionId, SiteMode siteMode, bool forceDownload)
        {
            PdfTemplate pdfTemplate;

            if (templateId.HasValue)
            {
                pdfTemplate = await _client.GetProduct <PdfTemplate>(customerCode, templateId.Value, siteMode);
            }
            else
            {
                pdfTemplate =
                    await _pdfTemplateSelector.GetPdfTemplateForProduct(customerCode, productId, category, siteMode);
            }

            if (pdfTemplate == null)
            {
                throw new TemplateNotFoundException();
            }

            var productBase = await _client.GetProduct <DpcProductBase>(customerCode, productId, false, siteMode,
                                                                        new[] { "Id", "UpdateDate" });

            if (productBase == null)
            {
                throw new GetProductJsonException();
            }
            var productDownloadUrl = _client.GetProductJsonDownloadUrl(customerCode, productId, true, siteMode);
            var request            = new GenerateHtmlRequest
            {
                TariffData = new GenerateHtmlFileInfo
                {
                    Id            = productId,
                    Timestamp     = ConvertToTimestamp(productBase.UpdateDate),
                    DownloadUrl   = productDownloadUrl,
                    ForceDownload = forceDownload,
                    SiteMode      = siteMode.ToString()
                },
                MapperData = new GenerateHtmlFileInfo
                {
                    Id          = pdfTemplate.PdfScriptMapper.Id,
                    Timestamp   = ConvertToTimestamp(pdfTemplate.PdfScriptMapper.Timestamp),
                    DownloadUrl =
                        $"{_settings.DpcStaticFilesScheme}:{pdfTemplate.PdfScriptMapper.PdfScriptMapperFile.AbsoluteUrl}",
                    ForceDownload = forceDownload,
                    SiteMode      = siteMode.ToString()
                },
                TemplateData = new GenerateHtmlFileInfo
                {
                    Id            = pdfTemplate.Id,
                    Timestamp     = ConvertToTimestamp(pdfTemplate.UpdateDate),
                    DownloadUrl   = $"{_settings.DpcStaticFilesScheme}:{pdfTemplate.PdfTemplateFile.AbsoluteUrl}",
                    ForceDownload = forceDownload,
                    SiteMode      = siteMode.ToString()
                },
                TemplateEngine = pdfTemplate.PdfTemplateEngine
            };
            var response = await MakeGenerateRequest(request);

            if (response.Success && !string.IsNullOrWhiteSpace(response.RelativePath))
            {
                var generatedHtml = await GetHtml(response.RelativePath);

                var replacedHtml =
                    await _regionTagsReplacer.ReplaceTags(customerCode, generatedHtml, productId, siteMode, regionId);

                return(replacedHtml);
            }

            throw new HtmlGenerationException(response.Error?.Message ?? "Unknown error while generating html");
        }