package router import ( "database/sql" "github.com/gin-gonic/gin" "github.com/luxsin/app-api/internal/cache" "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/redis/go-redis/v9" "go.uber.org/zap" ) func New(log *zap.Logger, db *sql.DB, searchClient *search.Client, rdb *redis.Client) *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) // Repository brandRepo := repository.NewBrandRepository(db, brandCache) modelRepo := repository.NewModelRepository(db, modelCache) otaRepo := repository.NewOTARepository(db) // 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) v1 := r.Group("/api/v1") { v1.GET("/health", health.Check) } 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) } return r }