@@ -194,3 +194,65 @@ export async function fetchIssueTypes(token, org) {
194194 return data ?. issue_types || data ;
195195}
196196
197+ export const ISSUE_WITH_TIMELINE = `
198+ query IssueWithTimeline($owner: String!, $name: String!, $number: Int!, $after: String) {
199+ repository(owner: $owner, name: $name) {
200+ issue(number: $number) {
201+ id
202+ number
203+ title
204+ body
205+ url
206+ state
207+ createdAt
208+ closedAt
209+ repository { nameWithOwner url }
210+ assignees(first: 10) { nodes { login avatarUrl url } }
211+ labels(first: 20) { nodes { id name color } }
212+ milestone { id title url dueOn description }
213+ issueType { id name color }
214+ timelineItems(
215+ first: 50,
216+ after: $after,
217+ itemTypes: [ASSIGNED_EVENT, UNASSIGNED_EVENT, CLOSED_EVENT, REOPENED_EVENT, LABELED_EVENT, UNLABELED_EVENT, ISSUE_COMMENT]
218+ ) {
219+ nodes {
220+ __typename
221+ ... on ClosedEvent { createdAt actor { login avatarUrl url } }
222+ ... on ReopenedEvent { createdAt actor { login avatarUrl url } }
223+ ... on LabeledEvent { createdAt actor { login avatarUrl url } label { name color } }
224+ ... on UnlabeledEvent { createdAt actor { login avatarUrl url } label { name color } }
225+ ... on AssignedEvent { createdAt actor { login avatarUrl url } assignee { ... on User { login avatarUrl url } } }
226+ ... on UnassignedEvent { createdAt actor { login avatarUrl url } assignee { ... on User { login avatarUrl url } } }
227+ ... on IssueComment { id createdAt author { login avatarUrl url } body }
228+ }
229+ pageInfo { hasNextPage endCursor }
230+ }
231+ }
232+ }
233+ }
234+ ` ;
235+
236+ export async function fetchIssueWithTimeline ( token , owner , repo , number ) {
237+ let after = null ;
238+ let issue = null ;
239+ let timeline = [ ] ;
240+ while ( true ) {
241+ const data = await githubGraphQL ( token , ISSUE_WITH_TIMELINE , { owner, name : repo , number, after } ) ;
242+ const node = data ?. repository ?. issue ;
243+ if ( ! node ) break ;
244+ if ( ! issue ) {
245+ issue = { ...node } ;
246+ delete issue . timelineItems ;
247+ }
248+ const nodes = node . timelineItems ?. nodes || [ ] ;
249+ timeline = timeline . concat ( nodes ) ;
250+ if ( ! node . timelineItems ?. pageInfo ?. hasNextPage ) break ;
251+ after = node . timelineItems . pageInfo . endCursor ;
252+ }
253+ if ( issue ) {
254+ issue . timelineItems = timeline ;
255+ }
256+ return issue ;
257+ }
258+
0 commit comments