1 | 'use strict'
|
2 |
|
3 | let cli = require('heroku-cli-util')
|
4 | let _ = require('lodash')
|
5 | let Utils = require('../../lib/utils')
|
6 | let co = require('co')
|
7 |
|
8 | function printJSON (collaborators) {
|
9 | cli.log(JSON.stringify(collaborators, null, 2))
|
10 | }
|
11 |
|
12 | function 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 |
|
36 | function * 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'})
|
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 |
|
69 | module.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 | ]
|