@@ -7,15 +7,12 @@ import type { Issue, IssueShape } from '../../../git/models/issue';
77import type { IssueOrPullRequest , IssueOrPullRequestType } from '../../../git/models/issueOrPullRequest' ;
88import type { PullRequest , PullRequestMergeMethod , PullRequestState } from '../../../git/models/pullRequest' ;
99import type { RepositoryMetadata } from '../../../git/models/repositoryMetadata' ;
10+ import { uniqueBy } from '../../../system/iterable' ;
1011import { getSettledValue } from '../../../system/promise' ;
1112import type { IntegrationAuthenticationProviderDescriptor } from '../authentication/integrationAuthenticationProvider' ;
1213import type { ProviderAuthenticationSession } from '../authentication/models' ;
1314import { HostingIntegration } from '../integration' ;
14- import type {
15- BitbucketRemoteRepositoryDescriptor ,
16- BitbucketRepositoryDescriptor ,
17- BitbucketWorkspaceDescriptor ,
18- } from './bitbucket/models' ;
15+ import type { BitbucketRepositoryDescriptor , BitbucketWorkspaceDescriptor } from './bitbucket/models' ;
1916import { providersMetadata } from './models' ;
2017
2118const metadata = providersMetadata [ HostingIntegrationId . Bitbucket ] ;
@@ -190,58 +187,6 @@ export class BitbucketIntegration extends HostingIntegration<
190187 return this . _workspaces . get ( accessToken ) ;
191188 }
192189
193- private async getProviderProjectsForResources (
194- { accessToken } : AuthenticationSession ,
195- resources : BitbucketWorkspaceDescriptor [ ] ,
196- force : boolean = false ,
197- ) : Promise < BitbucketRemoteRepositoryDescriptor [ ] | undefined > {
198- const repositories = new Map < string , BitbucketRemoteRepositoryDescriptor [ ] | undefined > ( ) ;
199- let resourcesWithoutRepositories : BitbucketWorkspaceDescriptor [ ] = [ ] ;
200- if ( force ) {
201- resourcesWithoutRepositories = resources ;
202- } else {
203- for ( const resource of resources ) {
204- const resourceKey = `${ accessToken } :${ resource . id } ` ;
205- const cachedRepositories = repositories . get ( resourceKey ) ;
206- if ( cachedRepositories == null ) {
207- resourcesWithoutRepositories . push ( resource ) ;
208- }
209- }
210- }
211-
212- if ( resourcesWithoutRepositories . length > 0 ) {
213- const api = await this . container . bitbucket ;
214- if ( api == null ) return undefined ;
215- await Promise . allSettled (
216- resourcesWithoutRepositories . map ( async resource => {
217- const resourceRepos = await api . getRepositoriesForWorkspace ( this , accessToken , resource . slug , {
218- baseUrl : this . apiBaseUrl ,
219- } ) ;
220-
221- if ( resourceRepos == null ) return undefined ;
222- repositories . set (
223- `${ accessToken } :${ resource . id } ` ,
224- resourceRepos . map ( r => ( {
225- id : `${ r . owner } /${ r . name } ` ,
226- resourceId : r . owner ,
227- owner : r . owner ,
228- name : r . name ,
229- key : `${ r . owner } /${ r . name } ` ,
230- } ) ) ,
231- ) ;
232- } ) ,
233- ) ;
234- }
235-
236- return resources . reduce < BitbucketRemoteRepositoryDescriptor [ ] > ( ( resultRepos , resource ) => {
237- const resourceRepos = repositories . get ( `${ accessToken } :${ resource . id } ` ) ;
238- if ( resourceRepos != null ) {
239- resultRepos . push ( ...resourceRepos ) ;
240- }
241- return resultRepos ;
242- } , [ ] ) ;
243- }
244-
245190 protected override async searchProviderMyPullRequests (
246191 session : ProviderAuthenticationSession ,
247192 requestedRepositories ?: BitbucketRepositoryDescriptor [ ] ,
@@ -251,33 +196,36 @@ export class BitbucketIntegration extends HostingIntegration<
251196 return undefined ;
252197 }
253198
199+ const remotes = await flatSettled ( this . container . git . openRepositories . map ( r => r . git . remotes ( ) . getRemotes ( ) ) ) ;
200+ const repos = await nonnullSettled (
201+ remotes . map ( async r => ( ( await r . getIntegration ( ) ) ?. id === this . id ? r . path : undefined ) ) ,
202+ ) ;
203+
254204 const user = await this . getProviderCurrentAccount ( session ) ;
255205 if ( user ?. username == null ) return undefined ;
256206
257207 const workspaces = await this . getProviderResourcesForUser ( session ) ;
258208 if ( workspaces == null || workspaces . length === 0 ) return undefined ;
259209
260- const repos = await this . getProviderProjectsForResources ( session , workspaces ) ;
261- if ( repos == null || repos . length === 0 ) return undefined ;
262-
263210 const api = await this . container . bitbucket ;
264211 if ( ! api ) return undefined ;
265- const prsResult = await Promise . allSettled (
266- repos . map ( repo =>
267- api . getUsersPullRequestsForRepo (
268- this ,
269- session . accessToken ,
270- user . id ,
271- repo . owner ,
272- repo . name ,
273- this . apiBaseUrl ,
274- ) ,
275- ) ,
212+
213+ const authoredPrs = workspaces . map ( ws =>
214+ api . getPullRequestsForWorkspaceAuthoredByUser ( this , session . accessToken , user . id , ws . slug , this . apiBaseUrl ) ,
276215 ) ;
277- return prsResult
278- . map ( r => getSettledValue ( r ) )
279- . filter ( r => r != null )
280- . flat ( ) ;
216+
217+ const reviewingPrs = repos . map ( repo => {
218+ const [ owner , name ] = repo . split ( '/' ) ;
219+ return api . getUsersPullRequestsForRepo ( this , session . accessToken , user . id , owner , name , this . apiBaseUrl ) ;
220+ } ) ;
221+
222+ return [
223+ ...uniqueBy (
224+ await flatSettled ( [ ...authoredPrs , ...reviewingPrs ] ) ,
225+ pr => pr . url ,
226+ ( orig , _cur ) => orig ,
227+ ) ,
228+ ] ;
281229 }
282230
283231 protected override async searchProviderMyIssues (
@@ -341,3 +289,15 @@ const bitbucketCloudDomainRegex = /^bitbucket\.org$/i;
341289export function isBitbucketCloudDomain ( domain : string | undefined ) : boolean {
342290 return domain != null && bitbucketCloudDomainRegex . test ( domain ) ;
343291}
292+
293+ type MaybePromiseArr < T > = Promise < T | undefined > [ ] | ( T | undefined ) [ ] ;
294+
295+ async function nonnullSettled < T > ( arr : MaybePromiseArr < T > ) : Promise < T [ ] > {
296+ const all = await Promise . allSettled ( arr ) ;
297+ return all . map ( r => getSettledValue ( r ) ) . filter ( v => v != null ) ;
298+ }
299+
300+ async function flatSettled < T > ( arr : MaybePromiseArr < ( T | undefined ) [ ] > ) : Promise < T [ ] > {
301+ const all = await nonnullSettled ( arr ) ;
302+ return all . flat ( ) . filter ( v => v != null ) ;
303+ }
0 commit comments