commands/apps/transfer.js
'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)
}
}
]