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 }