private void FindSimilarJobs(IJobsDataProvider jobsProvider, JobAdvertViewModel model) { // Get the job title from the URL and use it as keywords to search for jobs that might be similar var urlPath = Request.Url.AbsolutePath.TrimEnd('/'); var lastSlash = urlPath.LastIndexOf('/'); if (lastSlash > -1) { urlPath = urlPath.Substring(lastSlash + 1); } var jobs = Task.Run(async() => await jobsProvider.ReadJobs(new JobSearchQuery() { KeywordsInTitle = urlPath.Replace("-", " ") })).Result; foreach (var job in jobs) { if (model.SimilarJobs.Count >= 10) { break; } model.SimilarJobs.Add(job); } }
private async Task LookupJobsForAlert(IJobsDataProvider jobsData, JobAlert alert, IList <int> jobsSentForThisAlert) { alert.Query.ClosingDateFrom = DateTime.Today; _log.Info($"Requesting {alert.Query.ToString()}"); var jobs = await jobsData.ReadJobs(alert.Query); foreach (var job in jobs.Jobs) { if (!jobsSentForThisAlert.Contains(job.Id)) { alert.MatchingJobs.Add(job); } } }
/// <summary> /// Initializes a new instance of the <see cref="BaseJobsIndexer" /> class. /// </summary> /// <param name="jobsProvider">The jobs provider.</param> /// <param name="stopWordsRemover">The stop words remover.</param> /// <param name="tagSanitiser">The tag sanitiser.</param> /// <exception cref="System.ArgumentNullException">stopWordsRemover</exception> protected BaseJobsIndexer(IJobsDataProvider jobsProvider, ISearchFilter stopWordsRemover, IHtmlTagSanitiser tagSanitiser) { if (jobsProvider == null) { throw new ArgumentNullException(nameof(jobsProvider)); } if (stopWordsRemover == null) { throw new ArgumentNullException(nameof(stopWordsRemover)); } if (tagSanitiser == null) { throw new ArgumentNullException(nameof(tagSanitiser)); } _jobsProvider = jobsProvider; _stopWordsRemover = stopWordsRemover; _tagSanitiser = tagSanitiser; }
private async Task SendAlertsForJobSet(IJobsDataProvider jobsProvider, JobsSet jobsSet, int?frequency, JobAlertSettings alertSettings, bool forceResend) { // No point sending alerts without links to the jobs if (alertSettings.JobAdvertBaseUrl == null) { _log.Error("JobAdvertBaseUrl not found - aborting"); return; } // We need somewhere to get the alerts from... var converter = new JobSearchQueryConverter(ConfigurationManager.AppSettings["TranslateObsoleteJobTypes"]?.ToUpperInvariant() == "TRUE"); var encoder = new JobAlertIdEncoder(converter); IJobAlertsRepository alertsRepo = new AzureTableStorageAlertsRepository(converter, ConfigurationManager.ConnectionStrings["JobAlerts.AzureStorage"].ConnectionString); // We need a way to send the alerts... var configuration = new ConfigurationServiceRegistry(); var emailService = ServiceContainer.LoadService <IEmailSender>(configuration); var sender = new JobAlertsByEmailSender(alertSettings, new HtmlJobAlertFormatter(alertSettings, encoder), emailService); // Get them, sort them and send them _log.Info($"Requesting jobs matching {jobsSet} with frequency {frequency} from Azure Storage"); var alerts = await alertsRepo.GetAlerts(new JobAlertsQuery() { Frequency = frequency, JobsSet = jobsSet }); var alertsGroupedByEmail = GroupAlertsByEmail(alerts); _log.Info($"{alerts.Count()} alerts found for {alertsGroupedByEmail.Count()} email addresses"); foreach (var alertsForAnEmail in alertsGroupedByEmail) { foreach (var alert in alertsForAnEmail) { var jobsSentForThisEmail = forceResend ? new List <int>() : await alertsRepo.GetJobsSentForEmail(alert.JobsSet, alert.Email); await LookupJobsForAlert(jobsProvider, alert, jobsSentForThisEmail); } } _log.Info("Sending alerts"); await sender.SendGroupedAlerts(alertsGroupedByEmail, alertsRepo); }
private static async Task <SimpleDataSet> CreateDataSetFromLookup(int fakeNodeId, string indexType, string group, JobSearchQuery query, JobsLookupValue lookupValue, IJobsDataProvider jobsDataProvider) { var simpleDataSet = new SimpleDataSet { NodeDefinition = new IndexedNode(), RowData = new Dictionary <string, string>() }; simpleDataSet.NodeDefinition.NodeId = fakeNodeId; simpleDataSet.NodeDefinition.Type = indexType; simpleDataSet.RowData.Add("id", lookupValue.Id); simpleDataSet.RowData.Add("group", group); simpleDataSet.RowData.Add("text", lookupValue.Text); if (jobsDataProvider != null) { var jobs = await jobsDataProvider.ReadJobs(query); simpleDataSet.RowData.Add("count", jobs.Count.ToString(CultureInfo.CurrentCulture)); } return(simpleDataSet); }
private static async Task <IEnumerable <SimpleDataSet> > CreateDataSetFromLookupValues(string indexType, string groupKey, int fakeNodeId, IList <JobsLookupValue> lookupValues, Action <JobsLookupValue, JobSearchQuery> addLookupToQuery, IJobsDataProvider jobsDataProvider) { var dataSets = new List <SimpleDataSet>(); if (lookupValues != null) { foreach (var lookupValue in lookupValues) { JobSearchQuery query = null; if (addLookupToQuery != null) { query = new JobSearchQuery(); addLookupToQuery(lookupValue, query); query.ClosingDateFrom = DateTime.Today; } var simpleDataSet = new SimpleDataSet { NodeDefinition = new IndexedNode(), RowData = new Dictionary <string, string>() }; simpleDataSet.NodeDefinition.NodeId = fakeNodeId; simpleDataSet.NodeDefinition.Type = indexType; simpleDataSet.RowData.Add("id", lookupValue.LookupValueId); simpleDataSet.RowData.Add("group", groupKey); simpleDataSet.RowData.Add("text", lookupValue.Text); if (jobsDataProvider != null) { var jobs = await jobsDataProvider.ReadJobs(query).ConfigureAwait(false); simpleDataSet.RowData.Add("count", jobs.TotalJobs.ToString(CultureInfo.CurrentCulture)); } dataSets.Add(simpleDataSet); fakeNodeId++; } } return(dataSets); }