-
-
Notifications
You must be signed in to change notification settings - Fork 239
/
role_isql.go
138 lines (120 loc) · 4.04 KB
/
role_isql.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
137
138
package isql
import (
"errors"
"fmt"
"strings"
"github.com/eryajf/go-ldap-admin/model"
"github.com/eryajf/go-ldap-admin/model/request"
"github.com/eryajf/go-ldap-admin/public/common"
"github.com/eryajf/go-ldap-admin/public/tools"
"gorm.io/gorm"
)
type RoleService struct{}
// Exist 判断资源是否存在
func (s RoleService) Exist(filter map[string]interface{}) bool {
var dataObj model.Role
err := common.DB.Debug().Order("created_at DESC").Where(filter).First(&dataObj).Error
return !errors.Is(err, gorm.ErrRecordNotFound)
}
// List 获取数据列表
func (s RoleService) List(req *request.RoleListReq) ([]*model.Role, error) {
var list []*model.Role
db := common.DB.Model(&model.Role{}).Order("created_at DESC")
name := strings.TrimSpace(req.Name)
if name != "" {
db = db.Where("name LIKE ?", fmt.Sprintf("%%%s%%", name))
}
keyword := strings.TrimSpace(req.Keyword)
if keyword != "" {
db = db.Where("keyword LIKE ?", fmt.Sprintf("%%%s%%", keyword))
}
status := req.Status
if status != 0 {
db = db.Where("status = ?", status)
}
pageReq := tools.NewPageOption(req.PageNum, req.PageSize)
err := db.Offset(pageReq.PageNum).Limit(pageReq.PageSize).Find(&list).Error
return list, err
}
// Count 获取资源总数
func (s RoleService) Count() (int64, error) {
var count int64
err := common.DB.Model(&model.Role{}).Count(&count).Error
return count, err
}
// Add 创建资源
func (s RoleService) Add(role *model.Role) error {
return common.DB.Create(role).Error
}
// Update 更新资源
func (s RoleService) Update(role *model.Role) error {
return common.DB.Model(&model.Role{}).Where("id = ?", role.ID).Updates(role).Error
}
// Find 获取单个资源
func (s RoleService) Find(filter map[string]interface{}, data *model.Role) error {
return common.DB.Where(filter).First(&data).Error
}
// Delete 删除资源
func (s RoleService) Delete(roleIds []uint) error {
var roles []*model.Role
err := common.DB.Where("id IN (?)", roleIds).Find(&roles).Error
if err != nil {
return err
}
err = common.DB.Select("Users", "Menus").Unscoped().Delete(&roles).Error
// 删除成功就删除casbin policy
if err == nil {
for _, role := range roles {
roleKeyword := role.Keyword
rmPolicies := common.CasbinEnforcer.GetFilteredPolicy(0, roleKeyword)
if len(rmPolicies) > 0 {
isRemoved, _ := common.CasbinEnforcer.RemovePolicies(rmPolicies)
if !isRemoved {
return errors.New("删除角色成功, 删除角色关联权限接口失败")
}
}
}
}
return err
}
// Delete 根据角色ID获取角色
func (s RoleService) GetRolesByIds(roleIds []uint) ([]*model.Role, error) {
var list []*model.Role
err := common.DB.Where("id IN (?)", roleIds).Find(&list).Error
return list, err
}
// GetRoleMenusById 获取角色的权限菜单
func (s RoleService) GetRoleMenusById(roleId uint) ([]*model.Menu, error) {
var role model.Role
err := common.DB.Where("id = ?", roleId).Preload("Menus").First(&role).Error
return role.Menus, err
}
// UpdateRoleMenus 更新角色的权限菜单
func (s RoleService) UpdateRoleMenus(role *model.Role) error {
return common.DB.Model(role).Association("Menus").Replace(role.Menus)
}
// UpdateRoleApis 更新角色的权限接口(先全部删除再新增)
func (s RoleService) UpdateRoleApis(roleKeyword string, reqRolePolicies [][]string) error {
// 先获取path中的角色ID对应角色已有的police(需要先删除的)
err := common.CasbinEnforcer.LoadPolicy()
if err != nil {
return errors.New("角色的权限接口策略加载失败")
}
rmPolicies := common.CasbinEnforcer.GetFilteredPolicy(0, roleKeyword)
if len(rmPolicies) > 0 {
isRemoved, _ := common.CasbinEnforcer.RemovePolicies(rmPolicies)
if !isRemoved {
return errors.New("更新角色的权限接口失败")
}
}
isAdded, _ := common.CasbinEnforcer.AddPolicies(reqRolePolicies)
if !isAdded {
return errors.New("更新角色的权限接口失败")
}
err = common.CasbinEnforcer.LoadPolicy()
if err != nil {
return errors.New("更新角色的权限接口成功,角色的权限接口策略加载失败")
} else {
return err
}
}