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/rest/types" "gorm.io/gorm" ) type ( roleOptions struct { db *gorm.DB } RoleOption func(o *roleOptions) RoleService struct { opts *roleOptions logic *logic.Role } ) 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), } }