github.com/google/go-github/v74@v74.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  }