-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathgroupAssignments.ts
More file actions
82 lines (69 loc) · 2.4 KB
/
Copy pathgroupAssignments.ts
File metadata and controls
82 lines (69 loc) · 2.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import validator from 'validator'
import {
IUserInfo,
requestGroups,
requestInfoByUserId,
requestUserInfo,
setGroup,
} from './authService'
import { getSettings } from '../datasources/transitlogServer'
import { compact, difference, flatten, get, groupBy, map, uniq } from 'lodash'
export async function assignUserToGroups(userInfo: IUserInfo): Promise<IUserInfo> {
if (!userInfo.email) {
return userInfo
}
if (!validator.isEmail(userInfo.email)) {
return userInfo
}
const settings = await getSettings()
const domainGroups = settings.domain_groups
const autoDomainGroups = settings.auto_domain_groups
// Merge domain groups and auto-created groups into one domain groups array.
const assignGroups = map(
groupBy(domainGroups.concat(autoDomainGroups), 'domain'),
(mergedDomainGroups, domain) => {
const groups = flatten(uniq(mergedDomainGroups.map(({ groups }) => groups)))
return {
domain,
groups,
}
}
)
const sessionGroups = userInfo.groups
const parsedDomains = userInfo.email.split('@')
const emailDomain = parsedDomains[parsedDomains.length - 1]?.toLowerCase()
const emailDomainGroups = assignGroups.filter(
(dg) => emailDomain === dg.domain.toLowerCase()
)
const groupAssignments = uniq(flatten(emailDomainGroups.map(({ groups }) => groups)))
const assignToGroups = difference(groupAssignments, sessionGroups)
if (assignToGroups.length !== 0) {
console.log(`Assigning groups: ${assignToGroups.join(', ')}`)
const groupsResponse = await requestGroups()
const resources = get(groupsResponse, 'resources', [])
if (resources.length === 0) {
console.log('No groups returned from auth service.')
return userInfo
}
// Get IDs for each group and remove undefineds.
const groupIds = compact(
assignToGroups.map((groupName) => {
return get(
resources.find((element) => element.name === groupName),
'id',
''
)
})
)
const userResponse = await requestInfoByUserId(userInfo.userId)
const memberships = get(userResponse, 'memberOf', [])
const groups = [...memberships, ...groupIds]
await setGroup(userInfo.userId, groups)
const newUserInfo = await requestUserInfo(userInfo.accessToken)
if (newUserInfo) {
userInfo.groups = newUserInfo.groups
console.log(`User's groups updated.`)
}
}
return userInfo
}