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, } }