heroku/heroku-orgs

View on GitHub
lib/utils.js

Summary

Maintainability
A
2 hrs
Test Coverage
let _ = require('lodash')
let cli = require('heroku-cli-util')
let error = require('./error')

let getOwner = function (owner) {
  if (isOrgApp(owner)) {
    return owner.split('@herokumanager.com')[0]
  }
  return owner
}

let isOrgApp = function (owner) {
  return (/@herokumanager\.com$/.test(owner))
}

let isValidEmail = function (email) {
  return /^(([^<>()[\]\\.,;:\s@"]+(\.[^<>()[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(email)
}

let printGroups = function (group, type = {label: 'Organization'}) {
  group = _.sortBy(group, 'name')
  cli.table(group, {
    columns: [
      {key: 'name', label: type.label, format: o => cli.color.green(o)},
      {key: 'role', label: 'Role', format: r => r}
    ],
    printHeader: false
  })
}

let printGroupsJSON = function (group) {
  cli.log(JSON.stringify(group, null, 2))
}

let orgInfo = function * (context, heroku) {
  let teamOrOrgName = context.org || context.flags.team
  if (!teamOrOrgName) error.exit(1, 'No team or org specified.\nRun this command with --team or --org')
  return yield heroku.get(`/organizations/${context.org || context.flags.team}`)
}

let warnUsingOrgFlagInTeams = function (orgInfo, context) {
  if ((orgInfo.type === 'team') && (!context.flags.team)) {
    cli.warn(`${cli.color.cmd(context.org)} is a Heroku Team\nHeroku CLI now supports Heroku Teams.\nUse ${cli.color.cmd('-t')} or ${cli.color.cmd('--team')} for teams like ${cli.color.cmd(context.org)}`)
  }
}

let addMemberToOrg = function * (email, role, groupName, heroku, method = 'PUT') {
  let request = heroku.request({
    method: method,
    path: `/organizations/${groupName}/members`,
    body: {email, role}
  })
  yield cli.action(`Adding ${cli.color.cyan(email)} to ${cli.color.magenta(groupName)} as ${cli.color.green(role)}`, request)
}

let warnIfAtTeamMemberLimit = async function (orgInfo, groupName, context, heroku) {
  // Users receive `You'll be billed monthly for teams over 5 members.`
  const FREE_TEAM_LIMIT = 6

  if (orgInfo.type === 'team') {
    let membersAndInvites = {
      invites: await heroku.request({
        headers: {
          Accept: 'application/vnd.heroku+json; version=3.team-invitations'
        },
        method: 'GET',
        path: `/organizations/${groupName}/invitations`
      }),
      members: await heroku.get(`/organizations/${groupName}/members`)
    }
    const membersCount = membersAndInvites.invites.length + membersAndInvites.members.length
    if (membersCount === FREE_TEAM_LIMIT) cli.warn("You'll be billed monthly for teams over 5 members.")
  }
}

module.exports = {
  addMemberToOrg,
  getOwner,
  isOrgApp,
  isValidEmail,
  orgInfo,
  printGroups,
  printGroupsJSON,
  warnIfAtTeamMemberLimit,
  warnUsingOrgFlagInTeams
}