You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

196 lines
6.0 KiB

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
}