From 95b057332a5f123ef45b59920c644ea3d3ef2441 Mon Sep 17 00:00:00 2001 From: Quadman Date: Sat, 16 Mar 2024 19:13:21 +0100 Subject: [PATCH 01/15] Add optional topTeams parameter for getAllTeams method, defaults to 100 which is default in azure-devops-node-api Signed-off-by: Quadman --- .changeset/brown-beers-share.md | 6 ++++++ .../azure-devops-backend/src/api/AzureDevOpsApi.ts | 10 ++++++++-- .../src/api/PullRequestsDashboardProvider.ts | 11 +++++++---- plugins/azure-devops-backend/src/service/router.ts | 5 ++++- plugins/azure-devops/src/api/AzureDevOpsApi.ts | 2 +- plugins/azure-devops/src/api/AzureDevOpsClient.ts | 12 ++++++++++-- 6 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 .changeset/brown-beers-share.md 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 { From b9c2d2fc60f5eebe33a02e4009ebf4e3297c3cbc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derlund?= Date: Mon, 18 Mar 2024 17:47:42 +0100 Subject: [PATCH 02/15] Update .changeset/brown-beers-share.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andre Wanlin <67169551+awanlin@users.noreply.github.com> Signed-off-by: David Söderlund --- .changeset/brown-beers-share.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/brown-beers-share.md b/.changeset/brown-beers-share.md index 4f214a73fe..9fae8ffda9 100644 --- a/.changeset/brown-beers-share.md +++ b/.changeset/brown-beers-share.md @@ -3,4 +3,4 @@ '@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 +`getAllTeams` now accepts an optional `topTeams` parameter which can be used to return more than the default top 100 teams from the Azure DevOps API From 106b904f316f2bbea209c3cb880338ed82a248b8 Mon Sep 17 00:00:00 2001 From: Quadman Date: Tue, 19 Mar 2024 20:45:20 +0100 Subject: [PATCH 03/15] Fixed variable name to not use underscore Signed-off-by: Quadman --- plugins/azure-devops-backend/src/service/router.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/azure-devops-backend/src/service/router.ts b/plugins/azure-devops-backend/src/service/router.ts index 48340352c3..d77ed16d29 100644 --- a/plugins/azure-devops-backend/src/service/router.ts +++ b/plugins/azure-devops-backend/src/service/router.ts @@ -266,9 +266,9 @@ export async function createRouter( res.status(200).json(pullRequests); }); - router.get('/all-teams', async (_req, res) => { - const topTeams = _req.query.topTeams - ? Number(_req.query.topTeams) + router.get('/all-teams', async (req, res) => { + const topTeams = req.query.topTeams + ? Number(req.query.topTeams) : undefined; const allTeams = await pullRequestsDashboardProvider.getAllTeams(topTeams); res.status(200).json(allTeams); From 11fa8ea465a51344353b0a0fe99df070cc71e3d6 Mon Sep 17 00:00:00 2001 From: Quadman Date: Tue, 19 Mar 2024 21:06:41 +0100 Subject: [PATCH 04/15] added topTeams to PullRequestsPageProps and implemented through to backend Signed-off-by: Quadman --- .../src/api/PullRequestsDashboardProvider.ts | 5 +++-- plugins/azure-devops-backend/src/service/router.ts | 9 ++++++++- plugins/azure-devops/src/api/AzureDevOpsApi.ts | 1 + plugins/azure-devops/src/api/AzureDevOpsClient.ts | 11 ++++++++--- .../components/PullRequestsPage/PullRequestsPage.tsx | 5 ++++- .../src/hooks/useDashboardPullRequests.ts | 5 +++-- 6 files changed, 27 insertions(+), 9 deletions(-) diff --git a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts index c4e0e46774..6605bfbd07 100644 --- a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts +++ b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts @@ -25,7 +25,7 @@ import { AzureDevOpsApi } from './AzureDevOpsApi'; import { Logger } from 'winston'; import limiterFactory from 'p-limit'; -const DEFAULT_TOP_TEAMS = 100; +export const DEFAULT_TOP_TEAMS = 100; export class PullRequestsDashboardProvider { private teams = new Map(); @@ -108,11 +108,12 @@ export class PullRequestsDashboardProvider { public async getDashboardPullRequests( projectName: string, options: PullRequestOptions, + topTeams?: number, ): Promise { const dashboardPullRequests = await this.azureDevOpsApi.getDashboardPullRequests(projectName, options); - await this.getAllTeams(); // Make sure team members are loaded + await this.getAllTeams(topTeams); // Make sure team members are loaded return dashboardPullRequests.map(pr => { if (pr.createdBy?.id) { diff --git a/plugins/azure-devops-backend/src/service/router.ts b/plugins/azure-devops-backend/src/service/router.ts index d77ed16d29..b9ea1c6cf4 100644 --- a/plugins/azure-devops-backend/src/service/router.ts +++ b/plugins/azure-devops-backend/src/service/router.ts @@ -23,7 +23,10 @@ import { import { AzureDevOpsApi } from '../api'; import { Config } from '@backstage/config'; import { Logger } from 'winston'; -import { PullRequestsDashboardProvider } from '../api/PullRequestsDashboardProvider'; +import { + PullRequestsDashboardProvider, + DEFAULT_TOP_TEAMS, +} from '../api/PullRequestsDashboardProvider'; import Router from 'express-promise-router'; import { errorHandler, UrlReader } from '@backstage/backend-common'; import express from 'express'; @@ -227,6 +230,9 @@ export async function createRouter( const { projectName } = req.params; const top = req.query.top ? Number(req.query.top) : DEFAULT_TOP; + const topTeams = req.query.topTeams + ? Number(req.query.topTeams) + : DEFAULT_TOP_TEAMS; const status = req.query.status ? Number(req.query.status) @@ -261,6 +267,7 @@ export async function createRouter( await pullRequestsDashboardProvider.getDashboardPullRequests( projectName, pullRequestOptions, + topTeams, ); res.status(200).json(pullRequests); diff --git a/plugins/azure-devops/src/api/AzureDevOpsApi.ts b/plugins/azure-devops/src/api/AzureDevOpsApi.ts index e6a5af7766..31704f4314 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsApi.ts @@ -64,6 +64,7 @@ export interface AzureDevOpsApi { getDashboardPullRequests( projectName: string, + topTeams?: number, ): Promise; getAllTeams(topTeams?: number): Promise; diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index 422d4b3cd7..25e23f65a6 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -124,10 +124,15 @@ export class AzureDevOpsClient implements AzureDevOpsApi { public getDashboardPullRequests( projectName: string, + topTeams?: number, ): Promise { - return this.get( - `dashboard-pull-requests/${projectName}?top=100`, - ); + const queryString = new URLSearchParams(); + queryString.append('top', '100'); + if (topTeams) { + queryString.append('topTeams', topTeams.toString()); + } + const urlSegment = `dashboard-pull-requests/${projectName}?${queryString}`; + return this.get(urlSegment); } public getAllTeams(topTeams?: number): Promise { diff --git a/plugins/azure-devops/src/components/PullRequestsPage/PullRequestsPage.tsx b/plugins/azure-devops/src/components/PullRequestsPage/PullRequestsPage.tsx index 5971a03afd..0c87bd7f54 100644 --- a/plugins/azure-devops/src/components/PullRequestsPage/PullRequestsPage.tsx +++ b/plugins/azure-devops/src/components/PullRequestsPage/PullRequestsPage.tsx @@ -70,14 +70,17 @@ type PullRequestsPageProps = { projectName?: string; pollingInterval?: number; defaultColumnConfigs?: PullRequestColumnConfig[]; + topTeams?: number; }; export const PullRequestsPage = (props: PullRequestsPageProps) => { - const { projectName, pollingInterval, defaultColumnConfigs } = props; + const { projectName, pollingInterval, defaultColumnConfigs, topTeams } = + props; const { pullRequests, loading, error } = useDashboardPullRequests( projectName, pollingInterval, + topTeams, ); const [columnConfigs] = useState( diff --git a/plugins/azure-devops/src/hooks/useDashboardPullRequests.ts b/plugins/azure-devops/src/hooks/useDashboardPullRequests.ts index 8ace9663fa..73e3cf687a 100644 --- a/plugins/azure-devops/src/hooks/useDashboardPullRequests.ts +++ b/plugins/azure-devops/src/hooks/useDashboardPullRequests.ts @@ -27,6 +27,7 @@ const POLLING_INTERVAL = 10000; export function useDashboardPullRequests( project?: string, pollingInterval: number = POLLING_INTERVAL, + topTeams?: number, ): { pullRequests?: DashboardPullRequest[]; loading: boolean; @@ -43,7 +44,7 @@ export function useDashboardPullRequests( } try { - return await api.getDashboardPullRequests(project); + return await api.getDashboardPullRequests(project, topTeams); } catch (error) { if (error instanceof Error) { errorApi.post(error); @@ -51,7 +52,7 @@ export function useDashboardPullRequests( return Promise.reject(error); } - }, [project, api, errorApi]); + }, [project, api, topTeams, errorApi]); const { value: pullRequests, From 171e80c9eada5b4b52348d5d8be7a2beb8acb9c9 Mon Sep 17 00:00:00 2001 From: Quadman Date: Tue, 19 Mar 2024 21:18:11 +0100 Subject: [PATCH 05/15] Updated API report for azure-devops plugins Signed-off-by: Quadman --- plugins/azure-devops-backend/api-report.md | 2 +- plugins/azure-devops/api-report.md | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/plugins/azure-devops-backend/api-report.md b/plugins/azure-devops-backend/api-report.md index 7231509fc1..f80f023661 100644 --- a/plugins/azure-devops-backend/api-report.md +++ b/plugins/azure-devops-backend/api-report.md @@ -56,7 +56,7 @@ export class AzureDevOpsApi { }, ): AzureDevOpsApi; // (undocumented) - getAllTeams(): Promise; + getAllTeams(topTeams?: number): Promise; // (undocumented) getBuildDefinitions( projectName: string, diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index e76e172d9b..cd890edf9f 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -65,7 +65,7 @@ export type AssignedToUserFilter = BaseFilter & // @public (undocumented) export interface AzureDevOpsApi { // (undocumented) - getAllTeams(): Promise; + getAllTeams(topTeams?: number): Promise; // (undocumented) getBuildRuns( projectName: string, @@ -81,6 +81,7 @@ export interface AzureDevOpsApi { // (undocumented) getDashboardPullRequests( projectName: string, + topTeams?: number, ): Promise; // (undocumented) getGitTags( @@ -126,7 +127,7 @@ export const azureDevOpsApiRef: ApiRef; export class AzureDevOpsClient implements AzureDevOpsApi { constructor(options: { discoveryApi: DiscoveryApi; fetchApi: FetchApi }); // (undocumented) - getAllTeams(): Promise; + getAllTeams(topTeams?: number): Promise; // (undocumented) getBuildRuns( projectName: string, @@ -142,6 +143,7 @@ export class AzureDevOpsClient implements AzureDevOpsApi { // (undocumented) getDashboardPullRequests( projectName: string, + topTeams?: number, ): Promise; // (undocumented) getGitTags( @@ -193,6 +195,7 @@ export const AzurePullRequestsPage: (props: { projectName?: string | undefined; pollingInterval?: number | undefined; defaultColumnConfigs?: PullRequestColumnConfig[] | undefined; + topTeams?: number | undefined; }) => JSX_2.Element; // @public (undocumented) From 637c1eacf0e9b0a4f8d5d759eb3cbe8477cdc0e0 Mon Sep 17 00:00:00 2001 From: Quadman Date: Sat, 23 Mar 2024 13:07:39 +0100 Subject: [PATCH 06/15] Renamed the parameter to `teamsLimit`, reran api report, tsc, lint, and tests. Signed-off-by: Quadman --- .changeset/brown-beers-share.md | 2 +- plugins/azure-devops-backend/api-report.md | 2 +- .../src/api/AzureDevOpsApi.ts | 4 ++-- .../src/api/PullRequestsDashboardProvider.ts | 14 +++++++------- .../azure-devops-backend/src/service/router.ts | 18 ++++++++++-------- plugins/azure-devops/api-report.md | 10 +++++----- plugins/azure-devops/src/api/AzureDevOpsApi.ts | 4 ++-- .../azure-devops/src/api/AzureDevOpsClient.ts | 12 ++++++------ .../PullRequestsPage/PullRequestsPage.tsx | 6 +++--- .../src/hooks/useDashboardPullRequests.ts | 6 +++--- 10 files changed, 40 insertions(+), 38 deletions(-) diff --git a/.changeset/brown-beers-share.md b/.changeset/brown-beers-share.md index 9fae8ffda9..4ca548ebb4 100644 --- a/.changeset/brown-beers-share.md +++ b/.changeset/brown-beers-share.md @@ -3,4 +3,4 @@ '@backstage/plugin-azure-devops': patch --- -`getAllTeams` now accepts an optional `topTeams` parameter which can be used to return more than the default top 100 teams from the Azure DevOps API +`getAllTeams` now accepts an optional `teamsLimit` parameter which can be used to return more than the default limit of 100 teams from the Azure DevOps API diff --git a/plugins/azure-devops-backend/api-report.md b/plugins/azure-devops-backend/api-report.md index f80f023661..ae78098400 100644 --- a/plugins/azure-devops-backend/api-report.md +++ b/plugins/azure-devops-backend/api-report.md @@ -56,7 +56,7 @@ export class AzureDevOpsApi { }, ): AzureDevOpsApi; // (undocumented) - getAllTeams(topTeams?: number): Promise; + getAllTeams(teamsLimit?: number): Promise; // (undocumented) getBuildDefinitions( projectName: string, diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index 18d0e41358..08fa157204 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -397,7 +397,7 @@ export class AzureDevOpsApi { .filter((policy): policy is Policy => Boolean(policy)); } - public async getAllTeams(topTeams?: number): Promise { + public async getAllTeams(teamsLimit?: number): Promise { this.logger?.debug('Getting all teams.'); const webApi = await this.getWebApi(); @@ -405,7 +405,7 @@ export class AzureDevOpsApi { const webApiTeams: WebApiTeam[] = await client.getAllTeams( undefined, - topTeams, + teamsLimit, undefined, undefined, ); diff --git a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts index 6605bfbd07..9d927cdfa1 100644 --- a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts +++ b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts @@ -25,7 +25,7 @@ import { AzureDevOpsApi } from './AzureDevOpsApi'; import { Logger } from 'winston'; import limiterFactory from 'p-limit'; -export const DEFAULT_TOP_TEAMS = 100; +export const DEFAULT_TEAMS_LIMIT = 100; export class PullRequestsDashboardProvider { private teams = new Map(); @@ -45,10 +45,10 @@ export class PullRequestsDashboardProvider { return provider; } - public async readTeams(topTeams?: number): Promise { + public async readTeams(teamsLimit?: number): Promise { this.logger.info('Reading teams.'); - let teams = await this.azureDevOpsApi.getAllTeams(topTeams); + let teams = await this.azureDevOpsApi.getAllTeams(teamsLimit); // This is used to filter out the default Azure Devops project teams. teams = teams.filter(team => @@ -108,12 +108,12 @@ export class PullRequestsDashboardProvider { public async getDashboardPullRequests( projectName: string, options: PullRequestOptions, - topTeams?: number, + teamsLimit?: number, ): Promise { const dashboardPullRequests = await this.azureDevOpsApi.getDashboardPullRequests(projectName, options); - await this.getAllTeams(topTeams); // Make sure team members are loaded + await this.getAllTeams(teamsLimit); // Make sure team members are loaded return dashboardPullRequests.map(pr => { if (pr.createdBy?.id) { @@ -137,9 +137,9 @@ export class PullRequestsDashboardProvider { ); } - public async getAllTeams(topTeams?: number): Promise { + public async getAllTeams(teamsLimit?: number): Promise { if (!this.teams.size) { - const maxTeams = topTeams ?? DEFAULT_TOP_TEAMS; + const maxTeams = teamsLimit ?? DEFAULT_TEAMS_LIMIT; await this.readTeams(maxTeams); } diff --git a/plugins/azure-devops-backend/src/service/router.ts b/plugins/azure-devops-backend/src/service/router.ts index b9ea1c6cf4..dd41cf636f 100644 --- a/plugins/azure-devops-backend/src/service/router.ts +++ b/plugins/azure-devops-backend/src/service/router.ts @@ -25,7 +25,7 @@ import { Config } from '@backstage/config'; import { Logger } from 'winston'; import { PullRequestsDashboardProvider, - DEFAULT_TOP_TEAMS, + DEFAULT_TEAMS_LIMIT, } from '../api/PullRequestsDashboardProvider'; import Router from 'express-promise-router'; import { errorHandler, UrlReader } from '@backstage/backend-common'; @@ -230,9 +230,9 @@ export async function createRouter( const { projectName } = req.params; const top = req.query.top ? Number(req.query.top) : DEFAULT_TOP; - const topTeams = req.query.topTeams - ? Number(req.query.topTeams) - : DEFAULT_TOP_TEAMS; + const teamsLimit = req.query.teamsLimit + ? Number(req.query.teamsLimit) + : DEFAULT_TEAMS_LIMIT; const status = req.query.status ? Number(req.query.status) @@ -267,17 +267,19 @@ export async function createRouter( await pullRequestsDashboardProvider.getDashboardPullRequests( projectName, pullRequestOptions, - topTeams, + teamsLimit, ); res.status(200).json(pullRequests); }); router.get('/all-teams', async (req, res) => { - const topTeams = req.query.topTeams - ? Number(req.query.topTeams) + const teamsLimit = req.query.teamsLimit + ? Number(req.query.teamsLimit) : undefined; - const allTeams = await pullRequestsDashboardProvider.getAllTeams(topTeams); + const allTeams = await pullRequestsDashboardProvider.getAllTeams( + teamsLimit, + ); res.status(200).json(allTeams); }); diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index cd890edf9f..e470d255d6 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -65,7 +65,7 @@ export type AssignedToUserFilter = BaseFilter & // @public (undocumented) export interface AzureDevOpsApi { // (undocumented) - getAllTeams(topTeams?: number): Promise; + getAllTeams(teamsLimit?: number): Promise; // (undocumented) getBuildRuns( projectName: string, @@ -81,7 +81,7 @@ export interface AzureDevOpsApi { // (undocumented) getDashboardPullRequests( projectName: string, - topTeams?: number, + teamsLimit?: number, ): Promise; // (undocumented) getGitTags( @@ -127,7 +127,7 @@ export const azureDevOpsApiRef: ApiRef; export class AzureDevOpsClient implements AzureDevOpsApi { constructor(options: { discoveryApi: DiscoveryApi; fetchApi: FetchApi }); // (undocumented) - getAllTeams(topTeams?: number): Promise; + getAllTeams(teamsLimit?: number): Promise; // (undocumented) getBuildRuns( projectName: string, @@ -143,7 +143,7 @@ export class AzureDevOpsClient implements AzureDevOpsApi { // (undocumented) getDashboardPullRequests( projectName: string, - topTeams?: number, + teamsLimit?: number, ): Promise; // (undocumented) getGitTags( @@ -195,7 +195,7 @@ export const AzurePullRequestsPage: (props: { projectName?: string | undefined; pollingInterval?: number | undefined; defaultColumnConfigs?: PullRequestColumnConfig[] | undefined; - topTeams?: number | undefined; + teamsLimit?: number | undefined; }) => JSX_2.Element; // @public (undocumented) diff --git a/plugins/azure-devops/src/api/AzureDevOpsApi.ts b/plugins/azure-devops/src/api/AzureDevOpsApi.ts index 31704f4314..6f839d824d 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsApi.ts @@ -64,10 +64,10 @@ export interface AzureDevOpsApi { getDashboardPullRequests( projectName: string, - topTeams?: number, + teamsLimit?: number, ): Promise; - getAllTeams(topTeams?: number): Promise; + getAllTeams(teamsLimit?: 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 25e23f65a6..8b0bf50523 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -124,21 +124,21 @@ export class AzureDevOpsClient implements AzureDevOpsApi { public getDashboardPullRequests( projectName: string, - topTeams?: number, + teamsLimit?: number, ): Promise { const queryString = new URLSearchParams(); queryString.append('top', '100'); - if (topTeams) { - queryString.append('topTeams', topTeams.toString()); + if (teamsLimit) { + queryString.append('teamsLimit', teamsLimit.toString()); } const urlSegment = `dashboard-pull-requests/${projectName}?${queryString}`; return this.get(urlSegment); } - public getAllTeams(topTeams?: number): Promise { + public getAllTeams(teamsLimit?: number): Promise { const queryString = new URLSearchParams(); - if (topTeams) { - queryString.append('topTeams', topTeams.toString()); + if (teamsLimit) { + queryString.append('teamsLimit', teamsLimit.toString()); } let urlSegment = 'all-teams'; if (queryString.toString()) { diff --git a/plugins/azure-devops/src/components/PullRequestsPage/PullRequestsPage.tsx b/plugins/azure-devops/src/components/PullRequestsPage/PullRequestsPage.tsx index 0c87bd7f54..ed35545812 100644 --- a/plugins/azure-devops/src/components/PullRequestsPage/PullRequestsPage.tsx +++ b/plugins/azure-devops/src/components/PullRequestsPage/PullRequestsPage.tsx @@ -70,17 +70,17 @@ type PullRequestsPageProps = { projectName?: string; pollingInterval?: number; defaultColumnConfigs?: PullRequestColumnConfig[]; - topTeams?: number; + teamsLimit?: number; }; export const PullRequestsPage = (props: PullRequestsPageProps) => { - const { projectName, pollingInterval, defaultColumnConfigs, topTeams } = + const { projectName, pollingInterval, defaultColumnConfigs, teamsLimit } = props; const { pullRequests, loading, error } = useDashboardPullRequests( projectName, pollingInterval, - topTeams, + teamsLimit, ); const [columnConfigs] = useState( diff --git a/plugins/azure-devops/src/hooks/useDashboardPullRequests.ts b/plugins/azure-devops/src/hooks/useDashboardPullRequests.ts index 73e3cf687a..f812b2abbb 100644 --- a/plugins/azure-devops/src/hooks/useDashboardPullRequests.ts +++ b/plugins/azure-devops/src/hooks/useDashboardPullRequests.ts @@ -27,7 +27,7 @@ const POLLING_INTERVAL = 10000; export function useDashboardPullRequests( project?: string, pollingInterval: number = POLLING_INTERVAL, - topTeams?: number, + teamsLimit?: number, ): { pullRequests?: DashboardPullRequest[]; loading: boolean; @@ -44,7 +44,7 @@ export function useDashboardPullRequests( } try { - return await api.getDashboardPullRequests(project, topTeams); + return await api.getDashboardPullRequests(project, teamsLimit); } catch (error) { if (error instanceof Error) { errorApi.post(error); @@ -52,7 +52,7 @@ export function useDashboardPullRequests( return Promise.reject(error); } - }, [project, api, topTeams, errorApi]); + }, [project, api, teamsLimit, errorApi]); const { value: pullRequests, From d6a4e2b4703ea99b8aaaf7914309c74fef627eb4 Mon Sep 17 00:00:00 2001 From: Quadman Date: Wed, 3 Apr 2024 20:08:45 +0200 Subject: [PATCH 07/15] Update getAllTeams parameter name to 'limit' Signed-off-by: Quadman --- .changeset/brown-beers-share.md | 2 +- plugins/azure-devops-backend/api-report.md | 2 +- plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts | 4 ++-- .../src/api/PullRequestsDashboardProvider.ts | 8 ++++---- plugins/azure-devops-backend/src/service/router.ts | 8 ++------ plugins/azure-devops/api-report.md | 4 ++-- plugins/azure-devops/src/api/AzureDevOpsApi.ts | 2 +- plugins/azure-devops/src/api/AzureDevOpsClient.ts | 6 +++--- 8 files changed, 16 insertions(+), 20 deletions(-) diff --git a/.changeset/brown-beers-share.md b/.changeset/brown-beers-share.md index 4ca548ebb4..425cba62f6 100644 --- a/.changeset/brown-beers-share.md +++ b/.changeset/brown-beers-share.md @@ -3,4 +3,4 @@ '@backstage/plugin-azure-devops': patch --- -`getAllTeams` now accepts an optional `teamsLimit` parameter which can be used to return more than the default limit of 100 teams from the Azure DevOps API +`getAllTeams` now accepts an optional `limit` parameter which can be used to return more than the default limit of 100 teams from the Azure DevOps API diff --git a/plugins/azure-devops-backend/api-report.md b/plugins/azure-devops-backend/api-report.md index ae78098400..41eee642c7 100644 --- a/plugins/azure-devops-backend/api-report.md +++ b/plugins/azure-devops-backend/api-report.md @@ -56,7 +56,7 @@ export class AzureDevOpsApi { }, ): AzureDevOpsApi; // (undocumented) - getAllTeams(teamsLimit?: number): Promise; + getAllTeams(limit?: number): Promise; // (undocumented) getBuildDefinitions( projectName: string, diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index 08fa157204..bd07a248b8 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -397,7 +397,7 @@ export class AzureDevOpsApi { .filter((policy): policy is Policy => Boolean(policy)); } - public async getAllTeams(teamsLimit?: number): Promise { + public async getAllTeams(limit?: number): Promise { this.logger?.debug('Getting all teams.'); const webApi = await this.getWebApi(); @@ -405,7 +405,7 @@ export class AzureDevOpsApi { const webApiTeams: WebApiTeam[] = await client.getAllTeams( undefined, - teamsLimit, + limit, undefined, undefined, ); diff --git a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts index 9d927cdfa1..dd34bd4329 100644 --- a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts +++ b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts @@ -45,10 +45,10 @@ export class PullRequestsDashboardProvider { return provider; } - public async readTeams(teamsLimit?: number): Promise { + public async readTeams(limit?: number): Promise { this.logger.info('Reading teams.'); - let teams = await this.azureDevOpsApi.getAllTeams(teamsLimit); + let teams = await this.azureDevOpsApi.getAllTeams(limit); // This is used to filter out the default Azure Devops project teams. teams = teams.filter(team => @@ -137,9 +137,9 @@ export class PullRequestsDashboardProvider { ); } - public async getAllTeams(teamsLimit?: number): Promise { + public async getAllTeams(limit?: number): Promise { if (!this.teams.size) { - const maxTeams = teamsLimit ?? DEFAULT_TEAMS_LIMIT; + const maxTeams = limit ?? DEFAULT_TEAMS_LIMIT; await this.readTeams(maxTeams); } diff --git a/plugins/azure-devops-backend/src/service/router.ts b/plugins/azure-devops-backend/src/service/router.ts index dd41cf636f..73204193f2 100644 --- a/plugins/azure-devops-backend/src/service/router.ts +++ b/plugins/azure-devops-backend/src/service/router.ts @@ -274,12 +274,8 @@ export async function createRouter( }); router.get('/all-teams', async (req, res) => { - const teamsLimit = req.query.teamsLimit - ? Number(req.query.teamsLimit) - : undefined; - const allTeams = await pullRequestsDashboardProvider.getAllTeams( - teamsLimit, - ); + const limit = req.query.limit ? Number(req.query.limit) : undefined; + const allTeams = await pullRequestsDashboardProvider.getAllTeams(limit); res.status(200).json(allTeams); }); diff --git a/plugins/azure-devops/api-report.md b/plugins/azure-devops/api-report.md index e470d255d6..4c91fba9e3 100644 --- a/plugins/azure-devops/api-report.md +++ b/plugins/azure-devops/api-report.md @@ -65,7 +65,7 @@ export type AssignedToUserFilter = BaseFilter & // @public (undocumented) export interface AzureDevOpsApi { // (undocumented) - getAllTeams(teamsLimit?: number): Promise; + getAllTeams(limit?: number): Promise; // (undocumented) getBuildRuns( projectName: string, @@ -127,7 +127,7 @@ export const azureDevOpsApiRef: ApiRef; export class AzureDevOpsClient implements AzureDevOpsApi { constructor(options: { discoveryApi: DiscoveryApi; fetchApi: FetchApi }); // (undocumented) - getAllTeams(teamsLimit?: number): Promise; + getAllTeams(limit?: number): Promise; // (undocumented) getBuildRuns( projectName: string, diff --git a/plugins/azure-devops/src/api/AzureDevOpsApi.ts b/plugins/azure-devops/src/api/AzureDevOpsApi.ts index 6f839d824d..9f9ff1209f 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsApi.ts @@ -67,7 +67,7 @@ export interface AzureDevOpsApi { teamsLimit?: number, ): Promise; - getAllTeams(teamsLimit?: number): Promise; + getAllTeams(limit?: 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 8b0bf50523..ce823def06 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -135,10 +135,10 @@ export class AzureDevOpsClient implements AzureDevOpsApi { return this.get(urlSegment); } - public getAllTeams(teamsLimit?: number): Promise { + public getAllTeams(limit?: number): Promise { const queryString = new URLSearchParams(); - if (teamsLimit) { - queryString.append('teamsLimit', teamsLimit.toString()); + if (limit) { + queryString.append('limit', limit.toString()); } let urlSegment = 'all-teams'; if (queryString.toString()) { From b27382f41113cc797e4904ebdccb5abb504a922e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derlund?= Date: Fri, 5 Apr 2024 19:25:07 +0200 Subject: [PATCH 08/15] Update plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Vincenzo Scamporlino Signed-off-by: David Söderlund --- plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index bd07a248b8..97208f166c 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -397,7 +397,7 @@ export class AzureDevOpsApi { .filter((policy): policy is Policy => Boolean(policy)); } - public async getAllTeams(limit?: number): Promise { + public async getAllTeams(options?: { limit?: number }): Promise { this.logger?.debug('Getting all teams.'); const webApi = await this.getWebApi(); From d8a731b9d6c32cb8886b6897d92b59e2430897c3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derlund?= Date: Fri, 5 Apr 2024 19:25:16 +0200 Subject: [PATCH 09/15] Update plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Vincenzo Scamporlino Signed-off-by: David Söderlund --- plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index 97208f166c..149de7f114 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -405,7 +405,7 @@ export class AzureDevOpsApi { const webApiTeams: WebApiTeam[] = await client.getAllTeams( undefined, - limit, + options?.limit, undefined, undefined, ); From fbdd0518290c98a7a49e8e8655c0fb2f67d91ab0 Mon Sep 17 00:00:00 2001 From: Quadman Date: Sun, 7 Apr 2024 17:37:13 +0200 Subject: [PATCH 10/15] Fix getAllTeams method whitespace Signed-off-by: Quadman --- plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts index 149de7f114..be0ec333bb 100644 --- a/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts +++ b/plugins/azure-devops-backend/src/api/AzureDevOpsApi.ts @@ -397,7 +397,7 @@ export class AzureDevOpsApi { .filter((policy): policy is Policy => Boolean(policy)); } - public async getAllTeams(options?: { limit?: number }): Promise { + public async getAllTeams(options?: { limit?: number }): Promise { this.logger?.debug('Getting all teams.'); const webApi = await this.getWebApi(); From 5ce79db67e6cdf36c4301af33742cd40ced6e36c Mon Sep 17 00:00:00 2001 From: Quadman Date: Sun, 7 Apr 2024 17:38:20 +0200 Subject: [PATCH 11/15] Refactor getAllTeams method in PullRequestsDashboardProvider Signed-off-by: Quadman --- .../src/api/PullRequestsDashboardProvider.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts index dd34bd4329..1efbafd842 100644 --- a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts +++ b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts @@ -48,7 +48,7 @@ export class PullRequestsDashboardProvider { public async readTeams(limit?: number): Promise { this.logger.info('Reading teams.'); - let teams = await this.azureDevOpsApi.getAllTeams(limit); + let teams = await this.azureDevOpsApi.getAllTeams({ limit }); // This is used to filter out the default Azure Devops project teams. teams = teams.filter(team => From 06980ee398c3636cfe2904ad20809cb2b35ba622 Mon Sep 17 00:00:00 2001 From: Quadman Date: Sun, 7 Apr 2024 18:02:28 +0200 Subject: [PATCH 12/15] Refactor getAllTeams method to accept options parameter. Added teamsLimit parameter to PullRequestDashBoardProvider options Signed-off-by: Quadman --- .../src/api/PullRequestsDashboardProvider.ts | 9 ++++----- plugins/azure-devops-backend/src/service/router.ts | 4 ++-- plugins/azure-devops-common/src/types.ts | 1 + 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts index 1efbafd842..ec36d17e8c 100644 --- a/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts +++ b/plugins/azure-devops-backend/src/api/PullRequestsDashboardProvider.ts @@ -108,12 +108,11 @@ export class PullRequestsDashboardProvider { public async getDashboardPullRequests( projectName: string, options: PullRequestOptions, - teamsLimit?: number, ): Promise { const dashboardPullRequests = await this.azureDevOpsApi.getDashboardPullRequests(projectName, options); - await this.getAllTeams(teamsLimit); // Make sure team members are loaded + await this.getAllTeams({ limit: options.teamsLimit }); // Make sure team members are loaded return dashboardPullRequests.map(pr => { if (pr.createdBy?.id) { @@ -129,7 +128,7 @@ export class PullRequestsDashboardProvider { } public async getUserTeamIds(email: string): Promise { - await this.getAllTeams(); // Make sure team members are loaded + await this.getAllTeams({}); // Make sure team members are loaded return ( Array.from(this.teamMembers.values()).find( teamMember => teamMember.uniqueName === email, @@ -137,9 +136,9 @@ export class PullRequestsDashboardProvider { ); } - public async getAllTeams(limit?: number): Promise { + public async getAllTeams(options: { limit?: number }): Promise { if (!this.teams.size) { - const maxTeams = limit ?? DEFAULT_TEAMS_LIMIT; + const maxTeams = options?.limit ?? DEFAULT_TEAMS_LIMIT; await this.readTeams(maxTeams); } diff --git a/plugins/azure-devops-backend/src/service/router.ts b/plugins/azure-devops-backend/src/service/router.ts index 73204193f2..98d719898a 100644 --- a/plugins/azure-devops-backend/src/service/router.ts +++ b/plugins/azure-devops-backend/src/service/router.ts @@ -241,6 +241,7 @@ export async function createRouter( const pullRequestOptions: PullRequestOptions = { top: top, status: status, + teamsLimit: teamsLimit, }; const token = getBearerTokenFromAuthorizationHeader( @@ -267,7 +268,6 @@ export async function createRouter( await pullRequestsDashboardProvider.getDashboardPullRequests( projectName, pullRequestOptions, - teamsLimit, ); res.status(200).json(pullRequests); @@ -275,7 +275,7 @@ export async function createRouter( router.get('/all-teams', async (req, res) => { const limit = req.query.limit ? Number(req.query.limit) : undefined; - const allTeams = await pullRequestsDashboardProvider.getAllTeams(limit); + const allTeams = await pullRequestsDashboardProvider.getAllTeams({ limit }); res.status(200).json(allTeams); }); diff --git a/plugins/azure-devops-common/src/types.ts b/plugins/azure-devops-common/src/types.ts index ab53af66cb..fc98255629 100644 --- a/plugins/azure-devops-common/src/types.ts +++ b/plugins/azure-devops-common/src/types.ts @@ -142,6 +142,7 @@ export type PullRequest = { export type PullRequestOptions = { top: number; status: PullRequestStatus; + teamsLimit?: number; }; /** @public */ From 481f784d6e607129a4fa72bfcba86c66828cbd67 Mon Sep 17 00:00:00 2001 From: Quadman Date: Sun, 7 Apr 2024 18:02:59 +0200 Subject: [PATCH 13/15] made the teams limit option available in front end but with no defined default value since it is set to a default 100 in backend Signed-off-by: Quadman --- plugins/azure-devops-backend/src/service/router.ts | 4 ++++ plugins/azure-devops/src/api/AzureDevOpsClient.ts | 3 +++ plugins/azure-devops/src/hooks/usePullRequests.ts | 3 +++ 3 files changed, 10 insertions(+) diff --git a/plugins/azure-devops-backend/src/service/router.ts b/plugins/azure-devops-backend/src/service/router.ts index 98d719898a..8a3daf9f9a 100644 --- a/plugins/azure-devops-backend/src/service/router.ts +++ b/plugins/azure-devops-backend/src/service/router.ts @@ -178,6 +178,9 @@ export async function createRouter( const { projectName, repoName } = req.params; const top = req.query.top ? Number(req.query.top) : DEFAULT_TOP; + const teamsLimit = req.query.teamsLimit + ? Number(req.query.teamsLimit) + : DEFAULT_TEAMS_LIMIT; const host = req.query.host?.toString(); const org = req.query.org?.toString(); const status = req.query.status @@ -187,6 +190,7 @@ export async function createRouter( const pullRequestOptions: PullRequestOptions = { top: top, status: status, + teamsLimit: teamsLimit, }; const entityRef = req.query.entityRef; diff --git a/plugins/azure-devops/src/api/AzureDevOpsClient.ts b/plugins/azure-devops/src/api/AzureDevOpsClient.ts index ce823def06..fb9d96c7e9 100644 --- a/plugins/azure-devops/src/api/AzureDevOpsClient.ts +++ b/plugins/azure-devops/src/api/AzureDevOpsClient.ts @@ -107,6 +107,9 @@ export class AzureDevOpsClient implements AzureDevOpsApi { if (options?.status) { queryString.append('status', options.status.toString()); } + if (options?.teamsLimit) { + queryString.append('teamsLimit', options.teamsLimit.toString()); + } if (host) { queryString.append('host', host); } diff --git a/plugins/azure-devops/src/hooks/usePullRequests.ts b/plugins/azure-devops/src/hooks/usePullRequests.ts index 636e7d9562..f4145b59d7 100644 --- a/plugins/azure-devops/src/hooks/usePullRequests.ts +++ b/plugins/azure-devops/src/hooks/usePullRequests.ts @@ -31,16 +31,19 @@ export function usePullRequests( entity: Entity, defaultLimit?: number, requestedStatus?: PullRequestStatus, + defaultTeamsLimit?: number, ): { items?: PullRequest[]; loading: boolean; error?: Error; } { const top = defaultLimit ?? AZURE_DEVOPS_DEFAULT_TOP; + const teamsLimit = defaultTeamsLimit ?? undefined; const status = requestedStatus ?? PullRequestStatus.Active; const options: PullRequestOptions = { top, status, + teamsLimit, }; const api = useApi(azureDevOpsApiRef); From a16fe875d6d290c079a5815870da165eec5be083 Mon Sep 17 00:00:00 2001 From: Quadman Date: Sun, 7 Apr 2024 18:10:20 +0200 Subject: [PATCH 14/15] updated api-report Signed-off-by: Quadman --- .changeset/brown-beers-share.md | 3 +++ plugins/azure-devops-backend/api-report.md | 2 +- plugins/azure-devops-common/api-report.md | 1 + 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/.changeset/brown-beers-share.md b/.changeset/brown-beers-share.md index 425cba62f6..9ff4f0aba4 100644 --- a/.changeset/brown-beers-share.md +++ b/.changeset/brown-beers-share.md @@ -1,6 +1,9 @@ --- '@backstage/plugin-azure-devops-backend': patch '@backstage/plugin-azure-devops': patch +'@backstage/plugin-azure-common': patch --- `getAllTeams` now accepts an optional `limit` parameter which can be used to return more than the default limit of 100 teams from the Azure DevOps API + +`pullRequestOptions` have been equipped with `teamsLimit` so that the property can be used with `getAllTeams` diff --git a/plugins/azure-devops-backend/api-report.md b/plugins/azure-devops-backend/api-report.md index 41eee642c7..429a801b04 100644 --- a/plugins/azure-devops-backend/api-report.md +++ b/plugins/azure-devops-backend/api-report.md @@ -56,7 +56,7 @@ export class AzureDevOpsApi { }, ): AzureDevOpsApi; // (undocumented) - getAllTeams(limit?: number): Promise; + getAllTeams(options?: { limit?: number }): Promise; // (undocumented) getBuildDefinitions( projectName: string, diff --git a/plugins/azure-devops-common/api-report.md b/plugins/azure-devops-common/api-report.md index c926823367..af79d419da 100644 --- a/plugins/azure-devops-common/api-report.md +++ b/plugins/azure-devops-common/api-report.md @@ -215,6 +215,7 @@ export type PullRequest = { export type PullRequestOptions = { top: number; status: PullRequestStatus; + teamsLimit?: number; }; // @public (undocumented) From b356ead6c437aede7d50b38ad2ca101f8fed2273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20S=C3=B6derlund?= Date: Sun, 7 Apr 2024 19:05:52 +0200 Subject: [PATCH 15/15] Add teamsLimit parameter to router test expected results. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Added test where the teamsLimit is supplied. Signed-off-by: Quadman Signed-off-by: David Söderlund --- .../src/service/router.test.ts | 69 ++++++++++++++++++- 1 file changed, 68 insertions(+), 1 deletion(-) diff --git a/plugins/azure-devops-backend/src/service/router.test.ts b/plugins/azure-devops-backend/src/service/router.test.ts index d1e9179dc1..a906ec5867 100644 --- a/plugins/azure-devops-backend/src/service/router.test.ts +++ b/plugins/azure-devops-backend/src/service/router.test.ts @@ -348,7 +348,74 @@ describe('createRouter', () => { expect(azureDevOpsApi.getPullRequests).toHaveBeenCalledWith( 'myProject', 'myRepo', - { status: 1, top: 50 }, + { status: 1, top: 50, teamsLimit: 100 }, + undefined, + undefined, + ); + expect(response.status).toEqual(200); + expect(response.body).toEqual(pullRequests); + }); + it('fetches a list of pull requests when using teamsLimit', async () => { + const firstPullRequest: PullRequest = { + pullRequestId: 7181, + repoName: 'super-feature-repo', + title: 'My Awesome New Feature', + createdBy: 'Jane Doe', + creationDate: '2020-09-12T06:10:23.932Z', + sourceRefName: 'refs/heads/topic/super-awesome-feature', + targetRefName: 'refs/heads/main', + status: PullRequestStatus.Active, + isDraft: false, + link: 'https://host.com/myOrg/_git/super-feature-repo/pullrequest/7181', + }; + + const secondPullRequest: PullRequest = { + pullRequestId: 7182, + repoName: 'super-feature-repo', + title: 'Refactoring My Awesome New Feature', + createdBy: 'Jane Doe', + creationDate: '2020-09-12T06:10:23.932Z', + sourceRefName: 'refs/heads/topic/refactor-super-awesome-feature', + targetRefName: 'refs/heads/main', + status: PullRequestStatus.Active, + isDraft: false, + link: 'https://host.com/myOrg/_git/super-feature-repo/pullrequest/7182', + }; + + const thirdPullRequest: PullRequest = { + pullRequestId: 7183, + repoName: 'super-feature-repo', + title: 'Bug Fix for My Awesome New Feature', + createdBy: 'Jane Doe', + creationDate: '2020-09-12T06:10:23.932Z', + sourceRefName: 'refs/heads/topic/fix-super-awesome-feature', + targetRefName: 'refs/heads/main', + status: PullRequestStatus.Active, + isDraft: false, + link: 'https://host.com/myOrg/_git/super-feature-repo/pullrequest/7183', + }; + + const pullRequests: PullRequest[] = [ + firstPullRequest, + secondPullRequest, + thirdPullRequest, + ]; + + mockedAuthorize.mockImplementationOnce(async () => [ + { result: AuthorizeResult.ALLOW }, + ]); + + azureDevOpsApi.getPullRequests.mockResolvedValueOnce(pullRequests); + + const response = await request(app) + .get('/pull-requests/myProject/myRepo') + .query({ entityRef: 'component:default/mycomponent' }) + .query({ top: '50', status: 1, teamsLimit: 50 }); + + expect(azureDevOpsApi.getPullRequests).toHaveBeenCalledWith( + 'myProject', + 'myRepo', + { status: 1, top: 50, teamsLimit: 50 }, undefined, undefined, );