This repository has been archived by the owner on Aug 16, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 6
/
members.go
132 lines (113 loc) · 2.4 KB
/
members.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
126
127
128
129
130
131
132
package user
import (
"errors"
"sort"
)
var (
ErrUserAlreadyJoined = errors.New("user already joined")
ErrCannotModifyPersonalTeam = errors.New("personal team cannot be modified")
ErrTeamWithProjects = errors.New("target team still has some project")
ErrTargetUserNotInTheTeam = errors.New("target user does not exist in the team")
)
type Members struct {
members map[ID]Role
fixed bool
}
func NewMembers() *Members {
m := &Members{members: map[ID]Role{}}
return m
}
func NewFixedMembers(u ID) *Members {
m := &Members{members: map[ID]Role{u: RoleOwner}, fixed: true}
return m
}
func NewMembersWith(members map[ID]Role) *Members {
m := &Members{members: map[ID]Role{}}
for k, v := range members {
m.members[k] = v
}
return m
}
func CopyMembers(members *Members) *Members {
return NewMembersWith(members.members)
}
func (m *Members) Members() map[ID]Role {
members := make(map[ID]Role)
for k, v := range m.members {
members[k] = v
}
return members
}
func (m *Members) ContainsUser(u ID) bool {
for k := range m.members {
if k == u {
return true
}
}
return false
}
func (m *Members) Count() int {
return len(m.members)
}
func (m *Members) GetRole(u ID) Role {
return m.members[u]
}
func (m *Members) UpdateRole(u ID, role Role) error {
if m.fixed {
return ErrCannotModifyPersonalTeam
}
if role == Role("") {
return nil
}
if _, ok := m.members[u]; ok {
m.members[u] = role
} else {
return ErrTargetUserNotInTheTeam
}
return nil
}
func (m *Members) Join(u ID, role Role) error {
if m.fixed {
return ErrCannotModifyPersonalTeam
}
if _, ok := m.members[u]; ok {
return ErrUserAlreadyJoined
}
if role == Role("") {
role = RoleReader
}
m.members[u] = role
return nil
}
func (m *Members) Leave(u ID) error {
if m.fixed {
return ErrCannotModifyPersonalTeam
}
if _, ok := m.members[u]; ok {
delete(m.members, u)
} else {
return ErrTargetUserNotInTheTeam
}
return nil
}
func (m *Members) UsersByRole(role Role) []ID {
users := make([]ID, 0, len(m.members))
for u, r := range m.members {
if r == role {
users = append(users, u)
}
}
sort.SliceStable(users, func(a, b int) bool {
return users[a].Compare(users[b]) > 0
})
return users
}
func (m *Members) IsOnlyOwner(u ID) bool {
return len(m.UsersByRole(RoleOwner)) == 1 && m.members[u] == RoleOwner
}
func (m *Members) Fixed() bool {
if m == nil {
return false
}
return m.fixed
}