|
| 1 | +import { confirm } from './utils/input.js' |
| 2 | +import { removeFromNpm } from './utils/remove-from-npm.js' |
1 | 3 | /** |
2 | 4 | * Offboards a user from an organization. |
3 | | - * @param {{ logger: import('pino').Logger }} deps |
4 | | - * @param {{ org: string, username: string, dryRun: boolean }} options |
| 5 | + * @param {{ client: import('../github-api.js').default, logger: import('pino').Logger }} deps |
| 6 | + * @param {{ org: string, username: string, joiningTeams: Set, dryRun: boolean }} options |
5 | 7 | * @returns {Promise<void>} |
6 | 8 | */ |
7 | | -export default async function offboard ({ logger }, { username, dryRun }) { |
8 | | - // Implement offboarding logic here |
9 | | - if (dryRun) { |
10 | | - logger.info(`[DRY RUN] Would offboard user: ${username}`) |
11 | | - } else { |
12 | | - logger.info(`Offboarding user: ${username}`) |
| 9 | +export default async function offboard ({ logger, client }, { org, username, dryRun }) { |
| 10 | + const joiningUser = await client.getUserInfo(username) |
| 11 | + if (!await confirm(`Are you sure you want to offboard ${joiningUser.login} [${joiningUser.name}] to ${org}?`)) { |
| 12 | + logger.warn('Aborting offboarding') |
| 13 | + process.exit(0) |
13 | 14 | } |
| 15 | + |
| 16 | + const orgData = await client.getOrgData(org) |
| 17 | + logger.info('Organization ID %s', orgData.id) |
| 18 | + const orgTeams = await client.getOrgChart(orgData) |
| 19 | + |
| 20 | + /** GitHub Cleanup */ |
| 21 | + const userTeams = orgTeams.filter(t => t.members.find(m => m.login === joiningUser.login)) |
| 22 | + |
| 23 | + for (const team of userTeams) { |
| 24 | + if (dryRun) { |
| 25 | + logger.warn('[DRY RUN] This user %s will be removed from team %s', joiningUser.login, team.slug) |
| 26 | + continue |
| 27 | + } |
| 28 | + |
| 29 | + await client.removeUserFromTeam(orgData.name, team.slug, joiningUser.login) |
| 30 | + logger.info('Removed %s from team %s', joiningUser.login, team.slug) |
| 31 | + } |
| 32 | + logger.info('GitHub offboarding completed for user %s ✅ ', joiningUser.login) |
| 33 | + |
| 34 | + /** NPM Cleanup */ |
| 35 | + const userNpmTeams = [ |
| 36 | + { slug: 'developers' }, // NPM has a default team for every org |
| 37 | + ...userTeams |
| 38 | + ] |
| 39 | + |
| 40 | + for (const team of userNpmTeams) { |
| 41 | + if (dryRun) { |
| 42 | + logger.warn('[DRY RUN] This user %s will be removed from NPM team %s', joiningUser.login, team.slug) |
| 43 | + continue |
| 44 | + } |
| 45 | + |
| 46 | + try { |
| 47 | + logger.debug('Removing %s from NPM team %s', joiningUser.login, team.slug) |
| 48 | + await removeFromNpm(org, team.slug, joiningUser.login) |
| 49 | + logger.info('Removed %s from NPM team %s', joiningUser.login, team.slug) |
| 50 | + } catch (error) { |
| 51 | + logger.error('Failed to remove %s from NPM team %s', joiningUser.login, team.slug) |
| 52 | + logger.error(error) |
| 53 | + } |
| 54 | + } |
| 55 | + logger.info('NPM offboarding completed for user %s ✅ ', joiningUser.login) |
14 | 56 | } |
0 commit comments