Skip to content

Commit f70f5ba

Browse files
Merge pull request #22 from aws-github-ops/khushail/discussionPagination
(fix): pagination failure when too many discussions
2 parents 7e829f9 + b391652 commit f70f5ba

File tree

9 files changed

+149
-88
lines changed

9 files changed

+149
-88
lines changed

dist/GithubDiscussionClient.js

Lines changed: 4 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/generated/graphql.js

Lines changed: 12 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/index.js

Lines changed: 49 additions & 33 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/types/GithubDiscussionClient.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export declare class GithubDiscussionClient {
1313
getTotalDiscussionCount(categoryID: string): Promise<number>;
1414
getDiscussionCommentCount(discussionNum: number): Promise<number>;
1515
getCommentsMetaData(discussionNum: number, commentCount: number): Promise<DiscussionCommentConnection>;
16-
getDiscussionsMetaData(categoryID: string): Promise<DiscussionConnection>;
16+
getDiscussionsMetaData(categoryID: string, pageSize: number, afterCursor: string): Promise<DiscussionConnection>;
1717
getAnswerableDiscussionCategoryIDs(): Promise<any>;
1818
closeDiscussionAsResolved(discussionId: string): Promise<void>;
1919
closeDiscussionAsOutdated(discussionId: string): Promise<void>;

dist/types/generated/graphql.d.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38983,14 +38983,20 @@ export type GetDiscussionDataQueryVariables = Exact<{
3898338983
owner: Scalars['String'];
3898438984
name: Scalars['String'];
3898538985
categoryID: Scalars['ID'];
38986-
count: Scalars['Int'];
38986+
after?: InputMaybe<Scalars['String']>;
38987+
pageSize: Scalars['Int'];
3898738988
}>;
3898838989
export type GetDiscussionDataQuery = {
3898938990
__typename?: 'Query';
3899038991
repository?: {
3899138992
__typename?: 'Repository';
3899238993
discussions: {
3899338994
__typename?: 'DiscussionConnection';
38995+
pageInfo: {
38996+
__typename?: 'PageInfo';
38997+
hasNextPage: boolean;
38998+
endCursor?: string | null;
38999+
};
3899439000
edges?: Array<{
3899539001
__typename?: 'DiscussionEdge';
3899639002
node?: {

src/GithubDiscussionClient.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,16 @@ export class GithubDiscussionClient {
124124
return result.data.repository?.discussion?.comments as DiscussionCommentConnection;
125125
}
126126

127-
public async getDiscussionsMetaData(categoryID: string): Promise<DiscussionConnection> {
127+
public async getDiscussionsMetaData(categoryID: string, pageSize: number, afterCursor: string): Promise<DiscussionConnection> {
128128
const discussionsCount = await this.getTotalDiscussionCount(categoryID);
129129
const result = await this.githubClient.query<GetDiscussionDataQuery, GetDiscussionDataQueryVariables>({
130130
query: GetDiscussionData,
131131
variables: {
132132
owner: this.owner,
133133
name: this.repo,
134134
categoryID: categoryID,
135-
count: discussionsCount!,
135+
pageSize: pageSize,
136+
after: afterCursor,
136137
},
137138
})
138139

src/generated/graphql.ts

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41486,9 +41486,18 @@ export const GetDiscussionCount = gql`
4148641486
}
4148741487
`;
4148841488
export const GetDiscussionData = gql`
41489-
query GetDiscussionData($owner: String!, $name: String!, $categoryID: ID!, $count: Int!) {
41489+
query GetDiscussionData($owner: String!, $name: String!, $categoryID: ID!, $after: String, $pageSize: Int!) {
4149041490
repository(owner: $owner, name: $name) {
41491-
discussions(categoryId: $categoryID, last: $count) {
41491+
discussions(
41492+
categoryId: $categoryID
41493+
after: $after
41494+
first: $pageSize
41495+
orderBy: {field: UPDATED_AT, direction: DESC}
41496+
) {
41497+
pageInfo {
41498+
hasNextPage
41499+
endCursor
41500+
}
4149241501
edges {
4149341502
node {
4149441503
locked
@@ -41633,11 +41642,12 @@ export type GetDiscussionDataQueryVariables = Exact<{
4163341642
owner: Scalars['String'];
4163441643
name: Scalars['String'];
4163541644
categoryID: Scalars['ID'];
41636-
count: Scalars['Int'];
41645+
after?: InputMaybe<Scalars['String']>;
41646+
pageSize: Scalars['Int'];
4163741647
}>;
4163841648

4163941649

41640-
export type GetDiscussionDataQuery = { __typename?: 'Query', repository?: { __typename?: 'Repository', discussions: { __typename?: 'DiscussionConnection', edges?: Array<{ __typename?: 'DiscussionEdge', node?: { __typename?: 'Discussion', locked: boolean, id: string, bodyText: string, number: number, closed: boolean, author?: { __typename?: 'Bot', login: string } | { __typename?: 'EnterpriseUserAccount', login: string } | { __typename?: 'Mannequin', login: string } | { __typename?: 'Organization', login: string } | { __typename?: 'User', login: string } | null, answer?: { __typename?: 'DiscussionComment', id: string, bodyText: string } | null } | null } | null> | null } } | null };
41650+
export type GetDiscussionDataQuery = { __typename?: 'Query', repository?: { __typename?: 'Repository', discussions: { __typename?: 'DiscussionConnection', pageInfo: { __typename?: 'PageInfo', hasNextPage: boolean, endCursor?: string | null }, edges?: Array<{ __typename?: 'DiscussionEdge', node?: { __typename?: 'Discussion', locked: boolean, id: string, bodyText: string, number: number, closed: boolean, author?: { __typename?: 'Bot', login: string } | { __typename?: 'EnterpriseUserAccount', login: string } | { __typename?: 'Mannequin', login: string } | { __typename?: 'Organization', login: string } | { __typename?: 'User', login: string } | null, answer?: { __typename?: 'DiscussionComment', id: string, bodyText: string } | null } | null } | null> | null } } | null };
4164141651

4164241652
export type IsDiscussionLockedQueryVariables = Exact<{
4164341653
owner: Scalars['String'];

src/index.ts

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -33,33 +33,42 @@ export async function processDiscussions(githubClient: GithubDiscussionClient) {
3333
const discussionCategoryIDList: string[] = await githubClient.getAnswerableDiscussionCategoryIDs();
3434

3535
for (const discussionCategoryID of discussionCategoryIDList) {
36-
const discussions = await githubClient.getDiscussionsMetaData(discussionCategoryID);
37-
for (const discussion of discussions.edges!) {
38-
var discussionId = discussion?.node?.id ? discussion?.node?.id : "";
39-
var discussionNum = discussion?.node?.number ? discussion.node.number : 0;
40-
core.debug(`Processing discussionId: ${discussionId} with number: ${discussionNum} and bodyText: ${discussion?.node?.bodyText}`);
41-
if (discussionId === "" || discussionNum === 0) {
42-
core.warning(`Can not proceed checking discussion, discussionId is null!`);
43-
continue;
44-
}
45-
else if (discussion?.node?.locked && CLOSE_LOCKED_DISCUSSIONS) {
46-
core.info(`Discussion ${discussionId} is locked, closing it as resolved`);
47-
githubClient.closeDiscussionAsResolved(discussionId);
48-
continue;
49-
}
50-
else if (discussion?.node?.answer != null && CLOSE_ANSWERED_DISCUSSIONS) {
51-
core.info(`Discussion ${discussionId} is already answered, so closing it as resolved.`);
52-
githubClient.closeDiscussionAsResolved(discussionId);
53-
continue;
54-
}
55-
else if (discussion?.node?.closed) {
56-
core.debug(`Discussion ${discussionId} is closed, so no action needed.`);
57-
continue;
58-
}
59-
else {
60-
await processComments(discussion!, githubClient);
36+
const pageSize = 50;
37+
let hasNextPage = true;
38+
let afterCursor: string | null = null;
39+
40+
while (hasNextPage) {
41+
const discussions = await githubClient.getDiscussionsMetaData(discussionCategoryID, pageSize, afterCursor!);
42+
hasNextPage = discussions.pageInfo.hasNextPage;
43+
afterCursor = discussions.pageInfo.endCursor!;
44+
45+
for (const discussion of discussions.edges!) {
46+
var discussionId = discussion?.node?.id ? discussion?.node?.id : "";
47+
var discussionNum = discussion?.node?.number ? discussion.node.number : 0;
48+
core.debug(`Processing discussionId: ${discussionId} with number: ${discussionNum} and bodyText: ${discussion?.node?.bodyText}`);
49+
if (discussionId === "" || discussionNum === 0) {
50+
core.warning(`Can not proceed checking discussion, discussionId is null!`);
51+
continue;
52+
}
53+
else if (discussion?.node?.locked && CLOSE_LOCKED_DISCUSSIONS) {
54+
core.info(`Discussion ${discussionId} is locked, closing it as resolved`);
55+
githubClient.closeDiscussionAsResolved(discussionId);
56+
continue;
57+
}
58+
else if (discussion?.node?.answer != null && CLOSE_ANSWERED_DISCUSSIONS) {
59+
core.info(`Discussion ${discussionId} is already answered, so closing it as resolved.`);
60+
githubClient.closeDiscussionAsResolved(discussionId);
61+
continue;
62+
}
63+
else if (discussion?.node?.closed) {
64+
core.debug(`Discussion ${discussionId} is closed, so no action needed.`);
65+
continue;
66+
}
67+
else {
68+
await processComments(discussion!, githubClient);
69+
}
6170
}
62-
};
71+
}
6372
}
6473
}
6574

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,31 @@
1-
query GetDiscussionData($owner: String!, $name: String!,$categoryID: ID!, $count: Int!) {
1+
query GetDiscussionData($owner: String!, $name: String!,$categoryID: ID!, $after: String, $pageSize: Int! ) {
22
repository(owner: $owner, name: $name) {
3-
discussions(categoryId: $categoryID last:$count) {
4-
edges {
5-
node {
6-
locked
7-
id
8-
bodyText
9-
number
10-
closed
11-
author{
12-
login
13-
}
14-
answer{
3+
discussions(
4+
categoryId: $categoryID,
5+
after: $after,
6+
first: $pageSize,
7+
orderBy: { field: UPDATED_AT, direction: DESC}
8+
) {
9+
pageInfo {
10+
hasNextPage
11+
endCursor
12+
}
13+
edges {
14+
node {
15+
locked
1516
id
1617
bodyText
18+
number
19+
closed
20+
author{
21+
login
22+
}
23+
answer{
24+
id
25+
bodyText
26+
}
1727
}
1828
}
1929
}
2030
}
21-
}
22-
}
31+
}

0 commit comments

Comments
 (0)