package router import ( "database/sql" "time" "github.com/gin-gonic/gin" "github.com/luxsin/app-api/internal/cache" "github.com/luxsin/app-api/internal/config" "github.com/luxsin/app-api/internal/handler" "github.com/luxsin/app-api/internal/middleware" "github.com/luxsin/app-api/internal/repository" "github.com/luxsin/app-api/internal/search" "github.com/luxsin/app-api/internal/storage" "github.com/redis/go-redis/v9" "go.uber.org/zap" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) func New(log *zap.Logger, db *sql.DB, searchClient *search.Client, rdb *redis.Client, eqCfg config.EqualizeConfig, s3 *storage.S3Storage, shareCodeMaxPerMac int, shareCodeTTL time.Duration, env string) *gin.Engine { r := gin.New() r.Use(gin.Recovery()) r.Use(middleware.RequestID()) r.Use(middleware.Logger(log)) r.Use(middleware.CORS()) // Cache brandCache := cache.NewBrandCache(rdb) modelCache := cache.NewModelCache(rdb) curveCache := cache.NewCurveCache(rdb) // Repository brandRepo := repository.NewBrandRepository(db, brandCache) modelRepo := repository.NewModelRepository(db, modelCache) otaRepo := repository.NewOTARepository(db) curveRepo := repository.NewCurveRepository(db) shareCodeCache := cache.NewShareCodeCache(rdb, shareCodeTTL) // Handler health := handler.NewHealthHandler() brand := handler.NewBrandHandler(brandRepo, log) model := handler.NewModelHandler(modelRepo, log) modelList := handler.NewModelListHandler(searchClient, log) device := handler.NewDeviceHandler(rdb, log) ota := handler.NewOTAHandler(otaRepo, log) curve := handler.NewCurveHandler(curveRepo, curveCache, eqCfg, s3, log) modelCSV := handler.NewModelCSVHandler(s3, log) shareCode := handler.NewShareCodeHandler(shareCodeCache, log, shareCodeMaxPerMac) v1 := r.Group("/api/v1") { v1.GET("/health", health.Check) } // Swagger — 仅非生产环境启用 if env != "production" { r.GET("/docs/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) } audio := r.Group("/audio") { audio.GET("/getBrand", brand.GetBrand) audio.GET("/getModel", model.GetModel) audio.GET("/modelList", modelList.ModelList) audio.GET("/reportDevInfo", device.ReportDevInfo) audio.GET("/ota", ota.GetOTA) audio.GET("/getCurve", curve.GetCurve) audio.GET("/modelCurve", curve.ModelCurve) audio.GET("/getModelCSV", modelCSV.GetModelCSV) audio.POST("/shareCreate", shareCode.ExportShareCode) audio.GET("/shareList", shareCode.ListShareCodesByMac) audio.GET("/shareQuery", shareCode.QueryShareCode) audio.GET("/shareAccept", shareCode.ImportShareCode) } return r }