heroku/heroku-orgs

View on GitHub
commands/access/index.js

Summary

Maintainability
A
2 hrs
Test Coverage
'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)
    }
  }
]