package router import ( "hfb_sys/backend/internal/config" "hfb_sys/backend/internal/handler" "hfb_sys/backend/internal/middleware" "hfb_sys/backend/internal/modules/auth" "hfb_sys/backend/internal/modules/listing" "hfb_sys/backend/internal/modules/order" "hfb_sys/backend/internal/modules/realname" "hfb_sys/backend/internal/modules/user" "github.com/gin-gonic/gin" "go.uber.org/zap" ) func New(cfg config.Config, deps Dependencies, logger *zap.Logger) *gin.Engine { if cfg.AppEnv == "production" { gin.SetMode(gin.ReleaseMode) } engine := gin.New() engine.Use(gin.Recovery()) engine.Use(middleware.RequestLogger(logger)) health := handler.NewHealthHandler() engine.GET("/health", health.Check) jwtManager := auth.NewJWTManager(cfg.JWTSecret) var userRepo *auth.UserRepository if deps.DB != nil { userRepo = auth.NewUserRepository(deps.DB) } authService := auth.NewService(userRepo, deps.Redis, jwtManager, logger) authHandler := auth.NewHandler(authService) userHandler := user.NewHandler(userRepo) var realnameRepo *realname.Repository if deps.DB != nil { realnameRepo = realname.NewRepository(deps.DB) } realnameService := realname.NewService(realnameRepo, realname.NewMockProvider()) realnameHandler := realname.NewHandler(realnameService) var listingRepo *listing.Repository if deps.DB != nil { listingRepo = listing.NewRepository(deps.DB) } listingService := listing.NewService(listingRepo) listingHandler := listing.NewHandler(listingService) var orderRepo *order.Repository if deps.DB != nil { orderRepo = order.NewRepository(deps.DB) } orderService := order.NewService(orderRepo) orderHandler := order.NewHandler(orderService) requireAuth := middleware.Auth(jwtManager) requireRealname := middleware.RequireRealname(userRepo) api := engine.Group("/api") { api.GET("/health", health.Check) authRoutes := api.Group("/auth") { authRoutes.POST("/sms/send", authHandler.SendSMS) authRoutes.POST("/sms/login", authHandler.Login) authRoutes.POST("/refresh", authHandler.Refresh) authRoutes.POST("/logout", authHandler.Logout) } api.GET("/me", requireAuth, userHandler.Me) listingRoutes := api.Group("/listings") { listingRoutes.GET("", listingHandler.ListPublic) listingRoutes.GET("/:id", listingHandler.FindPublic) listingRoutes.POST("", requireAuth, requireRealname, listingHandler.Create) listingRoutes.PUT("/:id", requireAuth, requireRealname, listingHandler.Update) listingRoutes.POST("/:id/submit-review", requireAuth, requireRealname, listingHandler.SubmitReview) listingRoutes.DELETE("/:id", requireAuth, requireRealname, listingHandler.Offline) } sellerRoutes := api.Group("/seller", requireAuth, requireRealname) { sellerRoutes.GET("/listings", listingHandler.ListMine) sellerRoutes.GET("/listings/:id", listingHandler.FindMine) } orderRoutes := api.Group("/orders", requireAuth) { orderRoutes.POST("", orderHandler.Create) orderRoutes.GET("", orderHandler.List) orderRoutes.GET("/:id", orderHandler.Detail) orderRoutes.POST("/:id/cancel", orderHandler.Cancel) orderRoutes.POST("/:id/handoff", orderHandler.SubmitHandoff) orderRoutes.GET("/:id/handoff-records", orderHandler.HandoffRecords) orderRoutes.POST("/:id/confirm-receive", orderHandler.ConfirmReceive) } realnameRoutes := api.Group("/realname", requireAuth) { realnameRoutes.POST("/start", realnameHandler.Start) realnameRoutes.GET("/status", realnameHandler.Status) } } return engine }