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/>"); }
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); }
/// <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(); } } }
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)}"); }
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)); }
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)); }
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)); }
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); } }
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}"); }
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"); }
/// <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(); } } } }
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("=", "="), value.Value); } ; } if (dictionary.Keys.Any()) { foreach (var key in dictionary.Keys) { input = input.Replace(key, dictionary[key]); } } return(input); }
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); }
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)); }
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)); }
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); }
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); }
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)); }
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); } }
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)); }
public async Task <T> GetProduct <T>(string customerCode, int id, SiteMode siteMode) { return(await GetProduct <T>(customerCode, id, false, siteMode)); }
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/>"); }
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 ); }
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)); }
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"); }