Skip to content

Commit 4b6f9d6

Browse files
committed
Uses shared library to retrieve user's Bitbucket PRs per repo.
Integrates changes from gitkraken/provider-apis-package-js#223 Solves #4128 (#4141)
1 parent fcf95e3 commit 4b6f9d6

File tree

3 files changed

+24
-66
lines changed

3 files changed

+24
-66
lines changed

src/plus/integrations/providers/bitbucket.ts

+23-33
Original file line numberDiff line numberDiff line change
@@ -207,9 +207,18 @@ export class BitbucketIntegration extends HostingIntegration<
207207
return undefined;
208208
}
209209

210+
const api = await this.getProvidersApi();
211+
if (!api) {
212+
return undefined;
213+
}
214+
210215
const remotes = await flatSettled(this.container.git.openRepositories.map(r => r.git.remotes().getRemotes()));
211216
const workspaceRepos = await nonnullSettled(
212-
remotes.map(async r => ((await r.getIntegration())?.id === this.id ? r.path : undefined)),
217+
remotes.map(async r => {
218+
const integration = await r.getIntegration();
219+
const [namespace, name] = r.path.split('/');
220+
return integration?.id === this.id ? { name: name, namespace: namespace } : undefined;
221+
}),
213222
);
214223

215224
const user = await this.getProviderCurrentAccount(session);
@@ -218,44 +227,25 @@ export class BitbucketIntegration extends HostingIntegration<
218227
const workspaces = await this.getProviderResourcesForUser(session);
219228
if (workspaces == null || workspaces.length === 0) return undefined;
220229

221-
const providersApi = await this.getProvidersApi();
222-
const api = await this.container.bitbucket;
223-
if (!providersApi && !api) {
224-
return undefined;
225-
}
226-
227230
const integration = await this.container.integrations.get(this.id);
228231

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-
: [];
232+
const authoredPrs = workspaces.map(async ws => {
233+
const prs = await api.getBitbucketPullRequestsAuthoredByUserForWorkspace(user.id, ws.slug, {
234+
accessToken: session.accessToken,
235+
});
236+
return prs?.map(pr => fromProviderPullRequest(pr, integration));
237+
});
241238

242239
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-
: [];
240+
.getPullRequestsForRepos(this.id, workspaceRepos, {
241+
query: `state="OPEN" AND reviewers.uuid="${user.id}"`,
242+
accessToken: session.accessToken,
243+
})
244+
.then(r => r.values?.map(pr => fromProviderPullRequest(pr, integration)));
255245

256246
return [
257247
...uniqueBy(
258-
await flatSettled([...authoredPrs, ...reviewingPrs]),
248+
await flatSettled([...authoredPrs, reviewingPrs]),
259249
pr => pr.url,
260250
(orig, _cur) => orig,
261251
),
@@ -346,7 +336,7 @@ export function isBitbucketCloudDomain(domain: string | undefined): boolean {
346336
return domain != null && bitbucketCloudDomainRegex.test(domain);
347337
}
348338

349-
type MaybePromiseArr<T> = Promise<T | undefined>[] | (T | undefined)[];
339+
type MaybePromiseArr<T> = (Promise<T | undefined> | T | undefined)[];
350340

351341
async function nonnullSettled<T>(arr: MaybePromiseArr<T>): Promise<T[]> {
352342
const all = await Promise.allSettled(arr);

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

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

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

src/plus/integrations/providers/models.ts

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ export interface GetPullRequestsOptions {
152152
assigneeLogins?: string[];
153153
reviewRequestedLogin?: string;
154154
mentionLogin?: string;
155+
query?: string;
155156
cursor?: string; // stringified JSON object of type { type: 'cursor' | 'page'; value: string | number } | {}
156157
baseUrl?: string;
157158
}

0 commit comments

Comments
 (0)