package repository import ( "gofaster/internal/auth/model" "gofaster/internal/shared/repository" "gorm.io/gorm" ) // RouteMappingRepository 路由映射仓库 type RouteMappingRepository struct { repository.BaseRepo } // NewRouteMappingRepository 创建路由映射仓库实例 func NewRouteMappingRepository(db *gorm.DB) *RouteMappingRepository { return &RouteMappingRepository{ BaseRepo: *repository.NewBaseRepo(db), } } // Create 创建路由映射 func (r *RouteMappingRepository) Create(mapping *model.RouteMapping) error { return r.DB().Create(mapping).Error } // Update 更新路由映射 func (r *RouteMappingRepository) Update(mapping *model.RouteMapping) error { return r.DB().Save(mapping).Error } // Delete 删除路由映射 func (r *RouteMappingRepository) Delete(id uint) error { return r.DB().Delete(&model.RouteMapping{}, id).Error } // FindByID 根据ID查找路由映射 func (r *RouteMappingRepository) FindByID(id uint) (*model.RouteMapping, error) { var mapping model.RouteMapping err := r.DB().First(&mapping, id).Error if err != nil { return nil, err } return &mapping, nil } // FindByBackendRoute 根据后台路由查找映射 func (r *RouteMappingRepository) FindByBackendRoute(backendRoute, httpMethod string) (*model.RouteMapping, error) { var mapping model.RouteMapping err := r.DB().Where("backend_route = ? AND http_method = ?", backendRoute, httpMethod).First(&mapping).Error if err != nil { return nil, err } return &mapping, nil } // FindByFrontendRoute 根据前台路由查找映射 func (r *RouteMappingRepository) FindByFrontendRoute(frontendRoute string) ([]model.RouteMapping, error) { var mappings []model.RouteMapping err := r.DB().Where("frontend_route = ?", frontendRoute).Find(&mappings).Error return mappings, err } // FindAll 查找所有路由映射 func (r *RouteMappingRepository) FindAll() ([]model.RouteMapping, error) { var mappings []model.RouteMapping err := r.DB().Order("id ASC").Find(&mappings).Error return mappings, err } // FindByModule 根据模块查找路由映射 func (r *RouteMappingRepository) FindByModule(module string) ([]model.RouteMapping, error) { var mappings []model.RouteMapping err := r.DB().Where("module = ?", module).Order("id ASC").Find(&mappings).Error return mappings, err } // FindByResourceID 根据资源ID查找路由映射 func (r *RouteMappingRepository) FindByResourceID(resourceID uint) ([]model.RouteMapping, error) { var mappings []model.RouteMapping err := r.DB().Where("resource_id = ?", resourceID).Find(&mappings).Error return mappings, err } // FindByMenuID 根据菜单ID查找路由映射 func (r *RouteMappingRepository) FindByMenuID(menuID uint) ([]model.RouteMapping, error) { var mappings []model.RouteMapping err := r.DB().Where("menu_id = ?", menuID).Find(&mappings).Error return mappings, err } // CreateOrUpdate 创建或更新路由映射(用于增量同步) func (r *RouteMappingRepository) CreateOrUpdate(mapping *model.RouteMapping) error { var existing model.RouteMapping err := r.DB().Where("backend_route = ? AND http_method = ?", mapping.BackendRoute, mapping.HTTPMethod).First(&existing).Error if err != nil { if err == gorm.ErrRecordNotFound { // 不存在则创建 return r.Create(mapping) } return err } // 存在则更新 mapping.ID = existing.ID return r.Update(mapping) } // FindByAuthGroup 根据权限分组查找路由映射 func (r *RouteMappingRepository) FindByAuthGroup(authGroup string) ([]model.RouteMapping, error) { var mappings []model.RouteMapping err := r.DB().Where("auth_group = ?", authGroup).Order("id ASC").Find(&mappings).Error return mappings, err } // FindByModuleAndAuthGroup 根据模块和权限分组查找路由映射 func (r *RouteMappingRepository) FindByModuleAndAuthGroup(module, authGroup string) ([]model.RouteMapping, error) { var mappings []model.RouteMapping err := r.DB().Where("module = ? AND auth_group = ?", module, authGroup).Order("id ASC").Find(&mappings).Error return mappings, err } // GetAuthGroupStats 获取权限分组统计 func (r *RouteMappingRepository) GetAuthGroupStats() (map[string]int, error) { var stats []struct { AuthGroup string `json:"auth_group"` Count int `json:"count"` } err := r.DB().Model(&model.RouteMapping{}). Select("auth_group, COUNT(*) as count"). Group("auth_group"). Find(&stats).Error if err != nil { return nil, err } result := make(map[string]int) for _, stat := range stats { result[stat.AuthGroup] = stat.Count } return result, nil }