aeus-admin/service/role.go

97 lines
2.3 KiB
Go

package service
import (
"context"
"git.nobla.cn/golang/aeus-admin/internal/logic"
"git.nobla.cn/golang/aeus-admin/models"
"git.nobla.cn/golang/aeus-admin/pb"
"git.nobla.cn/golang/aeus/pkg/cache"
"git.nobla.cn/golang/rest/types"
"gorm.io/gorm"
)
type (
roleOptions struct {
db *gorm.DB
cache cache.Cache
}
RoleOption func(o *roleOptions)
RoleService struct {
opts *roleOptions
logic *logic.Role
}
)
func WithRoleCache(cache cache.Cache) RoleOption {
return func(o *roleOptions) {
o.cache = cache
}
}
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{}
var values []*types.TypeValue[string]
if values, err = s.logic.GetLabels(ctx); err == nil {
res.Data = make([]*pb.LabelValue, 0, len(values))
for _, row := range values {
res.Data = append(res.Data, &pb.LabelValue{
Label: row.Label,
Value: row.Value,
})
}
}
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,
logic: logic.NewRoleLogic(opts.db, opts.cache),
}
}