package server import ( "context" "log" "path/filepath" "strings" "github.com/Wei-Shaw/sub2api/internal/config" "github.com/Wei-Shaw/sub2api/internal/handler" middleware2 "github.com/Wei-Shaw/sub2api/internal/server/middleware" "github.com/Wei-Shaw/sub2api/internal/server/routes" "github.com/Wei-Shaw/sub2api/internal/service" "github.com/Wei-Shaw/sub2api/internal/web" "github.com/gin-gonic/gin" "github.com/redis/go-redis/v9" ) // SetupRouter 配置路由器中间件和路由 func SetupRouter( r *gin.Engine, handlers *handler.Handlers, jwtAuth middleware2.JWTAuthMiddleware, adminAuth middleware2.AdminAuthMiddleware, apiKeyAuth middleware2.APIKeyAuthMiddleware, apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, opsService *service.OpsService, settingService *service.SettingService, cfg *config.Config, redisClient *redis.Client, ) *gin.Engine { // 应用中间件 r.Use(middleware2.Logger()) r.Use(middleware2.CORS(cfg.CORS)) r.Use(middleware2.SecurityHeaders(cfg.Security.CSP)) // Serve embedded frontend with settings injection if available if web.HasEmbeddedFrontend() { frontendServer, err := web.NewFrontendServer(settingService) if err != nil { log.Printf("Warning: Failed to create frontend server with settings injection: %v, using legacy mode", err) r.Use(web.ServeEmbeddedFrontend()) } else { // Register cache invalidation callback settingService.SetOnUpdateCallback(frontendServer.InvalidateCache) r.Use(frontendServer.Middleware()) } } // Serve Sora cached videos when enabled cacheVideoDir := "" cacheEnabled := false if settingService != nil { soraCfg := settingService.GetSoraConfig(context.Background()) cacheEnabled = soraCfg.Cache.Enabled cacheVideoDir = strings.TrimSpace(soraCfg.Cache.VideoDir) } else if cfg != nil { cacheEnabled = cfg.Sora.Cache.Enabled cacheVideoDir = strings.TrimSpace(cfg.Sora.Cache.VideoDir) } if cacheEnabled && cacheVideoDir != "" { videoDir := filepath.Clean(cacheVideoDir) r.Static("/data/video", videoDir) } // 注册路由 registerRoutes(r, handlers, jwtAuth, adminAuth, apiKeyAuth, apiKeyService, subscriptionService, opsService, cfg, redisClient) return r } // registerRoutes 注册所有 HTTP 路由 func registerRoutes( r *gin.Engine, h *handler.Handlers, jwtAuth middleware2.JWTAuthMiddleware, adminAuth middleware2.AdminAuthMiddleware, apiKeyAuth middleware2.APIKeyAuthMiddleware, apiKeyService *service.APIKeyService, subscriptionService *service.SubscriptionService, opsService *service.OpsService, cfg *config.Config, redisClient *redis.Client, ) { // 通用路由(健康检查、状态等) routes.RegisterCommonRoutes(r) // API v1 v1 := r.Group("/api/v1") // 注册各模块路由 routes.RegisterAuthRoutes(v1, h, jwtAuth, redisClient) routes.RegisterUserRoutes(v1, h, jwtAuth) routes.RegisterAdminRoutes(v1, h, adminAuth) routes.RegisterGatewayRoutes(r, h, apiKeyAuth, apiKeyService, subscriptionService, opsService, cfg) }