/// <summary> /// The default action to render the front-end view /// </summary> /// <param name="model"/> /// <returns/> public async new Task <ActionResult> Index(RenderModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } var viewModel = new JobsRssViewModelFromUmbraco(model.Content).BuildModel(); // Add common properties to the model var expiryDate = new ExpiryDateFromExamine(model.Content.Id, ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"], new ExpiryDateMemoryCache(TimeSpan.FromHours(1))); var modelBuilder = new BaseViewModelBuilder(null); await modelBuilder.PopulateBaseViewModel(viewModel, model.Content, null, expiryDate.ExpiryDate, UmbracoContext.Current.InPreviewMode); var jobsProvider = new JobsDataFromApi(new Uri(ConfigurationManager.AppSettings["JobsApiBaseUrl"]), viewModel.JobsSet, viewModel.JobAdvertPage.Url, new HttpClientProvider(), null); var jobs = await jobsProvider.ReadProblemJobs(); foreach (var job in jobs) { viewModel.Items.Add(job); } // Jobs close at midnight, so don't cache beyond then var untilMidnightTonight = DateTime.Today.ToUkDateTime().AddDays(1) - DateTime.Now.ToUkDateTime(); new HttpCachingService().SetHttpCacheHeadersFromUmbracoContent(model.Content, UmbracoContext.Current.InPreviewMode, Response.Cache, new[] { expiryDate }, (int)untilMidnightTonight.TotalSeconds); return(CurrentTemplate(viewModel)); }
/// <summary> /// Sends job alerts which are configured for a particular frequency (in days), or any frequency if blank /// </summary> /// <param name="frequency">The frequency.</param> /// <param name="forceResend">If set to <c>true</c> force resend of alerts already sent (for testing)</param> public async Task SendAlerts(int?frequency, bool forceResend) { var apiBaseUrl = new Uri(ConfigurationManager.AppSettings["JobsApiBaseUrl"]); var cacheStrategy = new MemoryJobCacheStrategy(MemoryCache.Default); var publicAlertsSettings = JobAlertSettings(apiBaseUrl, JobsSet.PublicJobs); if (publicAlertsSettings != null) { var publicJobsProvider = new JobsDataFromApi(apiBaseUrl, JobsSet.PublicJobs, publicAlertsSettings.JobAdvertBaseUrl, new HttpClientProvider(), cacheStrategy); await SendAlertsForJobSet(publicJobsProvider, JobsSet.PublicJobs, frequency, publicAlertsSettings, forceResend); } var redeploymentAlertsSettings = JobAlertSettings(apiBaseUrl, JobsSet.RedeploymentJobs); if (redeploymentAlertsSettings != null) { var redeploymentJobsProvider = new JobsDataFromApi(apiBaseUrl, JobsSet.RedeploymentJobs, redeploymentAlertsSettings.JobAdvertBaseUrl, new HttpClientProvider(), cacheStrategy); await SendAlertsForJobSet(redeploymentJobsProvider, JobsSet.RedeploymentJobs, frequency, redeploymentAlertsSettings, forceResend); } }
/// <summary> /// The default action to render the front-end view /// </summary> /// <param name="model"/> /// <returns/> public async new Task <ActionResult> Index(RenderModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } var viewModel = new JobsRssViewModelFromUmbraco(model.Content).BuildModel(); // Add common properties to the model var expiryDate = new ExpiryDateFromExamine(model.Content.Id, ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"], new ExpiryDateMemoryCache(TimeSpan.FromHours(1))); var modelBuilder = new BaseViewModelBuilder(null); await modelBuilder.PopulateBaseViewModel(viewModel, model.Content, null, expiryDate.ExpiryDate, UmbracoContext.Current.InPreviewMode); viewModel.Query = new JobSearchQueryConverter(ConfigurationManager.AppSettings["TranslateObsoleteJobTypes"]?.ToUpperInvariant() == "TRUE").ToQuery(Request.QueryString); viewModel.Query.ClosingDateFrom = DateTime.Today; viewModel.Query.JobsSet = viewModel.JobsSet; var jobsProvider = new JobsDataFromApi(new Uri(ConfigurationManager.AppSettings["JobsApiBaseUrl"]), viewModel.JobsSet, viewModel.JobAdvertPage.Url, new HttpClientProvider(), new MemoryJobCacheStrategy(MemoryCache.Default, Request.QueryString["ForceCacheRefresh"] == "1")); var jobs = await jobsProvider.ReadJobs(viewModel.Query); foreach (var job in jobs.Jobs) { viewModel.Items.Add(job); } // Jobs close at midnight, so don't cache beyond then. // But we reindex every 2 hours, so expire then if it's sooner. var untilMidnightTonight = DateTime.Today.ToUkDateTime().AddDays(1) - DateTime.Now.ToUkDateTime(); var untilNextReindex = TimeUntilNextReindex(); var cacheDuration = untilMidnightTonight > untilNextReindex ? untilNextReindex : untilMidnightTonight; new HttpCachingService().SetHttpCacheHeadersFromUmbracoContent(model.Content, UmbracoContext.Current.InPreviewMode, Response.Cache, new[] { expiryDate }, (int)cacheDuration.TotalSeconds); return(CurrentTemplate(viewModel)); }
/// <summary> /// The default action to render the front-end view /// </summary> /// <param name="model"/> /// <returns/> public async new Task <ActionResult> Index(RenderModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } var viewModel = new JobSearchResultsViewModelFromUmbraco(model.Content).BuildModel(); // Add common properties to the model var expiryDate = new ExpiryDateFromExamine(model.Content.Id, ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"], new ExpiryDateMemoryCache(TimeSpan.FromHours(1))); var modelBuilder = new BaseViewModelBuilder(new EastSussexGovUKTemplateRequest(Request, webChatSettingsService: new UmbracoWebChatSettingsService(model.Content, new UrlListReader()))); await modelBuilder.PopulateBaseViewModel(viewModel, model.Content, new ContentExperimentSettingsService(), expiryDate.ExpiryDate, UmbracoContext.Current.InPreviewMode); modelBuilder.PopulateBaseViewModelWithInheritedContent(viewModel, new UmbracoLatestService(model.Content), new UmbracoSocialMediaService(model.Content), null, null, null); if (String.IsNullOrEmpty(Request.QueryString["altTemplate"])) { viewModel.Query = new JobSearchQueryConverter(ConfigurationManager.AppSettings["TranslateObsoleteJobTypes"]?.ToUpperInvariant() == "TRUE").ToQuery(Request.QueryString); viewModel.Query.ClosingDateFrom = DateTime.Today; viewModel.Query.JobsSet = viewModel.JobsSet; if (Request.QueryString["page"]?.ToUpperInvariant() != "ALL") { viewModel.Query.PageSize = viewModel.Paging.PageSize; viewModel.Query.CurrentPage = viewModel.Paging.CurrentPage; } viewModel.Metadata.Title = viewModel.Query.ToString(); var jobsProvider = new JobsDataFromApi( new Uri(ConfigurationManager.AppSettings["JobsApiBaseUrl"]), viewModel.JobsSet, viewModel.JobAdvertPage?.Url, new HttpClientProvider(), new MemoryJobCacheStrategy(MemoryCache.Default, Request.QueryString["ForceCacheRefresh"] == "1") ); var jobs = await jobsProvider.ReadJobs(viewModel.Query); viewModel.Jobs = jobs.Jobs; viewModel.Paging.TotalResults = jobs.TotalJobs; if (Request.QueryString["page"]?.ToUpperInvariant() == "ALL") { viewModel.Paging.PageSize = viewModel.Paging.TotalResults; } if (!String.IsNullOrEmpty(viewModel.Metadata.RssFeedUrl)) { var queryString = HttpUtility.ParseQueryString(Request.Url.Query); queryString.Remove("page"); if (queryString.HasKeys()) { viewModel.Metadata.RssFeedUrl = viewModel.Metadata.RssFeedUrl + "?" + queryString; } } } // Jobs close at midnight, so don't cache beyond then var untilMidnightTonight = DateTime.Today.ToUkDateTime().AddDays(1) - DateTime.Now.ToUkDateTime(); new HttpCachingService().SetHttpCacheHeadersFromUmbracoContent(model.Content, UmbracoContext.Current.InPreviewMode, Response.Cache, new IExpiryDateSource[] { expiryDate, new ExpiryDateFromPropertyValue(model.Content, "latestUnpublishDate_Latest") }, (int)untilMidnightTonight.TotalSeconds); return(CurrentTemplate(viewModel)); }
/// <summary> /// The default action to render the front-end view /// </summary> /// <param name="model"/> /// <returns/> public async new Task <ActionResult> Index(RenderModel model) { if (model == null) { throw new ArgumentNullException(nameof(model)); } var viewModel = new JobAdvertViewModelFromUmbraco(model.Content).BuildModel(); // Add common properties to the model var expiryDate = new ExpiryDateFromExamine(model.Content.Id, ExamineManager.Instance.SearchProviderCollection["ExternalSearcher"], new ExpiryDateMemoryCache(TimeSpan.FromHours(1))); var modelBuilder = new BaseViewModelBuilder(new EastSussexGovUKTemplateRequest(Request, webChatSettingsService: new UmbracoWebChatSettingsService(model.Content, new UrlListReader()))); await modelBuilder.PopulateBaseViewModel(viewModel, model.Content, new ContentExperimentSettingsService(), expiryDate.ExpiryDate, UmbracoContext.Current.InPreviewMode); modelBuilder.PopulateBaseViewModelWithInheritedContent(viewModel, new UmbracoLatestService(model.Content), new UmbracoSocialMediaService(model.Content), null, null); // Show page for preferred URL var jobUrlSegment = Regex.Match(Request.Url.AbsolutePath, "/([0-9]+)/"); if (jobUrlSegment.Success) { var jobsProvider = new JobsDataFromApi(new Uri(ConfigurationManager.AppSettings["JobsApiBaseUrl"]), viewModel.JobsSet, new Uri(model.Content.UrlAbsolute()), new HttpClientProvider(), new MemoryJobCacheStrategy(MemoryCache.Default, Request.QueryString["ForceCacheRefresh"] == "1")); viewModel.Job = await jobsProvider.ReadJob(jobUrlSegment.Groups[1].Value); if (viewModel.Job.Id == 0 || viewModel.Job.ClosingDate < DateTime.Today) { // The job URL looks valid but the job isn't in the index, so it's probably closed. // Find some similar jobs to suggest the user may want to apply for instead. await FindSimilarJobs(jobsProvider, viewModel); } } else { // The page was accessed by its default Umbraco URL with no parameters. Returning HttpNotFoundResult() ends up with a generic browser 404, // so to get our custom one we need to look it up and transfer control to it. // However, we need to check for "alttemplate" because a link to the default Umbraco URL with just a querystring that doesn't match any data // will in turn want to load the jobs CSS for a job that matches nothing, and that request ends up here. We want it to continue and return // the JobsCss view, not our 404 page. if (String.IsNullOrEmpty(Request.QueryString["alttemplate"])) { var notFoundUrl = new HttpStatusFromConfiguration().GetCustomUrlForStatusCode(404); if (notFoundUrl != null && Server != null) { Server.TransferRequest(notFoundUrl + "?404;" + HttpUtility.UrlEncode(Request.Url.ToString())); } } } // The page should expire when the job closes var expirySeconds = 86400; // one day if (viewModel.Job != null && viewModel.Job.ClosingDate != null) { var secondsToClosingDate = (int)(viewModel.Job.ClosingDate.Value.AddDays(1).Date.ToUkDateTime() - DateTime.Now.ToUkDateTime()).TotalSeconds; if (secondsToClosingDate >= 0) { expirySeconds = secondsToClosingDate; } } new HttpCachingService().SetHttpCacheHeadersFromUmbracoContent(model.Content, UmbracoContext.Current.InPreviewMode, Response.Cache, new IExpiryDateSource[] { expiryDate, new ExpiryDateFromPropertyValue(model.Content, "latestUnpublishDate_Latest") }, expirySeconds); return(CurrentTemplate(viewModel)); }