'use strict' let _ = require('lodash') let cli = require('heroku-cli-util') let co = require('co') let Utils = require('../../lib/utils') const { flags } = require('@heroku-cli/command') const { RoleCompletion } = require('@heroku-cli/command/lib/completions') function * run (context, heroku) { let orgInfo = yield Utils.orgInfo(context, heroku) let groupName = context.org || context.team || context.flags.team let teamInvites = [] if (orgInfo.type === 'team') { let orgFeatures = yield heroku.get(`/organizations/${groupName}/features`) if (orgFeatures.find(feature => feature.name === 'team-invite-acceptance' && feature.enabled)) { teamInvites = yield heroku.request({ headers: { Accept: 'application/vnd.heroku+json; version=3.team-invitations' }, method: 'GET', path: `/organizations/${groupName}/invitations` }) teamInvites = _.map(teamInvites, function (invite) { return { email: invite.user.email, role: invite.role, status: 'pending' } }) } } let members = yield heroku.get(`/organizations/${groupName}/members`) // Set status '' to all existing members _.map(members, (member) => { member.status = '' }) members = _.sortBy(_.union(members, teamInvites), 'email') if (context.flags.role) members = members.filter(m => m.role === context.flags.role) if (context.flags.pending) members = members.filter(m => m.status === 'pending') if (context.flags.json) { cli.log(JSON.stringify(members, null, 3)) } else if (members.length === 0) { let msg = `No members in ${cli.color.magenta(groupName)}` if (context.flags.role) msg += ` with role ${cli.color.green(context.flags.role)}` cli.log(msg) } else { cli.table(members, { printHeader: false, columns: [ { key: 'email', label: 'Email', format: e => cli.color.cyan(e) }, { key: 'role', label: 'Role', format: r => cli.color.green(r) }, { key: 'status', label: 'Status', format: r => cli.color.green(r) } ] }) } Utils.warnUsingOrgFlagInTeams(orgInfo, context) } module.exports = { topic: 'members', description: 'list members of an organization or a team', needsAuth: true, wantsOrg: true, flags: [ { name: 'role', char: 'r', hasValue: true, description: 'filter by role', completion: RoleCompletion }, { name: 'pending', hasValue: false, description: 'filter by pending team invitations' }, { name: 'json', description: 'output in json format' }, // flags.org({name: 'org', hasValue: true, description: 'org to use', hidden: false}), flags.team({ name: 'team', hasValue: true, hidden: true }) ], run: cli.command(co.wrap(run)) }