package service import ( "context" "fmt" "gofaster/internal/auth/model" "gofaster/internal/auth/repository" "gorm.io/gorm" ) type PermissionService struct { permissionRepo repository.PermissionRepository roleRepo repository.RoleRepository } func NewPermissionService(permissionRepo repository.PermissionRepository, roleRepo repository.RoleRepository) *PermissionService { return &PermissionService{ permissionRepo: permissionRepo, roleRepo: roleRepo, } } // CreatePermission 创建权限 func (s *PermissionService) CreatePermission(ctx context.Context, permission *model.Permission) error { // 检查权限名称是否已存在 existing, err := s.permissionRepo.GetByName(ctx, permission.Name) if err != nil && err != gorm.ErrRecordNotFound { return fmt.Errorf("检查权限名称失败: %v", err) } if existing != nil { return fmt.Errorf("权限名称 %s 已存在", permission.Name) } return s.permissionRepo.Create(ctx, permission) } // UpdatePermission 更新权限 func (s *PermissionService) UpdatePermission(ctx context.Context, permission *model.Permission) error { // 检查权限是否存在 existing, err := s.permissionRepo.GetByID(ctx, permission.ID) if err != nil { if err == gorm.ErrRecordNotFound { return fmt.Errorf("权限不存在") } return fmt.Errorf("查询权限失败: %v", err) } // 如果修改了名称,需要检查名称唯一性 if existing.Name != permission.Name { nameExists, err := s.permissionRepo.GetByName(ctx, permission.Name) if err != nil && err != gorm.ErrRecordNotFound { return fmt.Errorf("检查权限名称失败: %v", err) } if nameExists != nil { return fmt.Errorf("权限名称 %s 已存在", permission.Name) } } return s.permissionRepo.Update(ctx, permission) } // DeletePermission 删除权限 func (s *PermissionService) DeletePermission(ctx context.Context, id uint) error { // 检查权限是否存在 _, err := s.permissionRepo.GetByID(ctx, id) if err != nil { if err == gorm.ErrRecordNotFound { return fmt.Errorf("权限不存在") } return fmt.Errorf("查询权限失败: %v", err) } // 检查是否有角色在使用此权限 roles, err := s.roleRepo.GetRolesByPermission(ctx, id) if err != nil { return fmt.Errorf("查询角色失败: %v", err) } if len(roles) > 0 { return fmt.Errorf("无法删除正在使用的权限,有 %d 个角色在使用此权限", len(roles)) } return s.permissionRepo.Delete(ctx, id) } // GetPermission 获取权限详情 func (s *PermissionService) GetPermission(ctx context.Context, id uint) (*model.Permission, error) { return s.permissionRepo.GetByID(ctx, id) } // ListPermissions 获取权限列表 func (s *PermissionService) ListPermissions(ctx context.Context, page, pageSize int) ([]*model.Permission, int64, error) { offset := (page - 1) * pageSize return s.permissionRepo.List(ctx, offset, pageSize) } // GetPermissionsByResource 根据资源获取权限列表 func (s *PermissionService) GetPermissionsByResource(ctx context.Context, resource string) ([]*model.Permission, error) { return s.permissionRepo.GetByResource(ctx, resource) } // AssignPermissionsToRole 为角色分配权限 func (s *PermissionService) AssignPermissionsToRole(ctx context.Context, roleID uint, permissionIDs []uint) error { // 检查角色是否存在 _, err := s.roleRepo.GetByID(ctx, roleID) if err != nil { if err == gorm.ErrRecordNotFound { return fmt.Errorf("角色不存在") } return fmt.Errorf("查询角色失败: %v", err) } // 检查权限是否都存在 for _, permissionID := range permissionIDs { permission, err := s.permissionRepo.GetByID(ctx, permissionID) if err != nil { if err == gorm.ErrRecordNotFound { return fmt.Errorf("权限ID %d 不存在", permissionID) } return fmt.Errorf("查询权限失败: %v", err) } if permission == nil { return fmt.Errorf("权限ID %d 不存在", permissionID) } } // 分配权限 return s.roleRepo.AssignPermissions(ctx, roleID, permissionIDs) } // GetRolePermissions 获取角色的权限列表 func (s *PermissionService) GetRolePermissions(ctx context.Context, roleID uint) ([]*model.Permission, error) { // 检查角色是否存在 _, err := s.roleRepo.GetByID(ctx, roleID) if err != nil { if err == gorm.ErrRecordNotFound { return nil, fmt.Errorf("角色不存在") } return nil, fmt.Errorf("查询角色失败: %v", err) } return s.roleRepo.GetPermissions(ctx, roleID) } // RemovePermissionsFromRole 从角色移除权限 func (s *PermissionService) RemovePermissionsFromRole(ctx context.Context, roleID uint, permissionIDs []uint) error { // 检查角色是否存在 _, err := s.roleRepo.GetByID(ctx, roleID) if err != nil { if err == gorm.ErrRecordNotFound { return fmt.Errorf("角色不存在") } return fmt.Errorf("查询角色失败: %v", err) } // 移除权限 return s.roleRepo.RemovePermissions(ctx, roleID, permissionIDs) } // GetUserPermissions 获取用户的权限列表 func (s *PermissionService) GetUserPermissions(ctx context.Context, userID uint) ([]*model.Permission, error) { return s.permissionRepo.GetByUserID(ctx, userID) } // CheckUserPermission 检查用户是否有指定权限 func (s *PermissionService) CheckUserPermission(ctx context.Context, userID uint, permissionName string) (bool, error) { permissions, err := s.GetUserPermissions(ctx, userID) if err != nil { return false, fmt.Errorf("获取用户权限失败: %v", err) } for _, permission := range permissions { if permission.Name == permissionName { return true, nil } } return false, nil } // CheckUserResourcePermission 检查用户是否有指定资源的指定操作权限 func (s *PermissionService) CheckUserResourcePermission(ctx context.Context, userID uint, resource, action string) (bool, error) { permissions, err := s.GetUserPermissions(ctx, userID) if err != nil { return false, fmt.Errorf("获取用户权限失败: %v", err) } for _, permission := range permissions { if permission.Resource == resource && permission.Action == action { return true, nil } } return false, nil }