95 lines
2.3 KiB
Go
95 lines
2.3 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"git.nobla.cn/golang/aeus-admin/models"
|
|
"git.nobla.cn/golang/aeus-admin/pb"
|
|
"git.nobla.cn/golang/aeus-admin/pkg/dbcache"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type (
|
|
roleOptions struct {
|
|
db *gorm.DB
|
|
}
|
|
RoleOption func(o *roleOptions)
|
|
|
|
RoleService struct {
|
|
opts *roleOptions
|
|
}
|
|
)
|
|
|
|
func WithRoleDB(db *gorm.DB) RoleOption {
|
|
return func(o *roleOptions) {
|
|
o.db = db
|
|
}
|
|
}
|
|
|
|
func (s *RoleService) GetRoleLabels(ctx context.Context, req *pb.GetRoleLabelRequest) (res *pb.GetRoleLabelResponse, err error) {
|
|
res = &pb.GetRoleLabelResponse{}
|
|
res.Data, err = dbcache.TryCache(ctx, fmt.Sprintf("role:labels"), func(tx *gorm.DB) ([]*pb.LabelValue, error) {
|
|
values := make([]*models.Role, 0)
|
|
if err = tx.Find(&values).Error; err == nil {
|
|
items := make([]*pb.LabelValue, 0, len(values))
|
|
for _, v := range values {
|
|
items = append(items, &pb.LabelValue{
|
|
Label: v.Label,
|
|
Value: v.Name,
|
|
})
|
|
}
|
|
return items, nil
|
|
} else {
|
|
return nil, err
|
|
}
|
|
},
|
|
dbcache.WithDB(s.opts.db),
|
|
dbcache.WithDependency(dbcache.NewSqlDependency("SELECT MAX(`updated_at`) FROM roles")),
|
|
)
|
|
return
|
|
}
|
|
|
|
func (s *RoleService) GetRolePermissions(ctx context.Context, req *pb.GetRolePermissionRequest) (res *pb.GetRolePermissionResponse, err error) {
|
|
var permissions []string
|
|
if err = s.opts.db.WithContext(ctx).Model(&models.RolePermission{}).Where("role=?", req.Role).Pluck("permission", &permissions).Error; err != nil {
|
|
return
|
|
}
|
|
res = &pb.GetRolePermissionResponse{
|
|
Role: req.Role,
|
|
Permissions: permissions,
|
|
}
|
|
return
|
|
}
|
|
|
|
func (s *RoleService) SaveRolePermission(ctx context.Context, req *pb.SaveRolePermissionRequest) (res *pb.SaveRolePermissionResponse, err error) {
|
|
tx := s.opts.db.WithContext(ctx).Begin()
|
|
tx.Where("role = ?", req.Role).Delete(&models.RolePermission{})
|
|
values := make([]*models.RolePermission, 0)
|
|
for _, permission := range req.Permissions {
|
|
item := &models.RolePermission{}
|
|
item.Role = req.Role
|
|
item.Permission = permission
|
|
values = append(values, item)
|
|
}
|
|
if err = tx.Save(values).Error; err == nil {
|
|
tx.Commit()
|
|
} else {
|
|
tx.Rollback()
|
|
}
|
|
res = &pb.SaveRolePermissionResponse{
|
|
Role: req.Role,
|
|
}
|
|
return
|
|
}
|
|
|
|
func NewRoleService(cbs ...RoleOption) *RoleService {
|
|
opts := &roleOptions{}
|
|
for _, cb := range cbs {
|
|
cb(opts)
|
|
}
|
|
return &RoleService{
|
|
opts: opts,
|
|
}
|
|
}
|