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
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 |
|
}
|
|
|