src/commands/notifications/index.js
'use strict'
let cli = require('heroku-cli-util')
let co = require('co')
let time = require('../../time')
function * run (context, heroku) {
let app = context.app && !context.flags.all ? yield heroku.get(`/apps/${context.app}`) : null
let notifications = yield heroku.request({host: 'telex.heroku.com', path: '/user/notifications'})
if (app) notifications = notifications.filter((n) => n.target.id === app.id)
if (!context.flags.read) {
notifications = notifications.filter((n) => !n.read)
yield Promise.all(notifications.map((n) => heroku.request({host: 'telex.heroku.com', path: `/user/notifications/${n.id}`, method: 'PATCH', body: {read: true}})))
}
function displayNotifications (notifications) {
let wrap = cli.linewrap(2, 80)
let read = context.flags.read ? 'Read' : 'Unread'
cli.styledHeader(app ? `${read} Notifications for ${cli.color.app(app.name)}` : `${read} Notifications`)
for (let n of notifications) {
cli.log(cli.color.yellow(`\n${n.title}\n`))
cli.log(wrap(`${cli.color.dim(time.ago(new Date(n.created_at)))}\n${n.body}`))
for (let followup of n.followup) {
cli.log(wrap(`${cli.color.gray.dim(time.ago(new Date(followup.created_at)))}\n${followup.body}`))
}
}
}
if (context.flags.json) {
cli.styledJSON(notifications)
return
}
if (notifications.length === 0) {
if (context.flags.read) {
if (app) cli.warn(`You have no notifications on ${cli.color.green(app.name)}.\nRun heroku notifications --all to view notifications for all apps.`)
else cli.warn('You have no notifications.')
} else if (app) cli.warn(`No unread notifications on ${cli.color.green(app.name)}.\nRun ${cli.color.cmd('heroku notifications --all')} to view notifications for all apps.`)
else cli.warn(`No unread notifications.\nRun ${cli.color.cmd('heroku notifications --read')} to view read notifications.`)
} else displayNotifications(notifications)
}
module.exports = {
topic: 'notifications',
description: 'display notifications',
needsAuth: true,
wantsApp: true,
flags: [
{name: 'all', description: 'view all notifications (not just the ones for the current app)'},
{name: 'json', description: 'output in json format'},
{name: 'read', description: 'show notifications already read'}
],
run: cli.command(co.wrap(run))
}