Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
alist-org
GitHub Repository: alist-org/alist
Path: blob/main/internal/db/role.go
2323 views
1
package db
2
3
import (
4
"github.com/alist-org/alist/v3/internal/model"
5
"github.com/pkg/errors"
6
"path"
7
"strings"
8
)
9
10
func GetRole(id uint) (*model.Role, error) {
11
var r model.Role
12
if err := db.First(&r, id).Error; err != nil {
13
return nil, errors.Wrapf(err, "failed get role")
14
}
15
return &r, nil
16
}
17
18
func GetRoleByName(name string) (*model.Role, error) {
19
r := model.Role{Name: name}
20
if err := db.Where(r).First(&r).Error; err != nil {
21
return nil, errors.Wrapf(err, "failed get role")
22
}
23
return &r, nil
24
}
25
26
func GetRoles(pageIndex, pageSize int) (roles []model.Role, count int64, err error) {
27
roleDB := db.Model(&model.Role{})
28
if err = roleDB.Count(&count).Error; err != nil {
29
return nil, 0, errors.Wrapf(err, "failed get roles count")
30
}
31
if err = roleDB.Order(columnName("id")).Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&roles).Error; err != nil {
32
return nil, 0, errors.Wrapf(err, "failed get find roles")
33
}
34
return roles, count, nil
35
}
36
37
func GetAllRoles() ([]model.Role, error) {
38
var roles []model.Role
39
if err := db.Find(&roles).Error; err != nil {
40
return nil, errors.WithStack(err)
41
}
42
return roles, nil
43
}
44
45
func CreateRole(r *model.Role) error {
46
if err := db.Create(r).Error; err != nil {
47
return errors.WithStack(err)
48
}
49
if r.Default {
50
if err := db.Model(&model.Role{}).Where("id <> ?", r.ID).Update("default", false).Error; err != nil {
51
return errors.WithStack(err)
52
}
53
}
54
return nil
55
}
56
57
func UpdateRole(r *model.Role) error {
58
if err := db.Save(r).Error; err != nil {
59
return errors.WithStack(err)
60
}
61
if r.Default {
62
if err := db.Model(&model.Role{}).Where("id <> ?", r.ID).Update("default", false).Error; err != nil {
63
return errors.WithStack(err)
64
}
65
}
66
return nil
67
}
68
69
func DeleteRole(id uint) error {
70
return errors.WithStack(db.Delete(&model.Role{}, id).Error)
71
}
72
73
func UpdateRolePermissionsPathPrefix(oldPath, newPath string) ([]uint, error) {
74
var roles []model.Role
75
var modifiedRoleIDs []uint
76
77
if err := db.Find(&roles).Error; err != nil {
78
return nil, errors.WithMessage(err, "failed to load roles")
79
}
80
81
for _, role := range roles {
82
updated := false
83
for i, entry := range role.PermissionScopes {
84
entryPath := path.Clean(entry.Path)
85
oldPathClean := path.Clean(oldPath)
86
87
if entryPath == oldPathClean {
88
role.PermissionScopes[i].Path = newPath
89
updated = true
90
} else if strings.HasPrefix(entryPath, oldPathClean+"/") {
91
role.PermissionScopes[i].Path = newPath + entryPath[len(oldPathClean):]
92
updated = true
93
}
94
}
95
if updated {
96
if err := UpdateRole(&role); err != nil {
97
return nil, errors.WithMessagef(err, "failed to update role ID %d", role.ID)
98
}
99
modifiedRoleIDs = append(modifiedRoleIDs, role.ID)
100
}
101
}
102
return modifiedRoleIDs, nil
103
}
104
105