/
special.go
125 lines (117 loc) · 3.34 KB
/
special.go
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
Copyright © 2020-2023 Hannes Hayashi
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package gsmadmin
import (
"fmt"
"strings"
"sync"
"github.com/hanneshayashi/gsm/gsmhelpers"
)
// GetUniqueUsersChannelRecursive returns a channel containing unique email addresses of all users inside the specified orgUnits and groups
func GetUniqueUsersChannelRecursive(orgUnits, groupEmails []string, threads int) (<-chan string, <-chan error) {
wgOrgUnits := &sync.WaitGroup{}
wgGroups := &sync.WaitGroup{}
wgUnique := &sync.WaitGroup{}
userKeys := make(chan string, threads)
userKeysUnique := make(chan string, threads)
done := make(map[string]struct{})
errChan := make(chan error, 2)
wgOrgUnits.Add(1)
go func() {
for i := range orgUnits {
us, err := ListUsers(false, fmt.Sprintf("orgUnitPath=%s", orgUnits[i]), "", "my_customer", "users(primaryEmail),nextPageToken", "", "", "", "", "", threads)
for u := range us {
userKeys <- u.PrimaryEmail
}
e := <-err
if e != nil {
errChan <- e
break
}
}
wgOrgUnits.Done()
}()
wgGroups.Add(1)
go func() {
for i := range groupEmails {
mems, err := ListMembers(groupEmails[i], "", "members(email,type),nextPageToken", true, threads)
for m := range mems {
if m.Type == "USER" {
userKeys <- m.Email
}
}
e := <-err
if e != nil {
errChan <- e
break
}
}
wgGroups.Done()
}()
wgUnique.Add(1)
go func() {
for uk := range userKeys {
if _, found := done[uk]; !found {
userKeysUnique <- uk
done[uk] = struct{}{}
}
}
wgUnique.Done()
}()
go func() {
wgGroups.Wait()
wgOrgUnits.Wait()
close(userKeys)
wgUnique.Wait()
close(userKeysUnique)
close(errChan)
}()
return userKeysUnique, errChan
}
// GetMembersToSet compares the list of current members of a group to the specified emailAddresses.
// The function will return a list of members to be added and / or removed.
func GetMembersToSet(groupKey string, threads int, emailAddresses ...string) (<-chan string, <-chan string, error) {
currentMembers, err := ListMembers(groupKey, "", "members(email)", false, threads)
var cLower []string
for cm := range currentMembers {
cLower = append(cLower, strings.ToLower(cm.Email))
}
e := <-err
if e != nil {
return nil, nil, e
}
membersToAdd := make(chan string, threads)
membersToRemove := make(chan string, threads)
var nLower []string
for i := range emailAddresses {
nLower = append(nLower, strings.ToLower(emailAddresses[i]))
}
go func() {
for i := range nLower {
if !gsmhelpers.Contains(nLower[i], cLower) {
membersToAdd <- nLower[i]
}
}
close(membersToAdd)
}()
go func() {
for i := range cLower {
if !gsmhelpers.Contains(cLower[i], nLower) {
membersToRemove <- cLower[i]
}
}
close(membersToRemove)
}()
return membersToAdd, membersToRemove, nil
}