Files
filestoragesystem/go/internal/service/role.go
T
2026-08-23 00:48:10 +08:00

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
}