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.
181 lines
5.5 KiB
181 lines
5.5 KiB
6 days ago
|
package service
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"gofaster/internal/auth/model"
|
||
|
"gofaster/internal/auth/repository"
|
||
|
|
||
|
"go.uber.org/zap"
|
||
|
)
|
||
|
|
||
|
// MenuRouteService 菜单路由关联表服务
|
||
|
type MenuRouteService struct {
|
||
|
menuRouteRepo *repository.MenuRouteRepository
|
||
|
menuRepo *repository.MenuRepository
|
||
|
routeRepo *repository.RouteMappingRepository
|
||
|
log *zap.Logger
|
||
|
}
|
||
|
|
||
|
// NewMenuRouteService 创建菜单路由关联表服务
|
||
|
func NewMenuRouteService(
|
||
|
menuRouteRepo *repository.MenuRouteRepository,
|
||
|
menuRepo *repository.MenuRepository,
|
||
|
routeRepo *repository.RouteMappingRepository,
|
||
|
log *zap.Logger,
|
||
|
) *MenuRouteService {
|
||
|
return &MenuRouteService{
|
||
|
menuRouteRepo: menuRouteRepo,
|
||
|
menuRepo: menuRepo,
|
||
|
routeRepo: routeRepo,
|
||
|
log: log,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// CreateMenuRoute 创建菜单路由关联
|
||
|
func (s *MenuRouteService) CreateMenuRoute(menuRoute *model.MenuRoute) error {
|
||
|
// 验证菜单是否存在
|
||
|
if _, err := s.menuRepo.FindByID(menuRoute.MenuID); err != nil {
|
||
|
return fmt.Errorf("菜单不存在")
|
||
|
}
|
||
|
|
||
|
// 验证路由映射是否存在
|
||
|
if _, err := s.routeRepo.FindByID(menuRoute.RouteMappingID); err != nil {
|
||
|
return fmt.Errorf("路由映射不存在")
|
||
|
}
|
||
|
|
||
|
// 检查关联是否已存在
|
||
|
if existing, err := s.menuRouteRepo.GetByMenuAndRoute(menuRoute.MenuID, menuRoute.RouteMappingID); err == nil && existing != nil {
|
||
|
return fmt.Errorf("菜单路由关联已存在")
|
||
|
}
|
||
|
|
||
|
return s.menuRouteRepo.Create(menuRoute)
|
||
|
}
|
||
|
|
||
|
// CreateMenuRoutes 批量创建菜单路由关联
|
||
|
func (s *MenuRouteService) CreateMenuRoutes(menuID uint, routeMappingIDs []uint) error {
|
||
|
// 验证菜单是否存在
|
||
|
if _, err := s.menuRepo.FindByID(menuID); err != nil {
|
||
|
return fmt.Errorf("菜单不存在")
|
||
|
}
|
||
|
|
||
|
// 验证所有路由映射是否存在
|
||
|
for _, routeID := range routeMappingIDs {
|
||
|
if _, err := s.routeRepo.FindByID(routeID); err != nil {
|
||
|
return fmt.Errorf("路由映射不存在")
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 删除现有关联
|
||
|
if err := s.menuRouteRepo.DeleteByMenuID(menuID); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// 创建新关联
|
||
|
var menuRoutes []*model.MenuRoute
|
||
|
for i, routeID := range routeMappingIDs {
|
||
|
menuRoute := &model.MenuRoute{
|
||
|
MenuID: menuID,
|
||
|
RouteMappingID: routeID,
|
||
|
Sort: i,
|
||
|
IsDefault: i == 0, // 第一个设为默认
|
||
|
Status: 1,
|
||
|
}
|
||
|
menuRoutes = append(menuRoutes, menuRoute)
|
||
|
}
|
||
|
|
||
|
return s.menuRouteRepo.CreateBatch(menuRoutes)
|
||
|
}
|
||
|
|
||
|
// GetMenuRoutes 获取菜单的路由关联
|
||
|
func (s *MenuRouteService) GetMenuRoutes(menuID uint) ([]*model.MenuRoute, error) {
|
||
|
return s.menuRouteRepo.GetByMenuID(menuID)
|
||
|
}
|
||
|
|
||
|
// GetRouteMenus 获取路由的菜单关联
|
||
|
func (s *MenuRouteService) GetRouteMenus(routeMappingID uint) ([]*model.MenuRoute, error) {
|
||
|
return s.menuRouteRepo.GetByRouteMappingID(routeMappingID)
|
||
|
}
|
||
|
|
||
|
// GetMenuWithRoutes 获取菜单及其关联的路由信息
|
||
|
func (s *MenuRouteService) GetMenuWithRoutes(menuID uint) (*model.Menu, []*model.RouteMapping, error) {
|
||
|
return s.menuRouteRepo.GetMenuWithRoutes(menuID)
|
||
|
}
|
||
|
|
||
|
// GetRouteWithMenus 获取路由及其关联的菜单信息
|
||
|
func (s *MenuRouteService) GetRouteWithMenus(routeMappingID uint) (*model.RouteMapping, []*model.Menu, error) {
|
||
|
return s.menuRouteRepo.GetRouteWithMenus(routeMappingID)
|
||
|
}
|
||
|
|
||
|
// UpdateMenuRoute 更新菜单路由关联
|
||
|
func (s *MenuRouteService) UpdateMenuRoute(menuRoute *model.MenuRoute) error {
|
||
|
// 验证关联是否存在
|
||
|
if _, err := s.menuRouteRepo.GetByID(menuRoute.ID); err != nil {
|
||
|
return fmt.Errorf("菜单路由关联不存在")
|
||
|
}
|
||
|
|
||
|
return s.menuRouteRepo.Update(menuRoute)
|
||
|
}
|
||
|
|
||
|
// DeleteMenuRoute 删除菜单路由关联
|
||
|
func (s *MenuRouteService) DeleteMenuRoute(id uint) error {
|
||
|
return s.menuRouteRepo.Delete(id)
|
||
|
}
|
||
|
|
||
|
// DeleteMenuRoutes 删除菜单的所有路由关联
|
||
|
func (s *MenuRouteService) DeleteMenuRoutes(menuID uint) error {
|
||
|
return s.menuRouteRepo.DeleteByMenuID(menuID)
|
||
|
}
|
||
|
|
||
|
// DeleteRouteMenus 删除路由的所有菜单关联
|
||
|
func (s *MenuRouteService) DeleteRouteMenus(routeMappingID uint) error {
|
||
|
return s.menuRouteRepo.DeleteByRouteMappingID(routeMappingID)
|
||
|
}
|
||
|
|
||
|
// DeleteMenuRouteByMenuAndRoute 根据菜单ID和路由ID删除关联
|
||
|
func (s *MenuRouteService) DeleteMenuRouteByMenuAndRoute(menuID, routeMappingID uint) error {
|
||
|
return s.menuRouteRepo.DeleteByMenuAndRoute(menuID, routeMappingID)
|
||
|
}
|
||
|
|
||
|
// ListMenuRoutes 获取菜单路由关联列表
|
||
|
func (s *MenuRouteService) ListMenuRoutes(page, pageSize int) ([]*model.MenuRoute, int64, error) {
|
||
|
return s.menuRouteRepo.List(page, pageSize)
|
||
|
}
|
||
|
|
||
|
// SyncMenuRoutes 同步菜单路由关联(用于批量操作)
|
||
|
func (s *MenuRouteService) SyncMenuRoutes(menuID uint, routeMappingIDs []uint) error {
|
||
|
s.log.Info("开始同步菜单路由关联", zap.Uint("menuID", menuID), zap.Any("routeMappingIDs", routeMappingIDs))
|
||
|
|
||
|
// 删除现有关联
|
||
|
if err := s.menuRouteRepo.DeleteByMenuID(menuID); err != nil {
|
||
|
s.log.Error("删除现有菜单路由关联失败", zap.Error(err))
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// 如果没有新的路由映射,直接返回
|
||
|
if len(routeMappingIDs) == 0 {
|
||
|
s.log.Info("没有新的路由映射,同步完成")
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
// 创建新关联
|
||
|
var menuRoutes []*model.MenuRoute
|
||
|
for i, routeID := range routeMappingIDs {
|
||
|
menuRoute := &model.MenuRoute{
|
||
|
MenuID: menuID,
|
||
|
RouteMappingID: routeID,
|
||
|
Sort: i,
|
||
|
IsDefault: i == 0, // 第一个设为默认
|
||
|
Status: 1,
|
||
|
}
|
||
|
menuRoutes = append(menuRoutes, menuRoute)
|
||
|
}
|
||
|
|
||
|
if err := s.menuRouteRepo.CreateBatch(menuRoutes); err != nil {
|
||
|
s.log.Error("创建菜单路由关联失败", zap.Error(err))
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
s.log.Info("菜单路由关联同步完成", zap.Int("关联数量", len(menuRoutes)))
|
||
|
return nil
|
||
|
}
|