@@ -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,43 @@ 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 . getUsersReviewingPullRequestsForRepo (
220+ this ,
221+ session . accessToken ,
222+ user . id ,
223+ owner ,
224+ name ,
225+ this . apiBaseUrl ,
226+ ) ;
227+ } ) ;
228+
229+ return [
230+ ...uniqueBy (
231+ await flatSettled ( [ ...authoredPrs , ...reviewingPrs ] ) ,
232+ pr => pr . url ,
233+ ( orig , _cur ) => orig ,
234+ ) ,
235+ ] ;
281236 }
282237
283238 protected override async searchProviderMyIssues (
@@ -341,3 +296,15 @@ const bitbucketCloudDomainRegex = /^bitbucket\.org$/i;
341296export function isBitbucketCloudDomain ( domain : string | undefined ) : boolean {
342297 return domain != null && bitbucketCloudDomainRegex . test ( domain ) ;
343298}
299+
300+ type MaybePromiseArr < T > = Promise < T | undefined > [ ] | ( T | undefined ) [ ] ;
301+
302+ async function nonnullSettled < T > ( arr : MaybePromiseArr < T > ) : Promise < T [ ] > {
303+ const all = await Promise . allSettled ( arr ) ;
304+ return all . map ( r => getSettledValue ( r ) ) . filter ( v => v != null ) ;
305+ }
306+
307+ async function flatSettled < T > ( arr : MaybePromiseArr < ( T | undefined ) [ ] > ) : Promise < T [ ] > {
308+ const all = await nonnullSettled ( arr ) ;
309+ return all . flat ( ) . filter ( v => v != null ) ;
310+ }
0 commit comments