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 }, }); } } } }