heroku/heroku-orgs

View on GitHub
commands/access/add.js

Summary

Maintainability
A
1 hr
Test Coverage
'use strict'

let cli = require('heroku-cli-util')
let _ = require('lodash')
let Utils = require('../../lib/utils')
let error = require('../../lib/error')

async function run (context, heroku) {
  let appName = context.app
  let permissions = context.flags.permissions || context.flags.privileges || ''
  let appInfo = await heroku.get(`/apps/${appName}`)
  let output = `Adding ${cli.color.cyan(context.args.email)} access to the app ${cli.color.magenta(appName)}`
  let request
  let orgFeatures = []

  if (Utils.isOrgApp(appInfo.owner.email)) {
    let orgName = Utils.getOwner(appInfo.owner.email)
    orgFeatures = await heroku.get(`/organizations/${orgName}/features`)
  }

  if (orgFeatures.find(feature => feature.name === 'org-access-controls')) {
    if (!permissions) error.exit(1, 'Missing argument: permissions')

    if (context.flags.privileges) cli.warn('DEPRECATION WARNING: use `--permissions` not `--privileges`')

    permissions = permissions.split(',')

    // Give implicit `view` access
    permissions.push('view')
    permissions = _.uniq(permissions.sort())
    output += ` with ${cli.color.green(permissions)} permissions`

    request = heroku.post(`/organizations/apps/${appName}/collaborators`, {
      body: { user: context.args.email, permissions: permissions }
    })
  } else {
    request = heroku.post(`/apps/${appName}/collaborators`, {body: { user: context.args.email }})
  }
  await cli.action(`${output}`, request)
}

module.exports = [
  {
    topic: 'access',
    needsAuth: true,
    needsApp: true,
    command: 'add',
    description: 'add new users to your app',
    examples: [
      '$ heroku access:add user@email.com --app APP # add a collaborator to your app',
      '$ heroku access:add user@email.com --app APP --permissions deploy,manage,operate # permissions must be comma separated'
    ],
    args: [{name: 'email', optional: false}],
    flags: [
      {name: 'permissions', char: 'p', description: 'list of permissions comma separated', hasValue: true, optional: true},
      {name: 'privileges', hasValue: true, optional: true, hidden: true} // Deprecated flag
    ],
    run: cli.command(run)
  }, {
    topic: 'sharing',
    command: 'add',
    help: `this command is now heroku access:add`,
    variableArgs: true,
    hidden: true,
    run: () => {
      cli.error(`This command is now ${cli.color.cyan('heroku access:add')}`)
      process.exit(1)
    }
  }
]