1 | 'use strict'
|
2 |
|
3 | const cli = require('heroku-cli-util')
|
4 | const util = require('../lib/util')
|
5 |
|
6 | function displayDB (db, app) {
|
7 | if (db.addon.attachment_names) {
|
8 | cli.styledHeader(db.addon.attachment_names.map(c => cli.color.configVar(c + '_URL')).join(', '))
|
9 | } else {
|
10 | cli.styledHeader(db.configVars.map(c => cli.color.configVar(c)).join(', '))
|
11 | }
|
12 |
|
13 | if (db.addon.app.name !== app) {
|
14 | db.db.info.push({ name: 'Billing App', values: [cli.color.cyan(db.addon.app.name)] })
|
15 | }
|
16 | db.db.info.push({ name: 'Add-on', values: [cli.color.addon(db.addon.name)] })
|
17 |
|
18 | let info = db.db.info.reduce((info, i) => {
|
19 | if (i.values.length > 0) {
|
20 | if (i.resolve_db_name) {
|
21 | info[i.name] = i.values.map(v => util.databaseNameFromUrl(v, db.config))
|
22 | } else {
|
23 | info[i.name] = i.values
|
24 | }
|
25 | info[i.name] = info[i.name].join(', ')
|
26 | }
|
27 | return info
|
28 | }, {})
|
29 | let keys = db.db.info.map(i => i.name)
|
30 | cli.styledObject(info, keys)
|
31 | cli.log()
|
32 | }
|
33 |
|
34 | async function run(context, heroku) {
|
35 | const { sortBy } = require('lodash')
|
36 | const host = require('../lib/host')
|
37 | const fetcher = require('../lib/fetcher')(heroku)
|
38 | const app = context.app
|
39 | const db = context.args.database
|
40 |
|
41 | let addons = []
|
42 | let config = await heroku.get(`/apps/${app}/config-vars`)
|
43 |
|
44 | if (db) {
|
45 | addons = await Promise.all([fetcher.addon(app, db)])
|
46 | } else {
|
47 | addons = await fetcher.all(app)
|
48 | if (addons.length === 0) {
|
49 | cli.log(`${cli.color.app(app)} has no heroku-postgresql databases.`)
|
50 | return
|
51 | }
|
52 | }
|
53 |
|
54 | let dbs = await Promise.all(addons.map(async (addon) => {
|
55 | return {
|
56 | addon,
|
57 | config,
|
58 | db: await heroku.request({
|
59 | host: host(addon),
|
60 | method: 'get',
|
61 | path: `/client/v11/databases/${addon.id}`
|
62 | }).catch(err => {
|
63 | if (err.statusCode !== 404) throw err
|
64 | 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.`)
|
65 | })
|
66 | }
|
67 | }))
|
68 |
|
69 | dbs = dbs.filter(db => db.db)
|
70 | dbs.forEach(db => { db.configVars = util.configVarNamesFromValue(db.config, db.db.resource_url) })
|
71 | dbs = sortBy(dbs, db => db.configVars[0] !== 'DATABASE_URL', 'configVars[0]')
|
72 |
|
73 | dbs.forEach(db => displayDB(db, app))
|
74 | }
|
75 |
|
76 | let cmd = {
|
77 | topic: 'pg',
|
78 | description: 'show database information',
|
79 | needsApp: true,
|
80 | needsAuth: true,
|
81 | args: [{ name: 'database', optional: true }],
|
82 | run: cli.command({ preauth: true }, run)
|
83 | }
|
84 |
|
85 | module.exports = [
|
86 | cmd,
|
87 | Object.assign({ command: 'info' }, cmd)
|
88 | ]
|