Ejemplo n.º 1
0
        private async Task UpdatePullRequestCommentReactions(IGitHubActor ghc, DataUpdater updater, ISet <long> knownPullRequestCommentIds)
        {
            IDictionary <long, GitHubMetadata> prcReactionMetadata = null;

            using (var context = _contextFactory.CreateInstance()) {
                prcReactionMetadata = await context.PullRequestComments
                                      .AsNoTracking()
                                      .Where(x => x.IssueId == _issueId)
                                      .ToDictionaryAsync(x => x.Id, x => x.ReactionMetadata);
            }

            if (prcReactionMetadata.Any())
            {
                var prcReactionRequests = new Dictionary <long, Task <GitHubResponse <IEnumerable <gm.Reaction> > > >();
                foreach (var reactionMetadata in prcReactionMetadata)
                {
                    if (reactionMetadata.Value.IsExpired())
                    {
                        prcReactionRequests.Add(reactionMetadata.Key, ghc.PullRequestCommentReactions(_repoFullName, reactionMetadata.Key, reactionMetadata.Value, RequestPriority.Interactive));
                    }
                }

                if (prcReactionRequests.Any())
                {
                    await Task.WhenAll(prcReactionRequests.Values);

                    foreach (var prcReactionsResponse in prcReactionRequests)
                    {
                        var resp = await prcReactionsResponse.Value;
                        switch (resp.Status)
                        {
                        case HttpStatusCode.NotModified:
                            break;

                        case HttpStatusCode.NotFound:
                            // knownPullRequestCommentIds can be null
                            if (knownPullRequestCommentIds?.Contains(prcReactionsResponse.Key) != true)
                            {
                                // null or false
                                await updater.DeletePullRequestComment(prcReactionsResponse.Key, resp.Date);
                            }
                            break;

                        default:
                            await updater.UpdatePullRequestCommentReactions(_repoId, resp.Date, prcReactionsResponse.Key, resp.Result);

                            break;
                        }
                        using (var context = _contextFactory.CreateInstance()) {
                            await context.UpdateMetadata("PullRequestComments", "ReactionMetadataJson", prcReactionsResponse.Key, resp);
                        }
                    }
                }
            }
        }