Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 20 additions & 10 deletions src/plus/integrations/providers/jira.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import { IssueFilter, providersMetadata, toAccount, toSearchedIssue } from './mo

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

export interface JiraBaseDescriptor extends ResourceDescriptor {
id: string;
Expand Down Expand Up @@ -234,16 +235,25 @@ export class JiraIntegration extends IssueIntegration<IssueIntegrationId.Jira> {
const results: SearchedIssue[] = [];
for (const resource of myResources) {
try {
const userLogin = (await this.getProviderAccountForResource(session, resource))?.username;
const resourceIssues = await api.getIssuesForResourceForCurrentUser(this.id, resource.id, {
accessToken: session.accessToken,
});
const formattedIssues = resourceIssues
?.map(issue => toSearchedIssue(issue, this, undefined, userLogin))
.filter((result): result is SearchedIssue => result != null);
if (formattedIssues != null) {
results.push(...formattedIssues);
}
const userLogin = (await this.getProviderAccountForResource(session, resource))?.username;
let cursor = undefined;
let hasMore = false;
let requestCount = 0;
do {
const resourceIssues = await api.getIssuesForResourceForCurrentUser(this.id, resource.id, {
accessToken: session.accessToken,
cursor: cursor,
});
requestCount += 1;
hasMore = resourceIssues.paging?.more ?? false;
cursor = resourceIssues.paging?.cursor;
const formattedIssues = resourceIssues.values
.map(issue => toSearchedIssue(issue, this, undefined, userLogin))
.filter((result): result is SearchedIssue => result != null);
if (formattedIssues.length > 0) {
results.push(...formattedIssues);
}
} while (requestCount < maxPagesPerRequest && hasMore);
} catch (ex) {
// TODO: We need a better way to message the failure to the user here.
// This is a stopgap to prevent one bag org from throwing and preventing any issues from being returned.
Expand Down
63 changes: 32 additions & 31 deletions src/plus/integrations/providers/providersApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ export class ProvidersApi {
}

async getPagedResult<T>(
_provider: ProviderInfo,
provider: ProviderInfo,
args: any,
providerFn:
| ((
Expand Down Expand Up @@ -372,27 +372,31 @@ export class ProvidersApi {
...cursorOrPage,
};

const result = await providerFn?.(input, { token: token, isPAT: usePAT });
if (result == null) {
return { values: [] };
}
try {
const result = await providerFn?.(input, { token: token, isPAT: usePAT });
if (result == null) {
return { values: [] };
}

const hasMore = result.pageInfo?.hasNextPage ?? false;
const hasMore = result.pageInfo?.hasNextPage ?? false;

let nextCursor = '{}';
if (result.pageInfo?.endCursor != null) {
nextCursor = JSON.stringify({ value: result.pageInfo?.endCursor, type: 'cursor' });
} else if (result.pageInfo?.nextPage != null) {
nextCursor = JSON.stringify({ value: result.pageInfo?.nextPage, type: 'page' });
}
let nextCursor = '{}';
if (result.pageInfo?.endCursor != null) {
nextCursor = JSON.stringify({ value: result.pageInfo?.endCursor, type: 'cursor' });
} else if (result.pageInfo?.nextPage != null) {
nextCursor = JSON.stringify({ value: result.pageInfo?.nextPage, type: 'page' });
}

return {
values: result.data,
paging: {
cursor: nextCursor,
more: hasMore,
},
};
return {
values: result.data,
paging: {
cursor: nextCursor,
more: hasMore,
},
};
} catch (e) {
return this.handleProviderError<PagedResult<T>>(provider.id, token, e);
}
}

async getCurrentUser(
Expand Down Expand Up @@ -784,24 +788,21 @@ export class ProvidersApi {
async getIssuesForResourceForCurrentUser(
providerId: IntegrationId,
resourceId: string,
options?: { accessToken?: string },
): Promise<ProviderIssue[] | undefined> {
options?: { accessToken?: string; cursor?: string },
): Promise<PagedResult<ProviderIssue>> {
const { provider, token } = await this.ensureProviderTokenAndFunction(
providerId,
'getIssuesForResourceForCurrentUserFn',
options?.accessToken,
);

try {
const result = await provider.getIssuesForResourceForCurrentUserFn?.(
{ resourceId: resourceId },
{ token: token },
);

return result?.data;
} catch (e) {
return this.handleProviderError<ProviderIssue[] | undefined>(providerId, token, e);
}
return this.getPagedResult<ProviderIssue>(
provider,
{ resourceId: resourceId },
provider.getIssuesForResourceForCurrentUserFn,
token,
options?.cursor,
);
}

async getIssue(
Expand Down
Loading