/
dao.go
112 lines (98 loc) · 2.76 KB
/
dao.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
package auth
import (
"time"
"github.com/itpkg/reading/api/core"
"github.com/jinzhu/gorm"
)
type Dao struct {
Db *gorm.DB `inject:""`
}
func (p *Dao) Log(user uint, message string) error {
return p.Db.Create(&Log{UserID: user, Message: message}).Error
}
func (p *Dao) GetUser(uid string) (*User, error) {
user := User{}
err := p.Db.Where("uid = ?", uid).First(&user).Error
return &user, err
}
func (p *Dao) ListUser() []User {
users := make([]User, 0)
p.Db.Find(&users)
return users
}
func (p *Dao) SaveUser(pty, pid, email, name, home, logo string) (*User, error) {
db := p.Db
user := User{}
var err error
if db.Where("provider_id = ? AND provider_type = ?", pid, pty).First(&user).RecordNotFound() {
user = User{
Name: name,
Email: email,
Home: home,
Logo: logo,
Uid: core.Uuid(),
ProviderId: pid,
ProviderType: pty,
LastSignIn: time.Now(),
SignInCount: 1,
}
err = p.Db.Create(&user).Error
} else {
err = db.Model(&user).UpdateColumns(map[string]interface{}{
"name": name,
"email": email,
"home": home,
"logo": logo,
"last_sign_in": time.Now(),
"sign_in_count": user.SignInCount + 1,
}).Error
}
return &user, err
}
func (p *Dao) Is(user uint, name string) bool {
return p.Can(user, name, "-", 0)
}
func (p *Dao) Can(user uint, name string, resource_type string, resource_id uint) bool {
var r Role
if p.Db.Where("name = ? AND resource_type = ? AND resource_id = ?", name, resource_type, resource_id).First(&r).RecordNotFound() {
return false
}
var pm Permission
if p.Db.Where("user_id = ? AND role_id = ?", user, r.ID).First(&pm).RecordNotFound() {
return false
}
return pm.Enable()
}
func (p *Dao) Role(name string, resource_type string, resource_id uint) (*Role, error) {
var e error
r := Role{}
db := p.Db
if db.Where("name = ? AND resource_type = ? AND resource_id = ?", name, resource_type, resource_id).First(&r).RecordNotFound() {
r = Role{
Name: name,
ResourceType: resource_type,
ResourceId: resource_id,
}
e = db.Create(&r).Error
}
return &r, e
}
func (p *Dao) Deny(role uint, user uint) error {
return p.Db.Where("role_id = ? AND user_id = ?", role, user).Delete(Permission{}).Error
}
func (p *Dao) Allow(role uint, user uint, dur time.Duration) error {
begin := time.Now()
end := begin.Add(dur)
var count int
p.Db.Model(&Permission{}).Where("role_id = ? AND user_id = ?", role, user).Count(&count)
if count == 0 {
return p.Db.Create(&Permission{
UserID: user,
RoleID: role,
Begin: begin,
End: end,
}).Error
} else {
return p.Db.Model(&Permission{}).Where("role_id = ? AND user_id = ?", role, user).UpdateColumns(map[string]interface{}{"begin": begin, "end": end}).Error
}
}