/
role.go
152 lines (137 loc) · 4.2 KB
/
role.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
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package data
import (
"context"
"fmt"
"github.com/869413421/micro-chat/pkg/enforcer"
"github.com/casbin/casbin/v2"
"github.com/go-kratos/kratos/v2/log"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"github.com/869413421/micro-chat/app/user/service/internal/biz"
"github.com/869413421/micro-chat/app/user/service/internal/data/orm/schema"
)
var _ biz.RoleRepo = (*roleRepo)(nil)
// roleRepo 数据库操作层
type roleRepo struct {
data *Data
enforcer *casbin.SyncedEnforcer
log *log.Helper
}
// NewRoleRepo 新建DAO操作仓库
func NewRoleRepo(data *Data, logger log.Logger) (biz.RoleRepo, error) {
syncedEnforcer, err := enforcer.GetSyncedEnforcer()
if err != nil {
return nil, err
}
return &roleRepo{
data: data,
enforcer: syncedEnforcer,
log: log.NewHelper(log.With(logger, "module", "repo/role")),
}, nil
}
// Create 创建角色
func (r *roleRepo) Create(ctx context.Context, bizRole *biz.Role) (*biz.Role, error) {
var dbRole schema.Role
result := r.data.db.Where("name = ?", bizRole.Name).First(&dbRole)
if result.RowsAffected == 1 {
return nil, status.Errorf(codes.AlreadyExists, "角色已存在")
}
dbRole.Name = bizRole.Name
dbRole.Memo = bizRole.Memo
res := r.data.db.Create(&dbRole)
if res.Error != nil {
return nil, status.Errorf(codes.Internal, res.Error.Error())
}
return dbRole.ToBizRole(), nil
}
// Update 更新角色
func (r *roleRepo) Update(ctx context.Context, bizRole *biz.Role) (*biz.Role, error) {
var dbRole schema.Role
result := r.data.db.Where("name = ?", bizRole.Name).First(&dbRole)
if result.RowsAffected > 0 {
if dbRole.ID != bizRole.ID {
return nil, status.Errorf(codes.AlreadyExists, "角色名重复")
}
} else {
result = r.data.db.Where("id = ?", bizRole.ID).First(&dbRole)
if result.RowsAffected == 0 {
return nil, status.Errorf(codes.NotFound, "更新角色不存在")
}
}
dbRole.Name = bizRole.Name
dbRole.Memo = bizRole.Memo
res := r.data.db.Save(&dbRole)
if res.Error != nil {
return nil, status.Errorf(codes.Internal, res.Error.Error())
}
return dbRole.ToBizRole(), nil
}
// Delete 删除角色
func (r *roleRepo) Delete(ctx context.Context, id uint64) (*biz.Role, error) {
var dbRole schema.Role
result := r.data.db.Where("id = ?", id).First(&dbRole)
if result.RowsAffected == 0 {
return nil, status.Errorf(codes.NotFound, "删除角色不存在")
}
res := r.data.db.Delete(&dbRole)
if res.Error != nil {
return nil, status.Errorf(codes.Internal, res.Error.Error())
}
return dbRole.ToBizRole(), nil
}
// Get 获取角色
func (r *roleRepo) Get(ctx context.Context, where map[string]interface{}) (*biz.Role, error) {
var dbRole schema.Role
db := r.data.db
for key, value := range where {
db = db.Where(fmt.Sprintf("%s ?", key), value)
}
res := db.First(&dbRole)
if res.RowsAffected == 0 {
return nil, status.Errorf(codes.NotFound, "用户不存在")
}
return dbRole.ToBizRole(), nil
}
// List 列出角色
func (r *roleRepo) List(ctx context.Context, where map[string]interface{}, order map[string]bool, page, pageSize int64) ([]*biz.Role, int64, error) {
var dbRoles []*schema.Role
db := r.data.db
for key, value := range where {
db = db.Where(fmt.Sprintf("%s ?", key), value)
}
for key, value := range order {
if value {
db = db.Order(fmt.Sprintf("%s desc", key))
} else {
db = db.Order(fmt.Sprintf("%s asc", key))
}
}
res := db.Offset(int((page - 1) * pageSize)).Limit(int(pageSize)).Find(&dbRoles)
if res.Error != nil {
return nil, 0, status.Errorf(codes.Internal, res.Error.Error())
}
var count int64
db.Model(&schema.Role{}).Count(&count)
var bizRoles []*biz.Role
for _, role := range dbRoles {
bizRoles = append(bizRoles, role.ToBizRole())
}
return bizRoles, count, nil
}
// Query 获取所有角色
func (r *roleRepo) Query(ctx context.Context, where map[string]interface{}) ([]*biz.Role, error) {
var dbRoles []*schema.Role
db := r.data.db
for key, value := range where {
db = db.Where(fmt.Sprintf("%s ?", key), value)
}
res := db.Find(&dbRoles)
if res.Error != nil {
return nil, status.Errorf(codes.Internal, res.Error.Error())
}
var bizRole []*biz.Role
for _, role := range dbRoles {
bizRole = append(bizRole, role.ToBizRole())
}
return bizRole, nil
}