예제 #1
0
        /// <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);
        }