Commit 89aa0e8

Anton Medvedev <anton@medv.io>
2024-07-07 10:47:03
Add issue-comments.ts and discussion-comments.ts
1 parent 712767d
src/collect/collect.ts
@@ -6,6 +6,10 @@ import { userQuery, UserQuery } from './user.js'
 import { IssueTimelineQuery, issueTimelineQuery } from './issue-timeline.js'
 import { Data } from './types.js'
 import { issueCommentsQuery, IssueCommentsQuery } from './issue-comments.js'
+import {
+  discussionCommentsQuery,
+  DiscussionCommentsQuery,
+} from './discussion-comments.js'
 
 export async function collect(
   octokit: Octokit,
@@ -21,6 +25,7 @@ export async function collect(
     pulls: [],
     issues: [],
     issueComments: [],
+    discussionComments: [],
   }
 
   const repos = octokit.paginate.iterator('GET /users/{username}/repos', {
@@ -173,5 +178,26 @@ export async function collect(
     console.error(err)
   }
 
+  const discussionComments =
+    octokit.graphql.paginate.iterator<DiscussionCommentsQuery>(
+      discussionCommentsQuery,
+      {
+        login: username,
+      },
+    )
+  try {
+    for await (const resp of discussionComments) {
+      for (const comment of resp.user.repositoryDiscussionComments.nodes) {
+        data.discussionComments.push(comment)
+      }
+      console.log(
+        `| discussion comments ${data.discussionComments.length}/${resp.user.repositoryDiscussionComments.totalCount} (cost: ${resp.rateLimit.cost}, remaining: ${resp.rateLimit.remaining})`,
+      )
+    }
+  } catch (err) {
+    console.error(`Failed to load discussion comments`)
+    console.error(err)
+  }
+
   return data
 }
src/collect/discussion-comments.ts
@@ -0,0 +1,103 @@
+export const discussionCommentsQuery = `#graphql
+query DiscussionCommentsQuery($login: String!, $num: Int = 100, $cursor: String) {
+  user(login: $login) {
+    repositoryDiscussionComments(first: $num, after: $cursor) {
+      totalCount
+      nodes {
+        author {
+          login
+        }
+        discussion {
+          number
+          repository {
+            nameWithOwner
+          }
+          author {
+            login
+          }
+        }
+        body
+        createdAt
+        updatedAt
+        editor {
+          login
+        }
+        reactions(first: 100) {
+          totalCount
+          nodes {
+            content
+            user {
+              login
+            }
+          }
+        }
+      }
+      pageInfo {
+        hasNextPage
+        endCursor
+      }
+    }
+  }
+  rateLimit {
+    limit
+    cost
+    remaining
+    resetAt
+  }
+}
+`
+
+export type DiscussionCommentsQuery = {
+  user: {
+    repositoryDiscussionComments: {
+      totalCount: number
+      nodes: Array<{
+        author: {
+          login: string
+        }
+        discussion: {
+          number: number
+          repository: {
+            nameWithOwner: string
+          }
+          author: {
+            login: string
+          }
+        }
+        body: string
+        createdAt: string
+        updatedAt: string
+        editor: {
+          login: string
+        } | null
+        reactions: {
+          totalCount: number
+          nodes: Array<{
+            content:
+              | 'CONFUSED'
+              | 'EYES'
+              | 'HEART'
+              | 'HOORAY'
+              | 'LAUGH'
+              | 'ROCKET'
+              | 'THUMBS_DOWN'
+              | 'THUMBS_UP'
+            user: {
+              login: string
+            }
+          }>
+        }
+      }>
+      pageInfo: {
+        hasNextPage: boolean
+        endCursor: string
+      }
+    }
+  }
+  rateLimit: {
+    limit: number
+    cost: number
+    remaining: number
+    resetAt: string
+  }
+}
src/collect/issue-comments.ts
@@ -4,6 +4,9 @@ query IssueCommentsQuery($login: String!, $num: Int = 100, $cursor: String) {
     issueComments(first: $num, after: $cursor) {
       totalCount
       nodes {
+        author {
+          login
+        }
         repository {
           nameWithOwner
         }
@@ -49,6 +52,9 @@ export type IssueCommentsQuery = {
     issueComments: {
       totalCount: number
       nodes: Array<{
+        author: {
+          login: string
+        }
         repository: {
           nameWithOwner: string
         }
src/collect/types.ts
@@ -4,6 +4,7 @@ import { IssuesQuery } from './issues.js'
 import { UserQuery } from './user.js'
 import { PullsQuery } from './pulls.js'
 import { IssueCommentsQuery } from './issue-comments.js'
+import { DiscussionCommentsQuery } from './discussion-comments.js'
 
 // Extra<T> represents additional data that is not returned by the GraphQL API,
 // but enriched by some other means (e.g., separate queries).
@@ -15,6 +16,7 @@ export type Data = {
   pulls: Pull[]
   issues: Issue[]
   issueComments: IssueComment[]
+  discussionComments: DiscussionComment[]
 }
 
 export type User = UserQuery['user']
@@ -33,3 +35,6 @@ export type Issue = IssuesQuery['user']['issues']['nodes'][0]
 
 export type IssueComment =
   IssueCommentsQuery['user']['issueComments']['nodes'][0]
+
+export type DiscussionComment =
+  DiscussionCommentsQuery['user']['repositoryDiscussionComments']['nodes'][0]