1 | let _ = require('lodash')
|
2 | let cli = require('heroku-cli-util')
|
3 | let error = require('./error')
|
4 |
|
5 | let getOwner = function (owner) {
|
6 | if (isteamApp(owner)) {
|
7 | return owner.split('@herokumanager.com')[0]
|
8 | }
|
9 | return owner
|
10 | }
|
11 |
|
12 | let isteamApp = function (owner) {
|
13 | return (/@herokumanager\.com$/.test(owner))
|
14 | }
|
15 |
|
16 | let isValidEmail = function (email) {
|
17 | 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)
|
18 | }
|
19 |
|
20 | let printGroups = function (group, type = {label: 'Team'}) {
|
21 | group = _.sortBy(group, 'name')
|
22 | cli.table(group, {
|
23 | columns: [
|
24 | {key: 'name', label: type.label, format: o => cli.color.green(o)},
|
25 | {key: 'role', label: 'Role', format: r => r}
|
26 | ],
|
27 | printHeader: false
|
28 | })
|
29 | }
|
30 |
|
31 | let printGroupsJSON = function (group) {
|
32 | cli.log(JSON.stringify(group, null, 2))
|
33 | }
|
34 |
|
35 | let teamInfo = async function (context, heroku) {
|
36 | let teamName = context.flags.team
|
37 | if (!teamName) error.exit(1, 'No team or org specified.\nRun this command with --team')
|
38 | return await heroku.get(`/teams/${teamName}`);
|
39 | }
|
40 |
|
41 | let addMemberToTeam = async function (email, role, groupName, heroku, method = 'PUT') {
|
42 | let request = heroku.request({
|
43 | method: method,
|
44 | path: `/teams/${groupName}/members`,
|
45 | body: {email, role}
|
46 | })
|
47 | await cli.action(`Adding ${cli.color.cyan(email)} to ${cli.color.magenta(groupName)} as ${cli.color.green(role)}`, request)
|
48 | }
|
49 |
|
50 | let warnIfAtTeamMemberLimit = async function (teamInfo, groupName, context, heroku) {
|
51 |
|
52 | const FREE_TEAM_LIMIT = 6
|
53 |
|
54 | if (teamInfo.type === 'team') {
|
55 | let membersAndInvites = {
|
56 | invites: await heroku.request({
|
57 | headers: {
|
58 | Accept: 'application/vnd.heroku+json; version=3.team-invitations'
|
59 | },
|
60 | method: 'GET',
|
61 | path: `/teams/${groupName}/invitations`
|
62 | }),
|
63 | members: await heroku.get(`/teams/${groupName}/members`)
|
64 | }
|
65 | const membersCount = membersAndInvites.invites.length + membersAndInvites.members.length
|
66 | if (membersCount === FREE_TEAM_LIMIT) cli.warn("You'll be billed monthly for teams over 5 members.")
|
67 | }
|
68 | }
|
69 |
|
70 | module.exports = {
|
71 | addMemberToTeam,
|
72 | getOwner,
|
73 | isteamApp,
|
74 | isValidEmail,
|
75 | teamInfo,
|
76 | printGroups,
|
77 | printGroupsJSON,
|
78 | warnIfAtTeamMemberLimit
|
79 | }
|