-
Notifications
You must be signed in to change notification settings - Fork 187
/
user.go
136 lines (112 loc) · 3.02 KB
/
user.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
133
134
135
136
package application
import (
"fmt"
"github.com/eolinker/eosc"
)
type IUser interface {
Username() string
}
type User struct {
Labels map[string]string `json:"labels" label:"用户标签"`
Expire int64 `json:"expire" label:"过期时间" format:"date-time"`
HideCredential bool `json:"hide_credential" label:"是否隐藏证书"`
}
type UserInfo struct {
Name string
Value string
Expire int64
HideCredential bool
Labels map[string]string
TokenName string
Position string
App IApp
Additional interface{}
}
var _ IUserManager = (*UserManager)(nil)
type IUserManager interface {
Get(name string) (*UserInfo, bool)
Set(appID string, user []*UserInfo)
Del(name string)
Check(appID string, driver string, users []IUser) error
DelByAppID(appID string)
List() []*UserInfo
Count() int
}
type UserManager struct {
// users map[string]IUser
users eosc.Untyped[string, *UserInfo]
connApp eosc.Untyped[string, []string]
}
func (u *UserManager) Check(appID string, driver string, users []IUser) error {
us := make(map[string]IUser)
for _, user := range users {
t, ok := u.get(user.Username())
if ok {
if t.App.Id() != appID {
return fmt.Errorf("[%s] user(%s) is existed", driver, user.Username())
}
}
if _, ok = us[user.Username()]; ok {
return fmt.Errorf("[%s] user(%s) is repeated", driver, user.Username())
}
us[user.Username()] = user
}
return nil
}
func (u *UserManager) Count() int {
return u.users.Count()
}
func (u *UserManager) List() []*UserInfo {
return u.users.List()
}
func NewUserManager() *UserManager {
return &UserManager{users: eosc.BuildUntyped[string, *UserInfo](), connApp: eosc.BuildUntyped[string, []string]()}
}
func (u *UserManager) Get(name string) (*UserInfo, bool) {
return u.get(name)
}
func (u *UserManager) get(name string) (*UserInfo, bool) {
return u.users.Get(name)
}
func (u *UserManager) Set(appID string, users []*UserInfo) {
userMap := make(map[string]struct{})
names, has := u.getByAppID(appID)
if has {
for _, name := range names {
userMap[name] = struct{}{}
}
}
newUsers := make([]string, 0, len(users))
for _, user := range users {
u.users.Set(user.Name, user)
newUsers = append(newUsers, user.Name)
delete(userMap, user.Name)
}
for name := range userMap {
u.users.Del(name)
}
u.connApp.Set(appID, newUsers)
}
func (u *UserManager) Del(name string) {
u.users.Del(name)
}
func (u *UserManager) DelByAppID(appID string) {
names, has := u.delByAppID(appID)
if !has {
return
}
for _, name := range names {
u.users.Del(name)
}
}
func (u *UserManager) delByAppID(appID string) ([]string, bool) {
return u.connApp.Del(appID)
}
func (u *UserManager) getByAppID(appID string) ([]string, bool) {
return u.connApp.Get(appID)
}
type Auth struct {
Type string `json:"type" label:"鉴权类型" skip:""`
Position string `json:"position" label:"token位置" enum:"header,query,body"`
TokenName string `json:"token_name" label:"token名称"`
}