Ejemplo n.º 1
0
        public async static Task PerformTaskAsync(
            ScrapingTask scrapingTask,
            IGitHubClient gitHubClient,
            ITransaction tx,
            IUserRepoSearchActor userRepoSearchActor,
            IReliableConcurrentQueue <ScrapingTask> firstTaskQueue,
            IReliableConcurrentQueue <ScrapingTask> secondTaskQueue)
        {
            switch (scrapingTask.Type)
            {
            case ScrapingTaskType.Repository:
                await ScrapeRepositoryAsync(
                    scrapingTask : scrapingTask, gitHubClient : gitHubClient,
                    tx : tx, userRepoSearchActor : userRepoSearchActor,
                    secondTaskQueue : secondTaskQueue);

                break;

            case ScrapingTaskType.UserInfo:
                await ScrapeUserInfoAsync(
                    scrapingTask : scrapingTask, gitHubClient : gitHubClient,
                    tx : tx, userRepoSearchActor : userRepoSearchActor,
                    secondTaskQueue : secondTaskQueue);

                break;

            case ScrapingTaskType.FollowingRepositories:
                await ScrapeFollowingRepositoriesAsync(
                    scrapingTask : scrapingTask, gitHubClient : gitHubClient,
                    tx : tx, userRepoSearchActor : userRepoSearchActor,
                    secondTaskQueue : secondTaskQueue);

                break;
            }
        }
Ejemplo n.º 2
0
        public async Task <IActionResult> Suggest([FromBody] SearchInput input)
        {
            string gitHubAuthToken = HttpContext.Session
                                     .GetString(Constants.GIT_HUB_AUTH_TOKEN_SESSION_KEY);

            string gitHubLogin = HttpContext.Session
                                 .GetString(Constants.GIT_HUB_LOGIN_KEY);


            if (CanSearch(gitHubAuthToken, gitHubLogin))
            {
                if (string.IsNullOrWhiteSpace(input.Query))
                {
                    return(BadRequest());
                }

                IUserRepoSearchActor userRepoSearchActor = ServiceProvider
                                                           .GetUserRepoSearchActor(_context, gitHubLogin);

                SearchOutput output = await userRepoSearchActor
                                      .GetSuggestionsAsync(input);

                return(Ok(output));
            }
            else
            {
                return(Unauthorized());
            }
        }
Ejemplo n.º 3
0
        private async static Task ScrapeRepositoryAsync(
            ScrapingTask scrapingTask, IGitHubClient gitHubClient,
            ITransaction tx, IUserRepoSearchActor userRepoSearchActor,
            IReliableConcurrentQueue <ScrapingTask> secondTaskQueue)
        {
            ScheduledRepository scheduledRepository =
                scrapingTask.ScheduledRepositories[0];

            Result <Repository> result = await gitHubClient
                                         .ScrapeRepositoryAsync(
                authToken : scrapingTask.AuthToken,
                owner : scheduledRepository.Owner,
                name : scheduledRepository.Name);

            if (scrapingTask.ScheduledRepositories.Count > 1)
            {
                ScrapingTask nextScrapingTask = Serializer.DeepCopy(scrapingTask);

                nextScrapingTask.ScheduledRepositories = nextScrapingTask
                                                         .ScheduledRepositories.Skip(1).ToList();

                await secondTaskQueue.EnqueueAsync(tx, nextScrapingTask);
            }

            if (result.Success)
            {
                result.Data.IsNew = false;
                await userRepoSearchActor.SetRepositoryAsync(result.Data);
            }
        }
Ejemplo n.º 4
0
        private async static Task ProcessScrapingTask(
            ScrapingTask scrapingTask,
            IGitHubClient gitHubClient,
            ITransaction tx,
            IReliableConcurrentQueue <ScrapingTask> firstTaskQueue,
            IReliableConcurrentQueue <ScrapingTask> secondTaskQueue,
            IUserRepoSearchActorProvider userRepoSearchActorProvider)
        {
            IUserRepoSearchActor userRepoSearchActor =
                userRepoSearchActorProvider.Provide(scrapingTask.UserLogin);

            await Scraper.PerformTaskAsync(
                scrapingTask : scrapingTask, gitHubClient : gitHubClient,
                tx : tx, userRepoSearchActor : userRepoSearchActor,
                firstTaskQueue : firstTaskQueue,
                secondTaskQueue : secondTaskQueue);
        }
Ejemplo n.º 5
0
        private async static Task ScrapeUserInfoAsync(
            ScrapingTask scrapingTask, IGitHubClient gitHubClient,
            ITransaction tx, IUserRepoSearchActor userRepoSearchActor,
            IReliableConcurrentQueue <ScrapingTask> secondTaskQueue)
        {
            Result <UserInfo> result = await gitHubClient
                                       .GetUserInfoAsync(scrapingTask.AuthToken);

            if (result.Success)
            {
                await userRepoSearchActor.SetUserInfoAsync(result.Data);

                await secondTaskQueue.EnqueueAsync(tx, new ScrapingTask
                {
                    Type      = ScrapingTaskType.FollowingRepositories,
                    AuthToken = scrapingTask.AuthToken,
                    UserLogin = scrapingTask.UserLogin
                });
            }
        }
Ejemplo n.º 6
0
        public async Task <IActionResult> Perform([FromBody] SearchInput input)
        {
            string gitHubAuthToken = HttpContext.Session
                                     .GetString(Constants.GIT_HUB_AUTH_TOKEN_SESSION_KEY);

            string gitHubLogin = HttpContext.Session
                                 .GetString(Constants.GIT_HUB_LOGIN_KEY);


            if (CanSearch(gitHubAuthToken, gitHubLogin))
            {
                if (string.IsNullOrWhiteSpace(input.Query))
                {
                    return(BadRequest());
                }

                IUserRepoSearchActor userRepoSearchActor = ServiceProvider
                                                           .GetUserRepoSearchActor(_context, gitHubLogin);

                Result <SearchOutput> result = await userRepoSearchActor.SearchAsync(new SearchInput
                {
                    AuthToken = gitHubAuthToken,
                    Query     = input.Query
                });

                if (result.Success)
                {
                    return(Ok(result));
                }
                else
                {
                    return(StatusCode(StatusCodes.Status500InternalServerError, result));
                }
            }
            else
            {
                return(Unauthorized());
            }
        }
Ejemplo n.º 7
0
        private async static Task ScrapeFollowingRepositoriesAsync(
            ScrapingTask scrapingTask,
            IGitHubClient gitHubClient,
            ITransaction tx,
            IUserRepoSearchActor userRepoSearchActor,
            IReliableConcurrentQueue <ScrapingTask> secondTaskQueue)
        {
            Result <UserInfo> userInfoResult = await gitHubClient
                                               .GetUserInfoAsync(scrapingTask.AuthToken);

            if (!userInfoResult.Success)
            {
                return;
            }

            Result <IEnumerable <Repository> > repositoriesResult = await gitHubClient
                                                                    .ScrapeFollowingRepositoriesAsync(scrapingTask.AuthToken);

            if (!repositoriesResult.Success)
            {
                return;
            }

            List <ScheduledRepository> scheduledRepositories = repositoriesResult.Data.Select(
                repository => new ScheduledRepository
            {
                Name  = repository.Name,
                Owner = repository.Owner
            }).ToList();

            await secondTaskQueue.EnqueueAsync(tx, new ScrapingTask
            {
                Type                  = ScrapingTaskType.Repository,
                AuthToken             = scrapingTask.AuthToken,
                UserLogin             = scrapingTask.UserLogin,
                ScheduledRepositories = scheduledRepositories
            });
        }