137 lines
3.3 KiB
Go
137 lines
3.3 KiB
Go
package service
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"filestoragesystem/internal/model"
|
|
"filestoragesystem/internal/repository"
|
|
"filestoragesystem/pkg/apperr"
|
|
)
|
|
|
|
// RoleService 角色权限服务
|
|
type RoleService struct {
|
|
roleRepo *repository.RoleRepo
|
|
permRepo *repository.PermissionRepo
|
|
}
|
|
|
|
// ListRoles 角色列表
|
|
func (s *RoleService) ListRoles() ([]model.Role, error) {
|
|
return s.roleRepo.List()
|
|
}
|
|
|
|
// GetRole 角色详情(含权限)
|
|
func (s *RoleService) GetRole(id uint) (*model.Role, error) {
|
|
r, err := s.roleRepo.FindByID(id)
|
|
if err != nil {
|
|
return nil, apperr.ErrNotFound
|
|
}
|
|
return r, nil
|
|
}
|
|
|
|
// CreateRole 创建角色
|
|
func (s *RoleService) CreateRole(name, code, description string, permIDs []uint) (*model.Role, error) {
|
|
if name == "" || code == "" {
|
|
return nil, fmt.Errorf("角色名称和编码不能为空")
|
|
}
|
|
if _, err := s.roleRepo.FindByCode(code); err == nil {
|
|
return nil, fmt.Errorf("角色编码已存在")
|
|
}
|
|
role := &model.Role{
|
|
Name: name, Code: code, Description: description,
|
|
IsSystem: false, Status: 1,
|
|
Permissions: s.mustPerms(permIDs),
|
|
}
|
|
if err := s.roleRepo.Create(role); err != nil {
|
|
return nil, err
|
|
}
|
|
return role, nil
|
|
}
|
|
|
|
// UpdateRole 编辑角色(系统角色仅允许改描述与权限)
|
|
func (s *RoleService) UpdateRole(id uint, name, description string, permIDs []uint) (*model.Role, error) {
|
|
role, err := s.roleRepo.FindByID(id)
|
|
if err != nil {
|
|
return nil, apperr.ErrNotFound
|
|
}
|
|
if role.Code == "super_admin" {
|
|
return nil, apperr.ErrSystemRole
|
|
}
|
|
if name != "" && !role.IsSystem {
|
|
role.Name = name
|
|
}
|
|
if description != "" {
|
|
role.Description = description
|
|
}
|
|
if err := s.roleRepo.Update(role); err != nil {
|
|
return nil, err
|
|
}
|
|
if permIDs != nil {
|
|
if err := s.roleRepo.ReplacePermissions(id, permIDs); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return s.roleRepo.FindByID(id)
|
|
}
|
|
|
|
// DeleteRole 删除角色(系统角色不可删,有用户的角色不可删)
|
|
func (s *RoleService) DeleteRole(id uint) error {
|
|
role, err := s.roleRepo.FindByID(id)
|
|
if err != nil {
|
|
return apperr.ErrNotFound
|
|
}
|
|
if role.IsSystem {
|
|
return apperr.ErrSystemRole
|
|
}
|
|
if n, _ := s.roleRepo.CountUsersByRole(id); n > 0 {
|
|
return fmt.Errorf("该角色下仍有 %d 个用户,无法删除", n)
|
|
}
|
|
return s.roleRepo.Delete(id)
|
|
}
|
|
|
|
// SetPermissions 配置角色权限
|
|
func (s *RoleService) SetPermissions(id uint, permIDs []uint) error {
|
|
role, err := s.roleRepo.FindByID(id)
|
|
if err != nil {
|
|
return apperr.ErrNotFound
|
|
}
|
|
if role.Code == "super_admin" {
|
|
return apperr.ErrSystemRole
|
|
}
|
|
return s.roleRepo.ReplacePermissions(id, permIDs)
|
|
}
|
|
|
|
// ListPermissions 全部权限
|
|
func (s *RoleService) ListPermissions() ([]model.Permission, error) {
|
|
return s.permRepo.List()
|
|
}
|
|
|
|
// PermissionsGrouped 按模块分组权限
|
|
func (s *RoleService) PermissionsGrouped() (map[string][]model.Permission, []string, error) {
|
|
perms, err := s.permRepo.List()
|
|
if err != nil {
|
|
return nil, nil, err
|
|
}
|
|
groups := make(map[string][]model.Permission)
|
|
var order []string
|
|
seen := make(map[string]bool)
|
|
for _, p := range perms {
|
|
if !seen[p.Module] {
|
|
seen[p.Module] = true
|
|
order = append(order, p.Module)
|
|
}
|
|
groups[p.Module] = append(groups[p.Module], p)
|
|
}
|
|
return groups, order, nil
|
|
}
|
|
|
|
func (s *RoleService) mustPerms(ids []uint) []model.Permission {
|
|
if len(ids) == 0 {
|
|
return nil
|
|
}
|
|
perms, err := s.permRepo.ListByIDs(ids)
|
|
if err != nil {
|
|
return nil
|
|
}
|
|
return perms
|
|
}
|