diff --git a/.changeset/brown-beers-share.md b/.changeset/brown-beers-share.md new file mode 100644 index 0000000000..4f214a73fe --- /dev/null +++ b/.changeset/brown-beers-share.md @@ -0,0 +1,6 @@ +--- +'@backstage/plugin-azure-devops-backend': patch +'@backstage/plugin-azure-devops': patch +--- + +getAllTeams accepts optional topTeams parameter which can be used to return more than the default top 100 teams from Azure Devops API diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index 18bad8c330..18d0e41358 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -397,12 +397,18 @@ export class AzureDevOpsApi { .filter((policy): policy is Policy => Boolean(policy)); } - public async getAllTeams(): Promise { + public async getAllTeams(topTeams?: number): Promise { this.logger?.debug('Getting all teams.'); const webApi = await this.getWebApi(); const client = await webApi.getCoreApi(); - const webApiTeams: WebApiTeam[] = await client.getAllTeams(); + + const webApiTeams: WebApiTeam[] = await client.getAllTeams( + undefined, + topTeams, + undefined, + undefined, + ); const teams: Team[] = webApiTeams.map(team => ({ id: team.id, diff --git a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts index 43b4807e7d..c4e0e46774 100644 --- a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts +++ b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts @@ -25,6 +25,8 @@ import { AzureDevOpsApi } from './AzureDevOpsApi'; import { Logger } from 'winston'; import limiterFactory from 'p-limit'; +const DEFAULT_TOP_TEAMS = 100; + export class PullRequestsDashboardProvider { private teams = new Map(); @@ -43,10 +45,10 @@ export class PullRequestsDashboardProvider { return provider; } - public async readTeams(): Promise { + public async readTeams(topTeams?: number): Promise { this.logger.info('Reading teams.'); - let teams = await this.azureDevOpsApi.getAllTeams(); + let teams = await this.azureDevOpsApi.getAllTeams(topTeams); // This is used to filter out the default Azure Devops project teams. teams = teams.filter(team => @@ -134,9 +136,10 @@ export class PullRequestsDashboardProvider { ); } - public async getAllTeams(): Promise { + public async getAllTeams(topTeams?: number): Promise { if (!this.teams.size) { - await this.readTeams(); + const maxTeams = topTeams ?? DEFAULT_TOP_TEAMS; + await this.readTeams(maxTeams); } return Array.from(this.teams.values()); diff --git a/plugins/azure-devops-backend/src/service/router.ts b/plugins/azure-devops-backend/src/service/router.ts index 0697481e36..48340352c3 100644 --- a/plugins/azure-devops-backend/src/service/router.ts +++ b/plugins/azure-devops-backend/src/service/router.ts @@ -267,7 +267,10 @@ export async function createRouter( }); router.get('/all-teams', async (_req, res) => { - const allTeams = await pullRequestsDashboardProvider.getAllTeams(); + const topTeams = _req.query.topTeams + ? Number(_req.query.topTeams) + : undefined; + const allTeams = await pullRequestsDashboardProvider.getAllTeams(topTeams); res.status(200).json(allTeams); }); diff --git a/plugins/azure-devops/src/api/AzureDevOpsApi.ts b/plugins/azure-devops/src/api/AzureDevOpsApi.ts index 6dd6eeae6b..e6a5af7766 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsApi.ts @@ -66,7 +66,7 @@ export interface AzureDevOpsApi { projectName: string, ): Promise; - getAllTeams(): Promise; + getAllTeams(topTeams?: number): Promise; getUserTeamIds(userId: string): Promise; diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index 9163836e0f..422d4b3cd7 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -130,8 +130,16 @@ export class AzureDevOpsClient implements AzureDevOpsApi { ); } - public getAllTeams(): Promise { - return this.get('all-teams'); + public getAllTeams(topTeams?: number): Promise { + const queryString = new URLSearchParams(); + if (topTeams) { + queryString.append('topTeams', topTeams.toString()); + } + let urlSegment = 'all-teams'; + if (queryString.toString()) { + urlSegment += `?${queryString}`; + } + return this.get(urlSegment); } public getUserTeamIds(userId: string): Promise {