16 changed files with 484 additions and 69 deletions
@ -1,13 +1,15 @@
@@ -1,13 +1,15 @@
|
||||
package model |
||||
|
||||
import ( |
||||
"gofaster/internal/shared/model" |
||||
"time" |
||||
) |
||||
|
||||
type Permission struct { |
||||
model.BaseModel |
||||
Description string `gorm:"size:200" json:"description"` // 权限描述
|
||||
BackendRoute string `gorm:"size:200" json:"backend_route"` // 后端路由
|
||||
FrontendRouteID *uint `gorm:"index" json:"frontend_route_id"` // 前端路由ID
|
||||
MenuGroupID *uint `gorm:"index" json:"menu_group_id"` // 菜单分组ID
|
||||
ID uint `gorm:"primarykey" json:"id"` |
||||
UpdatedAt time.Time `json:"updated_at"` |
||||
Name string `gorm:"size:100;not null" json:"name"` // 权限名称
|
||||
Description string `gorm:"size:200" json:"description"` // 权限描述
|
||||
AuthResourceID *uint `gorm:"index" json:"auth_resource_id"` // 认证资源ID
|
||||
MenuID *uint `gorm:"index" json:"menu_id"` // 菜单ID
|
||||
MenuGroupID *uint `gorm:"index" json:"menu_group_id"` // 菜单分组ID
|
||||
} |
||||
|
@ -0,0 +1,95 @@
@@ -0,0 +1,95 @@
|
||||
package service |
||||
|
||||
import ( |
||||
"fmt" |
||||
"gofaster/internal/auth/model" |
||||
"gofaster/internal/auth/repository" |
||||
|
||||
"go.uber.org/zap" |
||||
) |
||||
|
||||
// AuthResourcesService 认证资源服务
|
||||
type AuthResourcesService struct { |
||||
authResourcesRepo *repository.AuthResourcesRepository |
||||
permissionSyncService *PermissionSyncService |
||||
logger *zap.Logger |
||||
} |
||||
|
||||
// NewAuthResourcesService 创建认证资源服务实例
|
||||
func NewAuthResourcesService( |
||||
authResourcesRepo *repository.AuthResourcesRepository, |
||||
permissionSyncService *PermissionSyncService, |
||||
logger *zap.Logger, |
||||
) *AuthResourcesService { |
||||
return &AuthResourcesService{ |
||||
authResourcesRepo: authResourcesRepo, |
||||
permissionSyncService: permissionSyncService, |
||||
logger: logger, |
||||
} |
||||
} |
||||
|
||||
// CreateAuthResource 创建认证资源并同步权限
|
||||
func (s *AuthResourcesService) CreateAuthResource(resource *model.AuthResources) error { |
||||
// 创建认证资源
|
||||
if err := s.authResourcesRepo.Create(resource); err != nil { |
||||
s.logger.Error("创建认证资源失败", zap.Error(err)) |
||||
return fmt.Errorf("创建认证资源失败: %w", err) |
||||
} |
||||
|
||||
// 同步创建权限
|
||||
if err := s.permissionSyncService.SyncPermissionForAuthResource(resource, "create"); err != nil { |
||||
s.logger.Error("同步创建权限失败", zap.Error(err), zap.Uint("authResourceID", resource.ID)) |
||||
// 注意:这里可以选择回滚认证资源的创建,或者记录错误继续执行
|
||||
// 为了简化,这里只记录错误
|
||||
} |
||||
|
||||
return nil |
||||
} |
||||
|
||||
// UpdateAuthResource 更新认证资源并同步权限
|
||||
func (s *AuthResourcesService) UpdateAuthResource(resource *model.AuthResources) error { |
||||
// 更新认证资源
|
||||
if err := s.authResourcesRepo.Update(resource); err != nil { |
||||
s.logger.Error("更新认证资源失败", zap.Error(err)) |
||||
return fmt.Errorf("更新认证资源失败: %w", err) |
||||
} |
||||
|
||||
// 同步更新权限
|
||||
if err := s.permissionSyncService.SyncPermissionForAuthResource(resource, "update"); err != nil { |
||||
s.logger.Error("同步更新权限失败", zap.Error(err), zap.Uint("authResourceID", resource.ID)) |
||||
// 注意:这里可以选择回滚认证资源的更新,或者记录错误继续执行
|
||||
} |
||||
|
||||
return nil |
||||
} |
||||
|
||||
// DeleteAuthResource 删除认证资源并同步权限
|
||||
func (s *AuthResourcesService) DeleteAuthResource(id uint) error { |
||||
// 先同步删除权限
|
||||
if err := s.permissionSyncService.SyncPermissionForAuthResource(&model.AuthResources{ID: id}, "delete"); err != nil { |
||||
s.logger.Error("同步删除权限失败", zap.Error(err), zap.Uint("authResourceID", id)) |
||||
// 注意:这里可以选择不删除认证资源,或者记录错误继续执行
|
||||
} |
||||
|
||||
// 删除认证资源
|
||||
if err := s.authResourcesRepo.Delete(id); err != nil { |
||||
s.logger.Error("删除认证资源失败", zap.Error(err)) |
||||
return fmt.Errorf("删除认证资源失败: %w", err) |
||||
} |
||||
|
||||
return nil |
||||
} |
||||
|
||||
// UpsertAuthResource 更新或插入认证资源并同步权限
|
||||
func (s *AuthResourcesService) UpsertAuthResource(resource *model.AuthResources) error { |
||||
// 检查资源是否已存在
|
||||
existingResource, err := s.authResourcesRepo.FindByID(resource.ID) |
||||
if err != nil { |
||||
// 如果不存在,则创建
|
||||
return s.CreateAuthResource(resource) |
||||
} else { |
||||
// 如果存在,则更新
|
||||
resource.ID = existingResource.ID |
||||
return s.UpdateAuthResource(resource) |
||||
} |
||||
} |
@ -0,0 +1,178 @@
@@ -0,0 +1,178 @@
|
||||
package service |
||||
|
||||
import ( |
||||
"fmt" |
||||
"gofaster/internal/auth/model" |
||||
"gofaster/internal/auth/repository" |
||||
|
||||
"go.uber.org/zap" |
||||
) |
||||
|
||||
// PermissionSyncService 权限同步服务
|
||||
type PermissionSyncService struct { |
||||
permissionRepo repository.PermissionRepository |
||||
menusRepo *repository.MenusRepository |
||||
authResourcesRepo *repository.AuthResourcesRepository |
||||
logger *zap.Logger |
||||
} |
||||
|
||||
// NewPermissionSyncService 创建权限同步服务实例
|
||||
func NewPermissionSyncService( |
||||
permissionRepo repository.PermissionRepository, |
||||
menusRepo *repository.MenusRepository, |
||||
authResourcesRepo *repository.AuthResourcesRepository, |
||||
logger *zap.Logger, |
||||
) *PermissionSyncService { |
||||
return &PermissionSyncService{ |
||||
permissionRepo: permissionRepo, |
||||
menusRepo: menusRepo, |
||||
authResourcesRepo: authResourcesRepo, |
||||
logger: logger, |
||||
} |
||||
} |
||||
|
||||
// SyncPermissionForAuthResource 为认证资源同步权限
|
||||
func (s *PermissionSyncService) SyncPermissionForAuthResource(authResource *model.AuthResources, operation string) error { |
||||
switch operation { |
||||
case "create": |
||||
return s.createPermissionForAuthResource(authResource) |
||||
case "update": |
||||
return s.updatePermissionForAuthResource(authResource) |
||||
case "delete": |
||||
return s.deletePermissionForAuthResource(authResource.ID) |
||||
default: |
||||
return fmt.Errorf("不支持的操作类型: %s", operation) |
||||
} |
||||
} |
||||
|
||||
// createPermissionForAuthResource 为认证资源创建权限
|
||||
func (s *PermissionSyncService) createPermissionForAuthResource(authResource *model.AuthResources) error { |
||||
// 获取菜单信息以获取MenuGroupID
|
||||
menu, err := s.menusRepo.FindByID(authResource.MenuID) |
||||
if err != nil { |
||||
s.logger.Error("查找菜单失败", zap.Error(err), zap.Uint("menuID", authResource.MenuID)) |
||||
return fmt.Errorf("查找菜单失败: %w", err) |
||||
} |
||||
|
||||
// 创建权限记录
|
||||
permission := &model.Permission{ |
||||
Name: fmt.Sprintf("%s-%s", authResource.Component, authResource.HTTPMethod), |
||||
Description: fmt.Sprintf("%s %s 权限", authResource.HTTPMethod, authResource.BackendRoute), |
||||
AuthResourceID: &authResource.ID, |
||||
MenuID: &authResource.MenuID, |
||||
MenuGroupID: menu.MenuGroupID, |
||||
} |
||||
|
||||
// 创建权限记录
|
||||
if err := s.permissionRepo.Create(nil, permission); err != nil { |
||||
s.logger.Error("创建权限记录失败", zap.Error(err), zap.Uint("authResourceID", authResource.ID)) |
||||
return fmt.Errorf("创建权限记录失败: %w", err) |
||||
} |
||||
|
||||
s.logger.Info("创建权限记录成功", |
||||
zap.Uint("authResourceID", authResource.ID), |
||||
zap.Uint("menuID", authResource.MenuID), |
||||
zap.Any("menuGroupID", menu.MenuGroupID)) |
||||
|
||||
return nil |
||||
} |
||||
|
||||
// updatePermissionForAuthResource 更新认证资源对应的权限
|
||||
func (s *PermissionSyncService) updatePermissionForAuthResource(authResource *model.AuthResources) error { |
||||
// 获取菜单信息以获取MenuGroupID
|
||||
menu, err := s.menusRepo.FindByID(authResource.MenuID) |
||||
if err != nil { |
||||
s.logger.Error("查找菜单失败", zap.Error(err), zap.Uint("menuID", authResource.MenuID)) |
||||
return fmt.Errorf("查找菜单失败: %w", err) |
||||
} |
||||
|
||||
// 查找对应的权限记录
|
||||
permissions, err := s.permissionRepo.GetByAuthResourceID(nil, authResource.ID) |
||||
if err != nil { |
||||
s.logger.Error("查找权限记录失败", zap.Error(err), zap.Uint("authResourceID", authResource.ID)) |
||||
return fmt.Errorf("查找权限记录失败: %w", err) |
||||
} |
||||
|
||||
// 更新权限记录
|
||||
for _, permission := range permissions { |
||||
permission.Name = fmt.Sprintf("%s-%s", authResource.Component, authResource.HTTPMethod) |
||||
permission.Description = fmt.Sprintf("%s %s 权限", authResource.HTTPMethod, authResource.BackendRoute) |
||||
permission.MenuID = &authResource.MenuID |
||||
permission.MenuGroupID = menu.MenuGroupID |
||||
|
||||
// 更新权限记录
|
||||
if err := s.permissionRepo.Update(nil, permission); err != nil { |
||||
s.logger.Error("更新权限记录失败", zap.Error(err), zap.Uint("permissionID", permission.ID)) |
||||
return fmt.Errorf("更新权限记录失败: %w", err) |
||||
} |
||||
|
||||
s.logger.Info("更新权限记录成功", |
||||
zap.Uint("permissionID", permission.ID), |
||||
zap.Uint("authResourceID", authResource.ID), |
||||
zap.Uint("menuID", authResource.MenuID), |
||||
zap.Any("menuGroupID", menu.MenuGroupID)) |
||||
} |
||||
|
||||
return nil |
||||
} |
||||
|
||||
// deletePermissionForAuthResource 删除认证资源对应的权限
|
||||
func (s *PermissionSyncService) deletePermissionForAuthResource(authResourceID uint) error { |
||||
// 查找对应的权限记录
|
||||
permissions, err := s.permissionRepo.GetByAuthResourceID(nil, authResourceID) |
||||
if err != nil { |
||||
s.logger.Error("查找权限记录失败", zap.Error(err), zap.Uint("authResourceID", authResourceID)) |
||||
return fmt.Errorf("查找权限记录失败: %w", err) |
||||
} |
||||
|
||||
// 删除权限记录
|
||||
for _, permission := range permissions { |
||||
// 删除权限记录
|
||||
if err := s.permissionRepo.Delete(nil, permission.ID); err != nil { |
||||
s.logger.Error("删除权限记录失败", zap.Error(err), zap.Uint("permissionID", permission.ID)) |
||||
return fmt.Errorf("删除权限记录失败: %w", err) |
||||
} |
||||
|
||||
s.logger.Info("删除权限记录成功", |
||||
zap.Uint("permissionID", permission.ID), |
||||
zap.Uint("authResourceID", authResourceID)) |
||||
} |
||||
|
||||
return nil |
||||
} |
||||
|
||||
// SyncPermissionForMenuGroupChange 同步菜单分组变更到权限
|
||||
func (s *PermissionSyncService) SyncPermissionForMenuGroupChange(menuID uint, newMenuGroupID *uint) error { |
||||
// 查找该菜单下的所有认证资源
|
||||
authResources, err := s.authResourcesRepo.FindByMenuID(menuID) |
||||
if err != nil { |
||||
s.logger.Error("查找认证资源失败", zap.Error(err), zap.Uint("menuID", menuID)) |
||||
return fmt.Errorf("查找认证资源失败: %w", err) |
||||
} |
||||
|
||||
// 更新每个认证资源对应的权限记录
|
||||
for _, authResource := range authResources { |
||||
permissions, err := s.permissionRepo.GetByAuthResourceID(nil, authResource.ID) |
||||
if err != nil { |
||||
s.logger.Error("查找权限记录失败", zap.Error(err), zap.Uint("authResourceID", authResource.ID)) |
||||
continue |
||||
} |
||||
|
||||
// 更新权限记录的MenuGroupID
|
||||
for _, permission := range permissions { |
||||
permission.MenuGroupID = newMenuGroupID |
||||
// 更新权限记录
|
||||
if err := s.permissionRepo.Update(nil, permission); err != nil { |
||||
s.logger.Error("更新权限的菜单分组ID失败", zap.Error(err), zap.Uint("permissionID", permission.ID)) |
||||
return fmt.Errorf("更新权限的菜单分组ID失败: %w", err) |
||||
} |
||||
|
||||
s.logger.Info("更新权限的菜单分组ID成功", |
||||
zap.Uint("permissionID", permission.ID), |
||||
zap.Uint("authResourceID", authResource.ID), |
||||
zap.Any("newMenuGroupID", newMenuGroupID)) |
||||
} |
||||
} |
||||
|
||||
return nil |
||||
} |
Binary file not shown.
Loading…
Reference in new issue