Skip to content

Commit c4e8ca2

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 6b61589 commit c4e8ca2

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,42 +227,23 @@ 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-
227-
const authoredPrs = providersApi
228-
? workspaces.map(async ws => {
229-
const prs = await providersApi.getBitbucketPullRequestsAuthoredByUserForWorkspace(
230-
user.id,
231-
ws.slug,
232-
{
233-
accessToken: session.accessToken,
234-
},
235-
);
236-
return prs?.map(pr => fromProviderPullRequest(pr, this));
237-
})
238-
: [];
230+
const authoredPrs = workspaces.map(async ws => {
231+
const prs = await api.getBitbucketPullRequestsAuthoredByUserForWorkspace(user.id, ws.slug, {
232+
accessToken: session.accessToken,
233+
});
234+
return prs?.map(pr => fromProviderPullRequest(pr, this));
235+
});
239236

240237
const reviewingPrs = api
241-
? workspaceRepos.map(repo => {
242-
const [owner, name] = repo.split('/');
243-
return api.getUsersReviewingPullRequestsForRepo(
244-
this,
245-
session.accessToken,
246-
user.id,
247-
owner,
248-
name,
249-
this.apiBaseUrl,
250-
);
251-
})
252-
: [];
238+
.getPullRequestsForRepos(this.id, workspaceRepos, {
239+
query: `state="OPEN" AND reviewers.uuid="${user.id}"`,
240+
accessToken: session.accessToken,
241+
})
242+
.then(r => r.values?.map(pr => fromProviderPullRequest(pr, this)));
253243

254244
return [
255245
...uniqueBy(
256-
await flatSettled([...authoredPrs, ...reviewingPrs]),
246+
await flatSettled([...authoredPrs, reviewingPrs]),
257247
pr => pr.url,
258248
(orig, _cur) => orig,
259249
),
@@ -344,7 +334,7 @@ export function isBitbucketCloudDomain(domain: string | undefined): boolean {
344334
return domain != null && bitbucketCloudDomainRegex.test(domain);
345335
}
346336

347-
type MaybePromiseArr<T> = Promise<T | undefined>[] | (T | undefined)[];
337+
type MaybePromiseArr<T> = (Promise<T | undefined> | T | undefined)[];
348338

349339
async function nonnullSettled<T>(arr: MaybePromiseArr<T>): Promise<T[]> {
350340
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)