UNPKG

2.62 kBJavaScriptView Raw
1'use strict'
2
3let cli = require('heroku-cli-util')
4let _ = require('lodash')
5let Utils = require('../../lib/utils')
6let co = require('co')
7
8function printJSON (collaborators) {
9 cli.log(JSON.stringify(collaborators, null, 2))
10}
11
12function printAccess (app, collaborators) {
13 let showPermissions = Utils.isOrgApp(app.owner.email)
14 collaborators = _.chain(collaborators)
15 .sortBy(c => c.email || c.user.email)
16 .reject(c => /herokumanager\.com$/.test(c.user.email))
17 .map(collab => {
18 let email = collab.user.email
19 let role = collab.role
20 let data = { email: email, role: role || 'collaborator' }
21
22 if (showPermissions) {
23 data.permissions = _.map(_.sortBy(collab.permissions, 'name'), 'name')
24 }
25 return data
26 }).value()
27
28 let columns = [
29 {key: 'email', label: 'Email', format: e => cli.color.cyan(e)},
30 {key: 'role', label: 'Role', format: r => cli.color.green(r)}
31 ]
32 if (showPermissions) columns.push({key: 'permissions', label: 'Permissions'})
33 cli.table(collaborators, {printHeader: false, columns})
34}
35
36function * run (context, heroku) {
37 let appName = context.app
38
39 let app = yield heroku.get(`/apps/${appName}`)
40 let isOrgApp = Utils.isOrgApp(app.owner.email)
41 let collaborators = yield heroku.get(`/apps/${appName}/collaborators`)
42
43 if (isOrgApp) {
44 let orgName = Utils.getOwner(app.owner.email)
45
46 try {
47 const members = yield heroku.get(`/organizations/${orgName}/members`)
48 let admins = members.filter(member => member.role === 'admin')
49
50 let adminPermissions = yield heroku.get('/organizations/permissions')
51
52 admins = _.forEach(admins, function (admin) {
53 admin.user = { email: admin.email }
54 admin.permissions = adminPermissions
55 return admin
56 })
57
58 collaborators = _.reject(collaborators, {role: 'admin'}) // Admins might have already permissions
59 collaborators = _.union(collaborators, admins)
60 } catch (err) {
61 if (err.statusCode !== 403) throw err
62 }
63 }
64
65 if (context.flags.json) printJSON(collaborators)
66 else printAccess(app, collaborators)
67}
68
69module.exports = [
70 {
71 topic: 'access',
72 description: 'list who has access to an app',
73 needsAuth: true,
74 needsApp: true,
75 flags: [
76 {name: 'json', description: 'output in json format'}
77 ],
78 run: cli.command(co.wrap(run))
79 },
80 {
81 topic: 'sharing',
82 command: 'access',
83 help: 'This command is now heroku access',
84 variableArgs: true,
85 hidden: true,
86 run: () => {
87 cli.error(`This command is now ${cli.color.cyan('heroku access')}`)
88 process.exit(1)
89 }
90 }
91]