11/**
2- * Script to retrieve all Postman workspaces with visibility 'team'
2+ * Script to retrieve all Postman workspaces with visibility 'team' and their admin users
33 *
44 * Usage:
55 * 1. Set your Postman API key as an environment variable:
88 * node get-workspace-admins/get-team-workspaces.js [output-directory]
99 *
1010 * If output-directory is not specified, ../postman-export/workspaces will be used
11+ *
12+ * Output:
13+ * - team-workspaces.json: Contains all team workspaces metadata
14+ * - workspace-admins.json: Contains workspace IDs, names, types, and admin user IDs
1115 */
1216
1317const axios = require ( 'axios' ) ;
1418const fs = require ( 'fs' ) ;
1519const path = require ( 'path' ) ;
20+ let curReportItem = { } ;
21+ let adminReport = [ ] ;
22+ let finalReport = { } ;
23+
1624
1725// Process command line arguments
1826const args = process . argv . slice ( 2 ) ;
@@ -68,14 +76,6 @@ async function getTeamWorkspaces() {
6876
6977 console . log ( `Found ${ workspaces . length } team workspaces.` ) ;
7078
71- // Save workspaces metadata
72- fs . writeFileSync (
73- path . join ( outputDir , 'team-workspaces.json' ) ,
74- JSON . stringify ( workspaces , null , 2 )
75- ) ;
76-
77- console . log ( `Team workspaces data saved to: ${ path . join ( outputDir , 'team-workspaces.json' ) } ` ) ;
78-
7979 return workspaces ;
8080 } catch ( error ) {
8181 console . error ( 'Error fetching team workspaces:' , error . message ) ;
@@ -87,8 +87,89 @@ async function getTeamWorkspaces() {
8787 }
8888}
8989
90+ /**
91+ * Get admin users for a specific workspace
92+ * @param {string } workspaceId - The ID of the workspace to get admins for
93+ * @returns {Array<string> } - Array of user IDs with Admin role
94+ */
95+ async function getWorkspaceAdmins ( workspaceId ) {
96+ try {
97+ console . log ( `Fetching admin users for workspace ID: ${ workspaceId } ...` ) ;
98+
99+ const response = await axios . get ( `${ postmanApiUrl } /workspaces/${ workspaceId } /roles` , {
100+ headers : {
101+ 'X-API-Key' : apiKey ,
102+ } ,
103+ } ) ;
104+
105+ const roles = response . data . roles ;
106+
107+ // Find the Admin role and extract user IDs
108+ const adminRole = roles . find ( role => role . displayName === 'Admin' ) ;
109+ const adminUserIds = adminRole && adminRole . user ? adminRole . user : [ ] ;
110+
111+ console . log ( `Found ${ adminUserIds . length } admin users for workspace ID: ${ workspaceId } ` ) ;
112+
113+ return adminUserIds ;
114+ } catch ( error ) {
115+ console . error ( `Error fetching admin users for workspace ID ${ workspaceId } :` , error . message ) ;
116+ if ( error . response ) {
117+ console . error ( 'Response status:' , error . response . status ) ;
118+ console . error ( 'Response data:' , error . response . data ) ;
119+ }
120+ return [ ] ;
121+ }
122+ }
123+
124+ /**
125+ * Main function to get all team workspaces and their admins
126+ */
127+ async function main ( ) {
128+ try {
129+ // Get all team workspaces
130+ const workspaces = await getTeamWorkspaces ( ) ;
131+
132+ // Save workspaces to file
133+ const workspacesFilePath = path . join ( outputDir , 'team-workspaces.json' ) ;
134+ fs . writeFileSync ( workspacesFilePath , JSON . stringify ( workspaces , null , 2 ) ) ;
135+ console . log ( `Saved team workspaces to: ${ workspacesFilePath } ` ) ;
136+
137+ // Get admin users for each workspace
138+ console . log ( '\nRetrieving admin users for each workspace...' ) ;
139+ const workspacesWithAdmins = [ ] ;
140+
141+ for ( const workspace of workspaces ) {
142+ curReportItem = { } ;
143+ curReportItem . workspace_id = workspace . id ;
144+ curReportItem . workspace_name = workspace . name ;
145+ curReportItem . workspace_type = workspace . type ;
146+ curReportItem . workspace_visibility = workspace . visibility ;
147+ curReportItem . admin_user_ids = [ ] ;
148+ curReportItem . admin_users = [ ] ;
149+ const adminUserIds = await getWorkspaceAdmins ( workspace . id ) ;
150+ curReportItem . admin_user_ids = adminUserIds ;
151+
152+ /*workspacesWithAdmins.push({
153+ id: workspace.id,
154+ name: workspace.name,
155+ type: workspace.type,
156+ adminUserIds
157+ });*/
158+
159+ // Small delay to avoid rate limiting
160+ await new Promise ( resolve => setTimeout ( resolve , 100 ) ) ;
161+ }
162+
163+
164+
165+ } catch ( error ) {
166+ console . error ( 'Error in main execution:' , error ) ;
167+ process . exit ( 1 ) ;
168+ }
169+ }
170+
90171// Execute the main function
91- getTeamWorkspaces ( ) . catch ( error => {
172+ main ( ) . catch ( error => {
92173 console . error ( 'Unhandled error:' , error ) ;
93174 process . exit ( 1 ) ;
94175} ) ;
0 commit comments