github.com/google/go-github/v71@v71.0.0/github/pulls_reviewers.go (about) 1 // Copyright 2017 The go-github AUTHORS. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 package github 7 8 import ( 9 "context" 10 "fmt" 11 ) 12 13 // ReviewersRequest specifies users and teams for a pull request review request. 14 type ReviewersRequest struct { 15 NodeID *string `json:"node_id,omitempty"` 16 Reviewers []string `json:"reviewers,omitempty"` 17 TeamReviewers []string `json:"team_reviewers,omitempty"` 18 } 19 20 // Reviewers represents reviewers of a pull request. 21 type Reviewers struct { 22 Users []*User `json:"users,omitempty"` 23 Teams []*Team `json:"teams,omitempty"` 24 } 25 26 type removeReviewersRequest struct { 27 NodeID *string `json:"node_id,omitempty"` 28 // Note the lack of omitempty! See comment in RemoveReviewers. 29 Reviewers []string `json:"reviewers"` 30 TeamReviewers []string `json:"team_reviewers,omitempty"` 31 } 32 33 // RequestReviewers creates a review request for the provided reviewers for the specified pull request. 34 // 35 // GitHub API docs: https://docs.github.com/rest/pulls/review-requests#request-reviewers-for-a-pull-request 36 // 37 //meta:operation POST /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers 38 func (s *PullRequestsService) RequestReviewers(ctx context.Context, owner, repo string, number int, reviewers ReviewersRequest) (*PullRequest, *Response, error) { 39 u := fmt.Sprintf("repos/%s/%s/pulls/%d/requested_reviewers", owner, repo, number) 40 req, err := s.client.NewRequest("POST", u, &reviewers) 41 if err != nil { 42 return nil, nil, err 43 } 44 45 r := new(PullRequest) 46 resp, err := s.client.Do(ctx, req, r) 47 if err != nil { 48 return nil, resp, err 49 } 50 51 return r, resp, nil 52 } 53 54 // ListReviewers lists reviewers whose reviews have been requested on the specified pull request. 55 // 56 // GitHub API docs: https://docs.github.com/rest/pulls/review-requests#get-all-requested-reviewers-for-a-pull-request 57 // 58 //meta:operation GET /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers 59 func (s *PullRequestsService) ListReviewers(ctx context.Context, owner, repo string, number int, opts *ListOptions) (*Reviewers, *Response, error) { 60 u := fmt.Sprintf("repos/%v/%v/pulls/%d/requested_reviewers", owner, repo, number) 61 u, err := addOptions(u, opts) 62 if err != nil { 63 return nil, nil, err 64 } 65 66 req, err := s.client.NewRequest("GET", u, nil) 67 if err != nil { 68 return nil, nil, err 69 } 70 71 reviewers := new(Reviewers) 72 resp, err := s.client.Do(ctx, req, reviewers) 73 if err != nil { 74 return nil, resp, err 75 } 76 77 return reviewers, resp, nil 78 } 79 80 // RemoveReviewers removes the review request for the provided reviewers for the specified pull request. 81 // 82 // GitHub API docs: https://docs.github.com/rest/pulls/review-requests#remove-requested-reviewers-from-a-pull-request 83 // 84 //meta:operation DELETE /repos/{owner}/{repo}/pulls/{pull_number}/requested_reviewers 85 func (s *PullRequestsService) RemoveReviewers(ctx context.Context, owner, repo string, number int, reviewers ReviewersRequest) (*Response, error) { 86 // reviewers.Reviewers may be empty if the caller wants to remove teams, but not users. Unlike AddReviewers, 87 // "reviewers" is a required param here. Reference: https://github.com/google/go-github/issues/3336 88 // The type `removeReviewersRequest` is required because the struct tags are different from `ReviewersRequest`. 89 removeRequest := removeReviewersRequest(reviewers) 90 91 if removeRequest.Reviewers == nil { 92 // GitHub accepts the empty list, but rejects null. Removing `omitempty` is not enough - we also have to promote nil to []. 93 removeRequest.Reviewers = []string{} 94 } 95 96 u := fmt.Sprintf("repos/%s/%s/pulls/%d/requested_reviewers", owner, repo, number) 97 req, err := s.client.NewRequest("DELETE", u, &removeRequest) 98 if err != nil { 99 return nil, err 100 } 101 102 return s.client.Do(ctx, req, nil) 103 }