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.
180 lines
5.5 KiB
180 lines
5.5 KiB
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 |
|
}
|
|
|