package repository import ( "gofaster/internal/auth/model" "gorm.io/gorm" ) // MenuRouteRepository 菜单路由关联表仓储 type MenuRouteRepository struct { db *gorm.DB } // NewMenuRouteRepository 创建菜单路由关联表仓储 func NewMenuRouteRepository(db *gorm.DB) *MenuRouteRepository { return &MenuRouteRepository{db: db} } // Create 创建菜单路由关联 func (r *MenuRouteRepository) Create(menuRoute *model.MenuRoute) error { return r.db.Create(menuRoute).Error } // CreateBatch 批量创建菜单路由关联 func (r *MenuRouteRepository) CreateBatch(menuRoutes []*model.MenuRoute) error { return r.db.CreateInBatches(menuRoutes, 100).Error } // GetByID 根据ID获取菜单路由关联 func (r *MenuRouteRepository) GetByID(id uint) (*model.MenuRoute, error) { var menuRoute model.MenuRoute err := r.db.Where("id = ?", id).First(&menuRoute).Error if err != nil { return nil, err } return &menuRoute, nil } // GetByMenuAndRoute 根据菜单ID和路由ID获取关联 func (r *MenuRouteRepository) GetByMenuAndRoute(menuID, routeMappingID uint) (*model.MenuRoute, error) { var menuRoute model.MenuRoute err := r.db.Where("menu_id = ? AND route_mapping_id = ?", menuID, routeMappingID).First(&menuRoute).Error if err != nil { return nil, err } return &menuRoute, nil } // GetByMenuID 根据菜单ID获取所有关联的路由 func (r *MenuRouteRepository) GetByMenuID(menuID uint) ([]*model.MenuRoute, error) { var menuRoutes []*model.MenuRoute err := r.db.Where("menu_id = ?", menuID).Order("sort ASC").Find(&menuRoutes).Error return menuRoutes, err } // GetByRouteMappingID 根据路由映射ID获取所有关联的菜单 func (r *MenuRouteRepository) GetByRouteMappingID(routeMappingID uint) ([]*model.MenuRoute, error) { var menuRoutes []*model.MenuRoute err := r.db.Where("route_mapping_id = ?", routeMappingID).Order("sort ASC").Find(&menuRoutes).Error return menuRoutes, err } // List 获取菜单路由关联列表 func (r *MenuRouteRepository) List(page, pageSize int) ([]*model.MenuRoute, int64, error) { var menuRoutes []*model.MenuRoute var total int64 // 获取总数 if err := r.db.Model(&model.MenuRoute{}).Count(&total).Error; err != nil { return nil, 0, err } // 获取分页数据 offset := (page - 1) * pageSize err := r.db.Offset(offset).Limit(pageSize).Order("created_at DESC").Find(&menuRoutes).Error return menuRoutes, total, err } // Update 更新菜单路由关联 func (r *MenuRouteRepository) Update(menuRoute *model.MenuRoute) error { return r.db.Save(menuRoute).Error } // Delete 删除菜单路由关联 func (r *MenuRouteRepository) Delete(id uint) error { return r.db.Delete(&model.MenuRoute{}, id).Error } // DeleteByMenuID 根据菜单ID删除所有关联 func (r *MenuRouteRepository) DeleteByMenuID(menuID uint) error { return r.db.Where("menu_id = ?", menuID).Delete(&model.MenuRoute{}).Error } // DeleteByRouteMappingID 根据路由映射ID删除所有关联 func (r *MenuRouteRepository) DeleteByRouteMappingID(routeMappingID uint) error { return r.db.Where("route_mapping_id = ?", routeMappingID).Delete(&model.MenuRoute{}).Error } // DeleteByMenuAndRoute 根据菜单ID和路由ID删除关联 func (r *MenuRouteRepository) DeleteByMenuAndRoute(menuID, routeMappingID uint) error { return r.db.Where("menu_id = ? AND route_mapping_id = ?", menuID, routeMappingID).Delete(&model.MenuRoute{}).Error } // GetMenuWithRoutes 获取菜单及其关联的路由信息 func (r *MenuRouteRepository) GetMenuWithRoutes(menuID uint) (*model.Menu, []*model.RouteMapping, error) { var menu model.Menu var routeMappings []*model.RouteMapping // 获取菜单信息 if err := r.db.First(&menu, menuID).Error; err != nil { return nil, nil, err } // 获取关联的路由映射 err := r.db.Table("route_mappings"). Joins("JOIN menu_routes ON route_mappings.id = menu_routes.route_mapping_id"). Where("menu_routes.menu_id = ?", menuID). Order("menu_routes.sort ASC"). Find(&routeMappings).Error return &menu, routeMappings, err } // GetRouteWithMenus 获取路由及其关联的菜单信息 func (r *MenuRouteRepository) GetRouteWithMenus(routeMappingID uint) (*model.RouteMapping, []*model.Menu, error) { var routeMapping model.RouteMapping var menus []*model.Menu // 获取路由映射信息 if err := r.db.First(&routeMapping, routeMappingID).Error; err != nil { return nil, nil, err } // 获取关联的菜单 err := r.db.Table("menus"). Joins("JOIN menu_routes ON menus.id = menu_routes.menu_id"). Where("menu_routes.route_mapping_id = ?", routeMappingID). Order("menu_routes.sort ASC"). Find(&menus).Error return &routeMapping, menus, err }