heroku/heroku-orgs

View on GitHub
commands/apps/transfer.js

Summary

Maintainability
B
5 hrs
Test Coverage
'use strict'

let _ = require('lodash')
let AppTransfer = require('../../lib/app_transfer')
let cli = require('heroku-cli-util')
let co = require('co')
let inquirer = require('inquirer')
let lock = require('./lock.js')[0]
let Utils = require('../../lib/utils')

function getAppsToTransfer (apps) {
  return inquirer.prompt([{
    type: 'checkbox',
    name: 'choices',
    pageSize: 20,
    message: 'Select applications you would like to transfer',
    choices: apps.map(function (app) {
      return {
        name: `${app.name} (${Utils.getOwner(app.owner.email)})`,
        value: { name: app.name, owner: app.owner.email }
      }
    })
  }])
}

function * run (context, heroku) {
  let app = context.app
  let recipient = context.args.recipient

  // App transfers in bulk
  if (context.flags.bulk) {
    let allApps = yield heroku.get('/apps')
    let selectedApps = yield getAppsToTransfer(_.sortBy(allApps, 'name'))
    cli.console.error(`Transferring applications to ${cli.color.magenta(recipient)}...
`)

    for (let app of selectedApps.choices) {
      try {
        let appTransfer = new AppTransfer({
          heroku: heroku,
          appName: app.name,
          recipient: recipient,
          personalToPersonal: Utils.isValidEmail(recipient) && !Utils.isOrgApp(app.owner),
          bulk: true
        })
        yield appTransfer.start()
      } catch (err) {
        cli.error(err)
      }
    }
  } else { // Single app transfer
    let appInfo = yield heroku.get(`/apps/${app}`)

    // Shows warning when app is transferred from a team/org to a personal account
    if (Utils.isValidEmail(recipient) && Utils.isOrgApp(appInfo.owner.email)) {
      yield cli.confirmApp(app, context.flags.confirm, 'All collaborators will be removed from this app')
    }

    let appTransfer = new AppTransfer({
      heroku: heroku,
      appName: appInfo.name,
      recipient: recipient,
      personalToPersonal: Utils.isValidEmail(recipient) && !Utils.isOrgApp(appInfo.owner.email)
    })
    yield appTransfer.start()

    if (context.flags.locked) {
      yield lock.run(context)
    }
  }
}

let cmd = {
  topic: 'apps',
  command: 'transfer',
  description: 'transfer applications to another user or team',
  needsAuth: true,
  wantsApp: true,
  run: cli.command(co.wrap(run)),
  args: [
    {name: 'recipient', description: 'user or team to transfer applications to'}
  ],
  flags: [
    {name: 'locked', char: 'l', hasValue: false, required: false, description: 'lock the app upon transfer'},
    {name: 'bulk', hasValue: false, required: false, description: 'transfer applications in bulk'}
  ],
  examples: `$ heroku apps:transfer collaborator@example.com
Transferring example to collaborator@example.com... done

$ heroku apps:transfer acme-widgets
Transferring example to acme-widgets... done

$ heroku apps:transfer --bulk acme-widgets
...`
}

module.exports = [
  cmd,
  {
    topic: 'sharing',
    command: 'transfer',
    help: 'this command is now heroku apps:transfer',
    variableArgs: true,
    hidden: true,
    run: () => {
      cli.error(`This command is now ${cli.color.cyan('heroku apps:transfer')}`)
      process.exit(1)
    }
  }
]