Skip to content

Commit d0717da

Browse files
committed
Uses shared library for fetching authored pull requests from Bitbucket
Integrates changes from gitkraken/provider-apis-package-js#223 Solves #4128 (#4141)
1 parent e969614 commit d0717da

File tree

5 files changed

+78
-50
lines changed

5 files changed

+78
-50
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -21451,7 +21451,7 @@
2145121451
},
2145221452
"dependencies": {
2145321453
"@gitkraken/gitkraken-components": "10.7.0",
21454-
"@gitkraken/provider-apis": "0.26.2",
21454+
"@gitkraken/provider-apis": "0.26.2+??",
2145521455
"@gitkraken/shared-web-components": "0.1.1-rc.15",
2145621456
"@gk-nzaytsev/fast-string-truncated-width": "1.1.0",
2145721457
"@lit-labs/signals": "0.1.2",

src/plus/integrations/providers/bitbucket.ts

+33-17
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import type { IntegrationAuthenticationProviderDescriptor } from '../authenticat
1313
import type { ProviderAuthenticationSession } from '../authentication/models';
1414
import { HostingIntegration } from '../integration';
1515
import type { BitbucketRepositoryDescriptor, BitbucketWorkspaceDescriptor } from './bitbucket/models';
16-
import { providersMetadata } from './models';
16+
import { fromProviderPullRequest, providersMetadata } from './models';
1717

1818
const metadata = providersMetadata[HostingIntegrationId.Bitbucket];
1919
const authProvider = Object.freeze({ id: metadata.id, scopes: metadata.scopes });
@@ -218,24 +218,40 @@ export class BitbucketIntegration extends HostingIntegration<
218218
const workspaces = await this.getProviderResourcesForUser(session);
219219
if (workspaces == null || workspaces.length === 0) return undefined;
220220

221+
const providersApi = await this.getProvidersApi();
221222
const api = await this.container.bitbucket;
222-
if (!api) return undefined;
223-
224-
const authoredPrs = workspaces.map(ws =>
225-
api.getPullRequestsForWorkspaceAuthoredByUser(this, session.accessToken, user.id, ws.slug, this.apiBaseUrl),
226-
);
223+
if (!providersApi && !api) {
224+
return undefined;
225+
}
227226

228-
const reviewingPrs = workspaceRepos.map(repo => {
229-
const [owner, name] = repo.split('/');
230-
return api.getUsersReviewingPullRequestsForRepo(
231-
this,
232-
session.accessToken,
233-
user.id,
234-
owner,
235-
name,
236-
this.apiBaseUrl,
237-
);
238-
});
227+
const integration = await this.container.integrations.get(this.id);
228+
229+
const authoredPrs = providersApi
230+
? workspaces.map(async ws => {
231+
const prs = await providersApi.getBitbucketPullRequestsAuthoredByUserForWorkspace(
232+
user.id,
233+
ws.slug,
234+
{
235+
accessToken: session.accessToken,
236+
},
237+
);
238+
return prs?.map(pr => fromProviderPullRequest(pr, integration));
239+
})
240+
: [];
241+
242+
const reviewingPrs = api
243+
? workspaceRepos.map(repo => {
244+
const [owner, name] = repo.split('/');
245+
return api.getUsersReviewingPullRequestsForRepo(
246+
this,
247+
session.accessToken,
248+
user.id,
249+
owner,
250+
name,
251+
this.apiBaseUrl,
252+
);
253+
})
254+
: [];
239255

240256
return [
241257
...uniqueBy(

src/plus/integrations/providers/bitbucket/bitbucket.ts

-31
Original file line numberDiff line numberDiff line change
@@ -289,37 +289,6 @@ export class BitbucketApi implements Disposable {
289289
}
290290
}
291291

292-
async getPullRequestsForWorkspaceAuthoredByUser(
293-
provider: Provider,
294-
token: string,
295-
userUuid: string,
296-
workspace: string,
297-
baseUrl: string,
298-
): Promise<PullRequest[] | undefined> {
299-
const scope = getLogScope();
300-
301-
const response = await this.request<{
302-
values: BitbucketPullRequest[];
303-
pagelen: number;
304-
size: number;
305-
page: number;
306-
}>(
307-
provider,
308-
token,
309-
baseUrl,
310-
`workspaces/${workspace}/pullrequests/${userUuid}?state=OPEN&fields=%2Bvalues.reviewers,%2Bvalues.participants`,
311-
{
312-
method: 'GET',
313-
},
314-
scope,
315-
);
316-
317-
if (!response?.values?.length) {
318-
return undefined;
319-
}
320-
return response.values.map(pr => fromBitbucketPullRequest(pr, provider));
321-
}
322-
323292
async getUsersReviewingPullRequestsForRepo(
324293
provider: Provider,
325294
token: string,

src/plus/integrations/providers/models.ts

+16-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import type {
1818
Jira,
1919
JiraProject,
2020
JiraResource,
21+
NumberedPageInput,
2122
Issue as ProviderApiIssue,
2223
PullRequestWithUniqueID,
2324
RequestFunction,
@@ -342,6 +343,19 @@ export type GetBitbucketResourcesForUserFn = (
342343
input: { userId: string },
343344
options?: EnterpriseOptions,
344345
) => Promise<{ data: BitbucketWorkspaceStub[] }>;
346+
export type GetBitbucketPullRequestsAuthoredByUserForWorkspaceFn = (
347+
input: {
348+
userId: string;
349+
workspaceSlug: string;
350+
} & NumberedPageInput,
351+
options?: EnterpriseOptions,
352+
) => Promise<{
353+
pageInfo: {
354+
hasNextPage: boolean;
355+
nextPage: number | null;
356+
};
357+
data: GitPullRequest[];
358+
}>;
345359
export type GetIssuesForProjectFn = Jira['getIssuesForProject'];
346360
export type GetIssuesForResourceForCurrentUserFn = (
347361
input: { resourceId: string },
@@ -364,6 +378,7 @@ export interface ProviderInfo extends ProviderMetadata {
364378
getJiraResourcesForCurrentUserFn?: GetJiraResourcesForCurrentUserFn;
365379
getAzureResourcesForUserFn?: GetAzureResourcesForUserFn;
366380
getBitbucketResourcesForUserFn?: GetBitbucketResourcesForUserFn;
381+
getBitbucketPullRequestsAuthoredByUserForWorkspaceFn?: GetBitbucketPullRequestsAuthoredByUserForWorkspaceFn;
367382
getJiraProjectsForResourcesFn?: GetJiraProjectsForResourcesFn;
368383
getAzureProjectsForResourceFn?: GetAzureProjectsForResourceFn;
369384
getIssuesForProjectFn?: GetIssuesForProjectFn;
@@ -912,7 +927,7 @@ export function fromProviderPullRequest(
912927
integration,
913928
fromProviderAccount(pr.author),
914929
pr.id,
915-
pr.graphQLId,
930+
pr.graphQLId || pr.id,
916931
pr.title,
917932
pr.url ?? '',
918933
{

src/plus/integrations/providers/providersApi.ts

+28
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import type { IntegrationAuthenticationService } from '../authentication/integra
1919
import type {
2020
GetAzureProjectsForResourceFn,
2121
GetAzureResourcesForUserFn,
22+
GetBitbucketPullRequestsAuthoredByUserForWorkspaceFn,
2223
GetBitbucketResourcesForUserFn,
2324
GetCurrentUserFn,
2425
GetCurrentUserForInstanceFn,
@@ -202,6 +203,10 @@ export class ProvidersApi {
202203
getBitbucketResourcesForUserFn: providerApis.bitbucket.getWorkspacesForUser.bind(
203204
providerApis.bitbucket,
204205
) as GetBitbucketResourcesForUserFn,
206+
getBitbucketPullRequestsAuthoredByUserForWorkspaceFn:
207+
providerApis.bitbucket.getPullRequestsForUserAndWorkspace.bind(
208+
providerApis.bitbucket,
209+
) as GetBitbucketPullRequestsAuthoredByUserForWorkspaceFn,
205210
getPullRequestsForReposFn: providerApis.bitbucket.getPullRequestsForRepos.bind(
206211
providerApis.bitbucket,
207212
) as GetPullRequestsForReposFn,
@@ -564,6 +569,29 @@ export class ProvidersApi {
564569
}
565570
}
566571

572+
async getBitbucketPullRequestsAuthoredByUserForWorkspace(
573+
userId: string,
574+
workspaceSlug: string,
575+
options?: { accessToken?: string },
576+
): Promise<ProviderPullRequest[] | undefined> {
577+
const { provider, token } = await this.ensureProviderTokenAndFunction(
578+
HostingIntegrationId.Bitbucket,
579+
'getBitbucketPullRequestsAuthoredByUserForWorkspaceFn',
580+
options?.accessToken,
581+
);
582+
583+
try {
584+
return (
585+
await provider.getBitbucketPullRequestsAuthoredByUserForWorkspaceFn?.(
586+
{ userId: userId, workspaceSlug: workspaceSlug },
587+
{ token: token },
588+
)
589+
)?.data;
590+
} catch (e) {
591+
return this.handleProviderError(HostingIntegrationId.Bitbucket, token, e);
592+
}
593+
}
594+
567595
async getJiraProjectsForResources(
568596
resourceIds: string[],
569597
options?: { accessToken?: string },

0 commit comments

Comments
 (0)