@@ -7,15 +7,12 @@ import type { Issue, IssueShape } from '../../../git/models/issue';
7
7
import type { IssueOrPullRequest , IssueOrPullRequestType } from '../../../git/models/issueOrPullRequest' ;
8
8
import type { PullRequest , PullRequestMergeMethod , PullRequestState } from '../../../git/models/pullRequest' ;
9
9
import type { RepositoryMetadata } from '../../../git/models/repositoryMetadata' ;
10
+ import { uniqueBy } from '../../../system/iterable' ;
10
11
import { getSettledValue } from '../../../system/promise' ;
11
12
import type { IntegrationAuthenticationProviderDescriptor } from '../authentication/integrationAuthenticationProvider' ;
12
13
import type { ProviderAuthenticationSession } from '../authentication/models' ;
13
14
import { HostingIntegration } from '../integration' ;
14
- import type {
15
- BitbucketRemoteRepositoryDescriptor ,
16
- BitbucketRepositoryDescriptor ,
17
- BitbucketWorkspaceDescriptor ,
18
- } from './bitbucket/models' ;
15
+ import type { BitbucketRepositoryDescriptor , BitbucketWorkspaceDescriptor } from './bitbucket/models' ;
19
16
import { providersMetadata } from './models' ;
20
17
21
18
const metadata = providersMetadata [ HostingIntegrationId . Bitbucket ] ;
@@ -190,58 +187,6 @@ export class BitbucketIntegration extends HostingIntegration<
190
187
return this . _workspaces . get ( accessToken ) ;
191
188
}
192
189
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
-
245
190
protected override async searchProviderMyPullRequests (
246
191
session : ProviderAuthenticationSession ,
247
192
repos ?: BitbucketRepositoryDescriptor [ ] ,
@@ -251,33 +196,43 @@ export class BitbucketIntegration extends HostingIntegration<
251
196
return undefined ;
252
197
}
253
198
199
+ const remotes = await flatSettled ( this . container . git . openRepositories . map ( r => r . git . remotes ( ) . getRemotes ( ) ) ) ;
200
+ const workspaceRepos = await nonnullSettled (
201
+ remotes . map ( async r => ( ( await r . getIntegration ( ) ) ?. id === this . id ? r . path : undefined ) ) ,
202
+ ) ;
203
+
254
204
const user = await this . getProviderCurrentAccount ( session ) ;
255
205
if ( user ?. username == null ) return undefined ;
256
206
257
207
const workspaces = await this . getProviderResourcesForUser ( session ) ;
258
208
if ( workspaces == null || workspaces . length === 0 ) return undefined ;
259
209
260
- const allBitbucketRepos = await this . getProviderProjectsForResources ( session , workspaces ) ;
261
- if ( allBitbucketRepos == null || allBitbucketRepos . length === 0 ) return undefined ;
262
-
263
210
const api = await this . container . bitbucket ;
264
211
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
- ) ,
212
+
213
+ const authoredPrs = workspaces . map ( ws =>
214
+ api . getPullRequestsForWorkspaceAuthoredByUser ( this , session . accessToken , user . id , ws . slug , this . apiBaseUrl ) ,
276
215
) ;
277
- return prsResult
278
- . map ( r => getSettledValue ( r ) )
279
- . filter ( r => r != null )
280
- . flat ( ) ;
216
+
217
+ const reviewingPrs = workspaceRepos . 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
+ ] ;
281
236
}
282
237
283
238
protected override async searchProviderMyIssues (
@@ -341,3 +296,15 @@ const bitbucketCloudDomainRegex = /^bitbucket\.org$/i;
341
296
export function isBitbucketCloudDomain ( domain : string | undefined ) : boolean {
342
297
return domain != null && bitbucketCloudDomainRegex . test ( domain ) ;
343
298
}
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