Skip to content

Commit 5442d2b

Browse files
committed
Retrieves Bitbucket PRs where a user is author or reviewer
(#4046, #4099)
1 parent 8f8d20c commit 5442d2b

File tree

2 files changed

+52
-18
lines changed

2 files changed

+52
-18
lines changed

src/plus/integrations/providers/bitbucket.ts

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type { Issue, IssueShape } from '../../../git/models/issue';
77
import type { IssueOrPullRequest, IssueOrPullRequestType } from '../../../git/models/issueOrPullRequest';
88
import type { PullRequest, PullRequestMergeMethod, PullRequestState } from '../../../git/models/pullRequest';
99
import type { RepositoryMetadata } from '../../../git/models/repositoryMetadata';
10+
import { getSettledValue } from '../../../system/promise';
1011
import type { IntegrationAuthenticationProviderDescriptor } from '../authentication/integrationAuthenticationProvider';
1112
import type { ProviderAuthenticationSession } from '../authentication/models';
1213
import { HostingIntegration } from '../integration';
@@ -15,8 +16,7 @@ import type {
1516
BitbucketRepositoryDescriptor,
1617
BitbucketWorkspaceDescriptor,
1718
} from './bitbucket/models';
18-
import type { ProviderPullRequest } from './models';
19-
import { fromProviderPullRequest, providersMetadata } from './models';
19+
import { providersMetadata } from './models';
2020

2121
const metadata = providersMetadata[HostingIntegrationId.Bitbucket];
2222
const authProvider = Object.freeze({ id: metadata.id, scopes: metadata.scopes });
@@ -246,7 +246,6 @@ export class BitbucketIntegration extends HostingIntegration<
246246
session: ProviderAuthenticationSession,
247247
repos?: BitbucketRepositoryDescriptor[],
248248
): Promise<PullRequest[] | undefined> {
249-
const api = await this.getProvidersApi();
250249
if (repos != null) {
251250
// TODO: implement repos version
252251
return undefined;
@@ -261,14 +260,24 @@ export class BitbucketIntegration extends HostingIntegration<
261260
const allBitbucketRepos = await this.getProviderProjectsForResources(session, workspaces);
262261
if (allBitbucketRepos == null || allBitbucketRepos.length === 0) return undefined;
263262

264-
const prs = await api.getPullRequestsForRepos(
265-
HostingIntegrationId.Bitbucket,
266-
allBitbucketRepos.map(repo => ({ namespace: repo.owner, name: repo.name })),
267-
{
268-
accessToken: session.accessToken,
269-
},
263+
const api = await this.container.bitbucket;
264+
if (!api) return undefined;
265+
const prsResult = await Promise.allSettled(
266+
allBitbucketRepos.map(repo =>
267+
api.getUsersPullRequestsForRepo(
268+
this,
269+
session.accessToken,
270+
user.id,
271+
repo.owner,
272+
repo.name,
273+
this.apiBaseUrl,
274+
),
275+
),
270276
);
271-
return prs.values.map(pr => this.fromBitbucketProviderPullRequest(pr));
277+
return prsResult
278+
.map(r => getSettledValue(r))
279+
.filter(r => r != null)
280+
.flat();
272281
}
273282

274283
protected override async searchProviderMyIssues(
@@ -278,14 +287,6 @@ export class BitbucketIntegration extends HostingIntegration<
278287
return Promise.resolve(undefined);
279288
}
280289

281-
private fromBitbucketProviderPullRequest(
282-
remotePullRequest: ProviderPullRequest,
283-
// repoDescriptors: BitbucketRemoteRepositoryDescriptor[],
284-
): PullRequest {
285-
remotePullRequest.graphQLId = remotePullRequest.id;
286-
return fromProviderPullRequest(remotePullRequest, this);
287-
}
288-
289290
protected override async providerOnConnect(): Promise<void> {
290291
if (this._session == null) return;
291292

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,39 @@ export class BitbucketApi implements Disposable {
221221
}
222222
}
223223

224+
async getUsersPullRequestsForRepo(
225+
provider: Provider,
226+
token: string,
227+
userUuid: string,
228+
owner: string,
229+
repo: string,
230+
baseUrl: string,
231+
): Promise<PullRequest[] | undefined> {
232+
const scope = getLogScope();
233+
234+
const query = encodeURIComponent(`reviewers.uuid="${userUuid}" OR author.uuid="${userUuid}"`);
235+
const response = await this.request<{
236+
values: BitbucketPullRequest[];
237+
pagelen: number;
238+
size: number;
239+
page: number;
240+
}>(
241+
provider,
242+
token,
243+
baseUrl,
244+
`repositories/${owner}/${repo}/pullrequests?q=${query}&state=OPEN&fields=%2Bvalues.reviewers,%2Bvalues.participants`,
245+
{
246+
method: 'GET',
247+
},
248+
scope,
249+
);
250+
251+
if (!response?.values?.length) {
252+
return undefined;
253+
}
254+
return response.values.map(pr => fromBitbucketPullRequest(pr, provider));
255+
}
256+
224257
private async request<T>(
225258
provider: Provider,
226259
token: string,

0 commit comments

Comments
 (0)