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.
147 lines
4.5 KiB
147 lines
4.5 KiB
1 week ago
|
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
|
||
|
}
|