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.
 
 
 
 
 
 

146 lines
4.5 KiB

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
}