1 | 'use strict'
|
2 |
|
3 | let _ = require('lodash')
|
4 | let AppTransfer = require('../../lib/app_transfer')
|
5 | let cli = require('heroku-cli-util')
|
6 | let co = require('co')
|
7 | let extend = require('util')._extend
|
8 | let inquirer = require('inquirer')
|
9 | let lock = require('./lock.js').apps
|
10 | let Utils = require('../../lib/utils')
|
11 |
|
12 | function getAppsToTransfer (apps) {
|
13 | return inquirer.prompt([{
|
14 | type: 'checkbox',
|
15 | name: 'choices',
|
16 | pageSize: 20,
|
17 | message: 'Select applications you would like to transfer',
|
18 | choices: apps.map(function (app) {
|
19 | return {
|
20 | name: `${app.name} (${Utils.getOwner(app.owner.email)})`,
|
21 | value: { name: app.name, owner: app.owner.email }
|
22 | }
|
23 | })
|
24 | }])
|
25 | }
|
26 |
|
27 | function * run (context, heroku) {
|
28 | let app = context.app
|
29 | let recipient = context.args.recipient
|
30 |
|
31 |
|
32 | if (context.flags.bulk) {
|
33 | let allApps = yield heroku.get('/apps')
|
34 | let selectedApps = yield getAppsToTransfer(_.sortBy(allApps, 'name'))
|
35 | cli.console.error(`Transferring applications to ${cli.color.magenta(recipient)}...
|
36 | `)
|
37 |
|
38 | for (let app of selectedApps.choices) {
|
39 | try {
|
40 | let appTransfer = new AppTransfer({
|
41 | heroku: heroku,
|
42 | appName: app.name,
|
43 | recipient: recipient,
|
44 | personalToPersonal: Utils.isValidEmail(recipient) && !Utils.isOrgApp(app.owner),
|
45 | bulk: true
|
46 | })
|
47 | yield appTransfer.start()
|
48 | } catch (err) {
|
49 | cli.error(err)
|
50 | }
|
51 | }
|
52 | } else {
|
53 | let appInfo = yield heroku.get(`/apps/${app}`)
|
54 |
|
55 |
|
56 | if (Utils.isValidEmail(recipient) && Utils.isOrgApp(appInfo.owner.email)) {
|
57 | yield cli.confirmApp(app, context.flags.confirm, 'All collaborators will be removed from this app')
|
58 | }
|
59 |
|
60 | let appTransfer = new AppTransfer({
|
61 | heroku: heroku,
|
62 | appName: appInfo.name,
|
63 | recipient: recipient,
|
64 | personalToPersonal: Utils.isValidEmail(recipient) && !Utils.isOrgApp(appInfo.owner.email)
|
65 | })
|
66 | yield appTransfer.start()
|
67 |
|
68 | if (context.flags.locked) {
|
69 | yield lock.run(context)
|
70 | }
|
71 | }
|
72 | }
|
73 |
|
74 | let cmd = {
|
75 | topic: 'apps',
|
76 | command: 'transfer',
|
77 | description: 'transfer applications to another user, organization or team',
|
78 | needsAuth: true,
|
79 | wantsApp: true,
|
80 | run: cli.command(co.wrap(run)),
|
81 | args: [
|
82 | {name: 'recipient', description: 'user, organization or team to transfer applications to'}
|
83 | ],
|
84 | flags: [
|
85 | {name: 'locked', char: 'l', hasValue: false, required: false, description: 'lock the app upon transfer'},
|
86 | {name: 'bulk', hasValue: false, required: false, description: 'transfer applications in bulk'}
|
87 | ],
|
88 | help: `
|
89 | Examples:
|
90 |
|
91 | $ heroku apps:transfer collaborator@example.com
|
92 | Transferring example to collaborator@example.com... done
|
93 |
|
94 | $ heroku apps:transfer acme-widgets
|
95 | Transferring example to acme-widgets... done
|
96 |
|
97 | $ heroku apps:transfer --bulk acme-widgets
|
98 | ...
|
99 | `
|
100 | }
|
101 |
|
102 | module.exports = cmd
|
103 | module.exports.sharing = extend({}, cmd)
|
104 | module.exports.sharing.hidden = true
|
105 | module.exports.sharing.topic = 'sharing'
|
106 | module.exports.sharing.run = function () {
|
107 | cli.error(`This command is now ${cli.color.cyan('heroku apps:transfer')}`)
|
108 | process.exit(1)
|
109 | }
|