github.com/secman-team/gh-api@v1.8.2/api/queries_comments.go (about)

     1  package api
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/secman-team/gh-api/core/ghrepo"
     8  	"github.com/shurcooL/githubv4"
     9  	"github.com/shurcooL/graphql"
    10  )
    11  
    12  type Comments struct {
    13  	Nodes      []Comment
    14  	TotalCount int
    15  	PageInfo   PageInfo
    16  }
    17  
    18  type Comment struct {
    19  	Author              Author
    20  	AuthorAssociation   string
    21  	Body                string
    22  	CreatedAt           time.Time
    23  	IncludesCreatedEdit bool
    24  	IsMinimized         bool
    25  	MinimizedReason     string
    26  	ReactionGroups      ReactionGroups
    27  }
    28  
    29  type PageInfo struct {
    30  	HasNextPage bool
    31  	EndCursor   string
    32  }
    33  
    34  func CommentsForIssue(client *Client, repo ghrepo.Interface, issue *Issue) (*Comments, error) {
    35  	type response struct {
    36  		Repository struct {
    37  			Issue struct {
    38  				Comments Comments `graphql:"comments(first: 100, after: $endCursor)"`
    39  			} `graphql:"issue(number: $number)"`
    40  		} `graphql:"repository(owner: $owner, name: $repo)"`
    41  	}
    42  
    43  	variables := map[string]interface{}{
    44  		"owner":     githubv4.String(repo.RepoOwner()),
    45  		"repo":      githubv4.String(repo.RepoName()),
    46  		"number":    githubv4.Int(issue.Number),
    47  		"endCursor": (*githubv4.String)(nil),
    48  	}
    49  
    50  	gql := graphQLClient(client.http, repo.RepoHost())
    51  
    52  	var comments []Comment
    53  	for {
    54  		var query response
    55  		err := gql.QueryNamed(context.Background(), "CommentsForIssue", &query, variables)
    56  		if err != nil {
    57  			return nil, err
    58  		}
    59  
    60  		comments = append(comments, query.Repository.Issue.Comments.Nodes...)
    61  		if !query.Repository.Issue.Comments.PageInfo.HasNextPage {
    62  			break
    63  		}
    64  		variables["endCursor"] = githubv4.String(query.Repository.Issue.Comments.PageInfo.EndCursor)
    65  	}
    66  
    67  	return &Comments{Nodes: comments, TotalCount: len(comments)}, nil
    68  }
    69  
    70  func CommentsForPullRequest(client *Client, repo ghrepo.Interface, pr *PullRequest) (*Comments, error) {
    71  	type response struct {
    72  		Repository struct {
    73  			PullRequest struct {
    74  				Comments Comments `graphql:"comments(first: 100, after: $endCursor)"`
    75  			} `graphql:"pullRequest(number: $number)"`
    76  		} `graphql:"repository(owner: $owner, name: $repo)"`
    77  	}
    78  
    79  	variables := map[string]interface{}{
    80  		"owner":     githubv4.String(repo.RepoOwner()),
    81  		"repo":      githubv4.String(repo.RepoName()),
    82  		"number":    githubv4.Int(pr.Number),
    83  		"endCursor": (*githubv4.String)(nil),
    84  	}
    85  
    86  	gql := graphQLClient(client.http, repo.RepoHost())
    87  
    88  	var comments []Comment
    89  	for {
    90  		var query response
    91  		err := gql.QueryNamed(context.Background(), "CommentsForPullRequest", &query, variables)
    92  		if err != nil {
    93  			return nil, err
    94  		}
    95  
    96  		comments = append(comments, query.Repository.PullRequest.Comments.Nodes...)
    97  		if !query.Repository.PullRequest.Comments.PageInfo.HasNextPage {
    98  			break
    99  		}
   100  		variables["endCursor"] = githubv4.String(query.Repository.PullRequest.Comments.PageInfo.EndCursor)
   101  	}
   102  
   103  	return &Comments{Nodes: comments, TotalCount: len(comments)}, nil
   104  }
   105  
   106  type CommentCreateInput struct {
   107  	Body      string
   108  	SubjectId string
   109  }
   110  
   111  func CommentCreate(client *Client, repoHost string, params CommentCreateInput) (string, error) {
   112  	var mutation struct {
   113  		AddComment struct {
   114  			CommentEdge struct {
   115  				Node struct {
   116  					URL string
   117  				}
   118  			}
   119  		} `graphql:"addComment(input: $input)"`
   120  	}
   121  
   122  	variables := map[string]interface{}{
   123  		"input": githubv4.AddCommentInput{
   124  			Body:      githubv4.String(params.Body),
   125  			SubjectID: graphql.ID(params.SubjectId),
   126  		},
   127  	}
   128  
   129  	gql := graphQLClient(client.http, repoHost)
   130  	err := gql.MutateNamed(context.Background(), "CommentCreate", &mutation, variables)
   131  	if err != nil {
   132  		return "", err
   133  	}
   134  
   135  	return mutation.AddComment.CommentEdge.Node.URL, nil
   136  }
   137  
   138  func commentsFragment() string {
   139  	return `comments(last: 1) {
   140  						nodes {
   141  							author {
   142  								login
   143  							}
   144  							authorAssociation
   145  							body
   146  							createdAt
   147  							includesCreatedEdit
   148  							isMinimized
   149  							minimizedReason
   150  							` + reactionGroupsFragment() + `
   151  						}
   152  						totalCount
   153  					}`
   154  }
   155  
   156  func (c Comment) AuthorLogin() string {
   157  	return c.Author.Login
   158  }
   159  
   160  func (c Comment) Association() string {
   161  	return c.AuthorAssociation
   162  }
   163  
   164  func (c Comment) Content() string {
   165  	return c.Body
   166  }
   167  
   168  func (c Comment) Created() time.Time {
   169  	return c.CreatedAt
   170  }
   171  
   172  func (c Comment) HiddenReason() string {
   173  	return c.MinimizedReason
   174  }
   175  
   176  func (c Comment) IsEdited() bool {
   177  	return c.IncludesCreatedEdit
   178  }
   179  
   180  func (c Comment) IsHidden() bool {
   181  	return c.IsMinimized
   182  }
   183  
   184  func (c Comment) Link() string {
   185  	return ""
   186  }
   187  
   188  func (c Comment) Reactions() ReactionGroups {
   189  	return c.ReactionGroups
   190  }
   191  
   192  func (c Comment) Status() string {
   193  	return ""
   194  }