commands/info.js
'use strict'
const co = require('co')
const cli = require('heroku-cli-util')
const util = require('../lib/util')
function displayDB (db, app) {
if (db.addon.attachment_names) {
cli.styledHeader(db.addon.attachment_names.map(c => cli.color.configVar(c + '_URL')).join(', '))
} else {
cli.styledHeader(db.configVars.map(c => cli.color.configVar(c)).join(', '))
}
if (db.addon.app.name !== app) {
db.db.info.push({name: 'Billing App', values: [cli.color.cyan(db.addon.app.name)]})
}
db.db.info.push({name: 'Add-on', values: [cli.color.addon(db.addon.name)]})
let info = db.db.info.reduce((info, i) => {
if (i.values.length > 0) {
if (i.resolve_db_name) {
info[i.name] = i.values.map(v => util.databaseNameFromUrl(v, db.config))
} else {
info[i.name] = i.values
}
info[i.name] = info[i.name].join(', ')
}
return info
}, {})
let keys = db.db.info.map(i => i.name)
cli.styledObject(info, keys)
cli.log()
}
function * run (context, heroku) {
const {sortBy} = require('lodash')
const host = require('../lib/host')
const fetcher = require('../lib/fetcher')(heroku)
const app = context.app
const db = context.args.database
let addons = []
let config = heroku.get(`/apps/${app}/config-vars`)
if (db) {
addons = yield [fetcher.addon(app, db)]
} else {
addons = yield fetcher.all(app)
if (addons.length === 0) {
cli.log(`${cli.color.app(app)} has no heroku-postgresql databases.`)
return
}
}
let dbs = yield addons.map(addon => {
return {
addon,
config,
db: heroku.request({
host: host(addon),
method: 'get',
path: `/client/v11/databases/${addon.id}`
}).catch(err => {
if (err.statusCode !== 404) throw err
cli.warn(`${cli.color.addon(addon.name)} is not yet provisioned.\nRun ${cli.color.cmd('heroku addons:wait')} to wait until the db is provisioned.`)
})
}
})
dbs = dbs.filter(db => db.db)
dbs.forEach(db => { db.configVars = util.configVarNamesFromValue(db.config, db.db.resource_url) })
dbs = sortBy(dbs, db => db.configVars[0] !== 'DATABASE_URL', 'configVars[0]')
dbs.forEach(db => displayDB(db, app))
}
let cmd = {
topic: 'pg',
description: 'show database information',
needsApp: true,
needsAuth: true,
args: [{name: 'database', optional: true}],
run: cli.command({preauth: true}, co.wrap(run))
}
module.exports = [
cmd,
Object.assign({command: 'info'}, cmd)
]