Example #1
0
        async Task <(RepositoryViewsResponseModel?ViewsResponse, RepositoryClonesResponseModel?ClonesResponse, StarGazers?StarGazerResponse)> GetRepositoryStatistics(Repository repository, CancellationToken cancellationToken)
        {
            var getViewStatisticsTask  = _gitHubApiV3Service.GetRepositoryViewStatistics(repository.OwnerLogin, repository.Name, cancellationToken);
            var getCloneStatisticsTask = _gitHubApiV3Service.GetRepositoryCloneStatistics(repository.OwnerLogin, repository.Name, cancellationToken);
            var getStarGazrsTask       = _gitHubGraphQLApiService.GetStarGazers(repository.Name, repository.OwnerLogin, cancellationToken);

            try
            {
                await Task.WhenAll(getViewStatisticsTask, getCloneStatisticsTask, getStarGazrsTask).ConfigureAwait(false);

                return(await getViewStatisticsTask.ConfigureAwait(false),
                       await getCloneStatisticsTask.ConfigureAwait(false),
                       await getStarGazrsTask.ConfigureAwait(false));
            }
            catch (ApiException e) when(e.StatusCode is System.Net.HttpStatusCode.Forbidden)
            {
                _analyticsService.Report(e, new Dictionary <string, string>
                {
                    { nameof(Repository) + nameof(Repository.Name), repository.Name },
                    { nameof(Repository) + nameof(Repository.OwnerLogin), repository.OwnerLogin },
                    { nameof(GitHubUserService) + nameof(GitHubUserService.Alias), _gitHubUserService.Alias },
                    { nameof(GitHubUserService) + nameof(GitHubUserService.Name), _gitHubUserService.Name },
                });

                return(null, null, null);
            }
        }
        public async IAsyncEnumerable <Repository> UpdateRepositoriesWithViewsClonesAndStarsData(IReadOnlyList <Repository> repositories, [EnumeratorCancellation] CancellationToken cancellationToken)
        {
            var getRepositoryStatisticsTaskList = new List <Task <(RepositoryViewsResponseModel?, RepositoryClonesResponseModel?, StarGazers?)> >(repositories.Select(x => GetRepositoryStatistics(x, cancellationToken)));

            while (getRepositoryStatisticsTaskList.Any())
            {
                var completedStatisticsTask = await Task.WhenAny(getRepositoryStatisticsTaskList).ConfigureAwait(false);

                getRepositoryStatisticsTaskList.Remove(completedStatisticsTask);

                var(viewsResponse, clonesResponse, starGazers) = await completedStatisticsTask.ConfigureAwait(false);

                if (viewsResponse != null && clonesResponse != null && starGazers != null)
                {
                    var updatedRepository = repositories.Single(x => x.Name == viewsResponse.RepositoryName) with
                    {
                        DailyViewsList  = viewsResponse.DailyViewsList,
                        DailyClonesList = clonesResponse.DailyClonesList,
                        StarredAt       = starGazers.StarredAt.Select(x => x.StarredAt).ToList()
                    };

                    yield return(updatedRepository);
                }
            }
        }

        async Task <(RepositoryViewsResponseModel?ViewsResponse, RepositoryClonesResponseModel?ClonesResponse, StarGazers?StarGazerResponse)> GetRepositoryStatistics(Repository repository, CancellationToken cancellationToken)
        {
            var getStarGazrsTask       = _gitHubGraphQLApiService.GetStarGazers(repository.Name, repository.OwnerLogin, cancellationToken);
            var getViewStatisticsTask  = _gitHubApiV3Service.GetRepositoryViewStatistics(repository.OwnerLogin, repository.Name, cancellationToken);
            var getCloneStatisticsTask = _gitHubApiV3Service.GetRepositoryCloneStatistics(repository.OwnerLogin, repository.Name, cancellationToken);

            try
            {
                await Task.WhenAll(getViewStatisticsTask, getCloneStatisticsTask, getStarGazrsTask).ConfigureAwait(false);

                return(await getViewStatisticsTask.ConfigureAwait(false),
                       await getCloneStatisticsTask.ConfigureAwait(false),
                       await getStarGazrsTask.ConfigureAwait(false));
            }
            catch (ApiException e) when(e.StatusCode is System.Net.HttpStatusCode.Forbidden)
            {
                reportException(e);

                return(null, null, null);
            }
            catch (GraphQLException <StarGazers> e) when(e.ContainsSamlOrganizationAthenticationError(out var ssoValues))
            {
                reportException(e);

                return(null, null, null);
            }

            void reportException(in Exception e)
            {
                _analyticsService.Report(e, new Dictionary <string, string>
                {
                    { nameof(Repository) + nameof(Repository.Name), repository.Name },
                    { nameof(Repository) + nameof(Repository.OwnerLogin), repository.OwnerLogin },
                    { nameof(GitHubUserService) + nameof(GitHubUserService.Alias), _gitHubUserService.Alias },
                    { nameof(GitHubUserService) + nameof(GitHubUserService.Name), _gitHubUserService.Name },
                });
            }
        }
    }
}