commands/access/index.js
'use strict'
let cli = require('heroku-cli-util')
let _ = require('lodash')
let Utils = require('../../lib/utils')
function printJSON (collaborators) {
cli.log(JSON.stringify(collaborators, null, 2))
}
function printAccess (app, collaborators) {
let showPermissions = Utils.isOrgApp(app.owner.email)
collaborators = _.chain(collaborators)
.sortBy(c => c.email || c.user.email)
.reject(c => /herokumanager\.com$/.test(c.user.email))
.map(collab => {
let email = collab.user.email
let role = collab.role
let data = { email: email, role: role || 'collaborator' }
if (showPermissions) {
data.permissions = _.map(_.sortBy(collab.permissions, 'name'), 'name')
}
return data
}).value()
let columns = [
{key: 'email', label: 'Email', format: e => cli.color.cyan(e)},
{key: 'role', label: 'Role', format: r => cli.color.green(r)}
]
if (showPermissions) columns.push({key: 'permissions', label: 'Permissions'})
cli.table(collaborators, {printHeader: false, columns})
}
async function run (context, heroku) {
let appName = context.app
let app = await heroku.get(`/apps/${appName}`)
let isOrgApp = Utils.isOrgApp(app.owner.email)
let collaborators = await heroku.get(`/apps/${appName}/collaborators`)
if (isOrgApp) {
let orgName = Utils.getOwner(app.owner.email)
try {
const members = await heroku.get(`/organizations/${orgName}/members`)
let admins = members.filter(member => member.role === 'admin')
let adminPermissions = await heroku.get('/organizations/permissions')
admins = _.forEach(admins, function (admin) {
admin.user = { email: admin.email }
admin.permissions = adminPermissions
return admin
})
collaborators = _.reject(collaborators, {role: 'admin'}) // Admins might have already permissions
collaborators = _.union(collaborators, admins)
} catch (err) {
if (err.statusCode !== 403) throw err
}
}
if (context.flags.json) printJSON(collaborators)
else printAccess(app, collaborators)
}
module.exports = [
{
topic: 'access',
description: 'list who has access to an app',
needsAuth: true,
needsApp: true,
flags: [
{name: 'json', description: 'output in json format'}
],
run: cli.command(run)
},
{
topic: 'sharing',
command: 'access',
help: 'This command is now heroku access',
variableArgs: true,
hidden: true,
run: () => {
cli.error(`This command is now ${cli.color.cyan('heroku access')}`)
process.exit(1)
}
}
]