protected async Task <EventHandlerResult> processComment(ICommentPayload <T> webhookPayload) { var gradeCommand = new GradeCommentParser(webhookPayload.CommentBody); if (gradeCommand.IsMatch) { if (!await isAllowed(webhookPayload)) { return(await handleUserNotAllowed(webhookPayload)); } var pr = await getPullRequest(webhookPayload); if (pr == null) { return(await handleNotPr(webhookPayload)); } await handleApprove(webhookPayload, pr); await handleStoreGrade(webhookPayload, gradeCommand, pr); await handleReaction(webhookPayload, ReactionType.Plus1); return(EventHandlerResult.ActionPerformed($"comment operation to grade done; grades: {string.Join(" ", gradeCommand.Grades)}")); } else { return(EventHandlerResult.NoActionNeeded("not recognized as command")); } }
private async Task handleStoreGrade(ICommentPayload <T> webhookPayload, GradeCommentParser gradeCommand, PullRequest pr) { var neptun = await getNeptun(webhookPayload.Repository.Id, pr.Head.Ref); Logger.LogInformation($"storing grades for {neptun}"); if (gradeCommand.HasGrades) { await gradeStore.StoreGrade( neptun : neptun, repository : webhookPayload.Repository.FullName, prNumber : pr.Number, prUrl : pr.HtmlUrl, actor : webhookPayload.CommentingUser, origin : webhookPayload.CommentHtmlUrl, results : gradeCommand.Grades); } else { await gradeStore.ConfirmAutoGrade( neptun : neptun, repository : webhookPayload.Repository.FullName, prNumber : pr.Number, prUrl : pr.HtmlUrl, actor : webhookPayload.CommentingUser, origin : webhookPayload.CommentHtmlUrl); } }
private async Task <EventHandlerResult> handleUserNotAllowed(ICommentPayload <T> webhookPayload) { await handleReaction(webhookPayload, ReactionType.Confused); var comment = WarningText.Replace("{}", webhookPayload.CommentingUser, StringComparison.OrdinalIgnoreCase); await GitHubClient.Issue.Comment.Create(webhookPayload.Repository.Id, webhookPayload.PullRequestNumber, comment); return(EventHandlerResult.ActionPerformed("comment operation to grade not allowed for user")); }
protected async Task <PullRequest> getPullRequest(ICommentPayload <T> webhookPayload) { try { return(await GitHubClient.PullRequest.Get(webhookPayload.Repository.Id, webhookPayload.PullRequestNumber)); } catch (NotFoundException) { return(null); } }
protected override Task handleReaction(ICommentPayload <PullRequestReviewEventPayload> webhookPayload, ReactionType reactionType) { // The implementation below does not work, GitHub API returns an error indicating that the resource is not available for the GitHub App // According to documentation "pull request" read/write permission should be enough to add the reaction, but it seems insufficient. return(Task.CompletedTask); /* * // discrepancy in the Octokit library regarding long-int ids * if (webhookPayload.Payload.Review.Id > int.MaxValue) * return Task.CompletedTask; * * return GitHubClient.Reaction.PullRequestReviewComment.Create(webhookPayload.Repository.Id, (int)webhookPayload.Payload.Review.Id, new NewReaction(reactionType)); */ }
private Task <bool> isAllowed(ICommentPayload <T> webhookPayload) { if (webhookPayload.Repository.Owner.Type != AccountType.Organization) { return(Task.FromResult(false)); } return(isOrgMemberCache.GetOrCreateAsync( key: $"githubisorgmember{webhookPayload.Repository.Owner.Login}{webhookPayload.CommentingUser}", factory: async cacheEntry => { var isMember = await getIsUserOrgMember(webhookPayload.Repository.Owner.Login, webhookPayload.CommentingUser); cacheEntry.SetValue(isMember); cacheEntry.SetAbsoluteExpiration(TimeSpan.FromHours(1)); return isMember; })); }
private async Task handleApprove(ICommentPayload <T> webhookPayload, PullRequest pr) { bool shouldMergePr = pr.State.Value == ItemState.Open && pr.Mergeable == true; if (shouldMergePr) { Logger.LogInformation("PR is being merged"); await GitHubClient.PullRequest.Review.Create(webhookPayload.Repository.Id, webhookPayload.PullRequestNumber, new PullRequestReviewCreate() { Event = PullRequestReviewEvent.Approve }); await GitHubClient.PullRequest.Merge(webhookPayload.Repository.Id, webhookPayload.PullRequestNumber, new MergePullRequest()); } else { Logger.LogInformation("PR is not mergable"); } }
protected abstract Task handleReaction(ICommentPayload <T> webhookPayload, ReactionType reactionType);
private async Task <EventHandlerResult> handleNotPr(ICommentPayload <T> webhookPayload) { await handleReaction(webhookPayload, ReactionType.Confused); return(EventHandlerResult.ActionPerformed("comment operation to grade not called for PR")); }
protected override Task handleReaction(ICommentPayload <IssueCommentPayload> webhookPayload, ReactionType reactionType) => GitHubClient.Reaction.IssueComment.Create(webhookPayload.Repository.Id, webhookPayload.Payload.Comment.Id, new NewReaction(reactionType));