heroku/heroku-pg

View on GitHub
commands/info.js

Summary

Maintainability
A
2 hrs
Test Coverage
'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)
]