Skip to content

Commit 7695189

Browse files
Utilizes paging to get more Jira issues
# Conflicts: # src/plus/integrations/providers/jira.ts
1 parent 3b4e917 commit 7695189

File tree

2 files changed

+52
-41
lines changed

2 files changed

+52
-41
lines changed

src/plus/integrations/providers/jira.ts

Lines changed: 20 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import { IssueFilter, providersMetadata, toAccount, toSearchedIssue } from './mo
1212

1313
const metadata = providersMetadata[IssueIntegrationId.Jira];
1414
const authProvider = Object.freeze({ id: metadata.id, scopes: metadata.scopes });
15+
const maxPagesPerRequest = 10;
1516

1617
export interface JiraBaseDescriptor extends ResourceDescriptor {
1718
id: string;
@@ -234,16 +235,25 @@ export class JiraIntegration extends IssueIntegration<IssueIntegrationId.Jira> {
234235
const results: SearchedIssue[] = [];
235236
for (const resource of myResources) {
236237
try {
237-
const userLogin = (await this.getProviderAccountForResource(session, resource))?.username;
238-
const resourceIssues = await api.getIssuesForResourceForCurrentUser(this.id, resource.id, {
239-
accessToken: session.accessToken,
240-
});
241-
const formattedIssues = resourceIssues
242-
?.map(issue => toSearchedIssue(issue, this, undefined, userLogin))
243-
.filter((result): result is SearchedIssue => result != null);
244-
if (formattedIssues != null) {
245-
results.push(...formattedIssues);
246-
}
238+
const userLogin = (await this.getProviderAccountForResource(session, resource))?.username;
239+
let cursor = undefined;
240+
let hasMore = false;
241+
let requestCount = 0;
242+
do {
243+
const resourceIssues = await api.getIssuesForResourceForCurrentUser(this.id, resource.id, {
244+
accessToken: session.accessToken,
245+
cursor: cursor,
246+
});
247+
requestCount += 1;
248+
hasMore = resourceIssues.paging?.more ?? false;
249+
cursor = resourceIssues.paging?.cursor;
250+
const formattedIssues = resourceIssues.values
251+
.map(issue => toSearchedIssue(issue, this, undefined, userLogin))
252+
.filter((result): result is SearchedIssue => result != null);
253+
if (formattedIssues.length > 0) {
254+
results.push(...formattedIssues);
255+
}
256+
} while (requestCount < maxPagesPerRequest && hasMore);
247257
} catch (ex) {
248258
// TODO: We need a better way to message the failure to the user here.
249259
// This is a stopgap to prevent one bag org from throwing and preventing any issues from being returned.

src/plus/integrations/providers/providersApi.ts

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ export class ProvidersApi {
340340
}
341341

342342
async getPagedResult<T>(
343-
_provider: ProviderInfo,
343+
provider: ProviderInfo,
344344
args: any,
345345
providerFn:
346346
| ((
@@ -372,27 +372,31 @@ export class ProvidersApi {
372372
...cursorOrPage,
373373
};
374374

375-
const result = await providerFn?.(input, { token: token, isPAT: usePAT });
376-
if (result == null) {
377-
return { values: [] };
378-
}
375+
try {
376+
const result = await providerFn?.(input, { token: token, isPAT: usePAT });
377+
if (result == null) {
378+
return { values: [] };
379+
}
379380

380-
const hasMore = result.pageInfo?.hasNextPage ?? false;
381+
const hasMore = result.pageInfo?.hasNextPage ?? false;
381382

382-
let nextCursor = '{}';
383-
if (result.pageInfo?.endCursor != null) {
384-
nextCursor = JSON.stringify({ value: result.pageInfo?.endCursor, type: 'cursor' });
385-
} else if (result.pageInfo?.nextPage != null) {
386-
nextCursor = JSON.stringify({ value: result.pageInfo?.nextPage, type: 'page' });
387-
}
383+
let nextCursor = '{}';
384+
if (result.pageInfo?.endCursor != null) {
385+
nextCursor = JSON.stringify({ value: result.pageInfo?.endCursor, type: 'cursor' });
386+
} else if (result.pageInfo?.nextPage != null) {
387+
nextCursor = JSON.stringify({ value: result.pageInfo?.nextPage, type: 'page' });
388+
}
388389

389-
return {
390-
values: result.data,
391-
paging: {
392-
cursor: nextCursor,
393-
more: hasMore,
394-
},
395-
};
390+
return {
391+
values: result.data,
392+
paging: {
393+
cursor: nextCursor,
394+
more: hasMore,
395+
},
396+
};
397+
} catch (e) {
398+
return this.handleProviderError<PagedResult<T>>(provider.id, token, e);
399+
}
396400
}
397401

398402
async getCurrentUser(
@@ -784,24 +788,21 @@ export class ProvidersApi {
784788
async getIssuesForResourceForCurrentUser(
785789
providerId: IntegrationId,
786790
resourceId: string,
787-
options?: { accessToken?: string },
788-
): Promise<ProviderIssue[] | undefined> {
791+
options?: { accessToken?: string; cursor?: string },
792+
): Promise<PagedResult<ProviderIssue>> {
789793
const { provider, token } = await this.ensureProviderTokenAndFunction(
790794
providerId,
791795
'getIssuesForResourceForCurrentUserFn',
792796
options?.accessToken,
793797
);
794798

795-
try {
796-
const result = await provider.getIssuesForResourceForCurrentUserFn?.(
797-
{ resourceId: resourceId },
798-
{ token: token },
799-
);
800-
801-
return result?.data;
802-
} catch (e) {
803-
return this.handleProviderError<ProviderIssue[] | undefined>(providerId, token, e);
804-
}
799+
return this.getPagedResult<ProviderIssue>(
800+
provider,
801+
{ resourceId: resourceId },
802+
provider.getIssuesForResourceForCurrentUserFn,
803+
token,
804+
options?.cursor,
805+
);
805806
}
806807

807808
async getIssue(

0 commit comments

Comments
 (0)