/// <summary> /// Creates and queues a rank check request. /// </summary> /// <param name="rankCheckRequest">The parameters of the rank check request to create with.</param> /// <returns>The persisted rank check request.</returns> public async Task <RankCheckRequest> QueueRankCheckRequestAsync(RankCheckRequest rankCheckRequest) { rankCheckRequest.Status = RankCheckRequestStatus.InQueue; _context.RankCheckRequests.Add(rankCheckRequest); await _context.SaveChangesAsync(); _queue.QueueBackgroundWorkItem(async(token, provider) => { RankCheckRequest updatedRankCheckRequest; var context = provider.GetService <RankCheckerDbContext>(); updatedRankCheckRequest = await context.RankCheckRequests.Where(x => x.Id == rankCheckRequest.Id).FirstAsync(); updatedRankCheckRequest.Status = RankCheckRequestStatus.InProgress; context.Attach(updatedRankCheckRequest); context.Entry(updatedRankCheckRequest).Property(x => x.StatusId).IsModified = true; // Mark the specific field as modified to only update that field await context.SaveChangesAsync(); try { var scrapingRankCheckerFactory = provider.GetService <IRankCheckerFactory>(); IRankChecker rankChecker = scrapingRankCheckerFactory.CreateRankChecker(updatedRankCheckRequest); List <SearchEntry> relevantSearchEntries = await rankChecker.ExtractRankEntriesAsync(); if (relevantSearchEntries != null && relevantSearchEntries.Count > 0) { await context.SearchEntries.AddRangeAsync(relevantSearchEntries); } updatedRankCheckRequest.Status = RankCheckRequestStatus.Completed; context.Attach(updatedRankCheckRequest); context.Entry(updatedRankCheckRequest).Property(x => x.StatusId).IsModified = true; await context.SaveChangesAsync(); } catch (Exception ex) { updatedRankCheckRequest.Status = RankCheckRequestStatus.Error; updatedRankCheckRequest.ErrorMessage = ex.Message; context.Attach(updatedRankCheckRequest); context.Entry(updatedRankCheckRequest).Property(x => x.StatusId).IsModified = true; context.Entry(updatedRankCheckRequest).Property(x => x.ErrorMessage).IsModified = true; await context.SaveChangesAsync(); } }); return(rankCheckRequest); }
public void TestYahooRankChecker() { var rankCheckRequest = new RankCheckRequest() { SearchUrl = "au.search.yahoo.com/search", MaximumRecords = 100, StatusId = RankCheckRequestStatus.InQueue.Id, TermToSearch = "Online Title Search", WebsiteUrl = "www.infotrack.com.au", CreatedAt = DateTime.Now, LastUpdatedAt = DateTime.Now }; IRankCheckerFactory factory = new ScrapingRankCheckerFactory(new HttpClient()); IRankChecker rankChecker = factory.CreateRankChecker(rankCheckRequest); Assert.IsAssignableFrom <YahooScrapingRankChecker>(rankChecker); List <SearchEntry> entries = rankChecker.ExtractRankEntries(); Assert.True(entries.Count > 0); }