package server import ( "github.com/gin-gonic/gin" apiV1 "github.com/go-nunu/nunu-layout-advanced/api/v1" "github.com/go-nunu/nunu-layout-advanced/docs" "github.com/go-nunu/nunu-layout-advanced/internal/handler" "github.com/go-nunu/nunu-layout-advanced/internal/middleware" "github.com/go-nunu/nunu-layout-advanced/pkg/jwt" "github.com/go-nunu/nunu-layout-advanced/pkg/limiter" "github.com/go-nunu/nunu-layout-advanced/pkg/log" "github.com/go-nunu/nunu-layout-advanced/pkg/server/http" "github.com/spf13/viper" swaggerfiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) func NewHTTPServer( logger *log.Logger, conf *viper.Viper, jwt *jwt.JWT, limiterInstance *limiter.Limiter, rateLimitMiddleware gin.HandlerFunc, userHandler *handler.UserHandler, gameShieldHandler *handler.GameShieldHandler, webForwardingHandler *handler.WebForwardingHandler, weblimitHandler *handler.WebLimitHandler, tcpForwardingHandler *handler.TcpforwardingHandler, udpForwardingHandler *handler.UdpForWardingHandler, tcpLimitHandler *handler.TcpLimitHandler, udpLimitHandler *handler.UdpLimitHandler, ) *http.Server { gin.SetMode(gin.DebugMode) s := http.NewServer( gin.Default(), logger, http.WithServerHost(conf.GetString("http.host")), http.WithServerPort(conf.GetInt("http.port")), ) // swagger doc docs.SwaggerInfo.BasePath = "/v1" s.GET("/swagger/*any", ginSwagger.WrapHandler( swaggerfiles.Handler, //ginSwagger.URL(fmt.Sprintf("http://localhost:%d/swagger/doc.json", conf.GetInt("app.http.port"))), ginSwagger.DefaultModelsExpandDepth(-1), ginSwagger.PersistAuthorization(true), )) s.Use( middleware.CORSMiddleware(), middleware.ResponseLogMiddleware(logger), middleware.RequestLogMiddleware(logger), //middleware.SignMiddleware(log), rateLimitMiddleware, ) s.GET("/", func(ctx *gin.Context) { logger.WithContext(ctx).Info("hello") apiV1.HandleSuccess(ctx, map[string]interface{}{ ":)": "Thank you for using nunu!", }) }) v1 := s.Group("/v1") { // No route group has permission noAuthRouter := v1.Group("/") { // 使用增强的Limiter.GetAPIConfig方法获取特定API的限流配置 // 登录API限流 loginConfig := limiterInstance.GetAPIConfig("login") noAuthRouter.POST("/login", middleware.IPRateLimitMiddleware(loginConfig), userHandler.Login) // 注册API限流 registerConfig := limiterInstance.GetAPIConfig("register") noAuthRouter.POST("/register", middleware.IPRateLimitMiddleware(registerConfig), userHandler.Register) noAuthRouter.POST("/gameShield/add", gameShieldHandler.SubmitGameShield) noAuthRouter.POST("/gameShield/getField", gameShieldHandler.GetGameShieldField) noAuthRouter.POST("/gameShield/getKey", gameShieldHandler.GetGameShieldKey) noAuthRouter.POST("/gameShield/edit", gameShieldHandler.EditGameShield) noAuthRouter.POST("/gameShield/delete", gameShieldHandler.DeleteGameShield) noAuthRouter.POST("/webForward/add", webForwardingHandler.AddWebForwarding) noAuthRouter.POST("/webForward/edit", webForwardingHandler.EditWebForwarding) noAuthRouter.POST("/webForward/delete", webForwardingHandler.DeleteWebForwarding) noAuthRouter.POST("/webLimit/add", weblimitHandler.AddWebLimit) noAuthRouter.POST("/webLimit/edit", weblimitHandler.EditWebLimit) noAuthRouter.POST("/webLimit/delete", weblimitHandler.DeleteWebLimit) noAuthRouter.POST("/tcpForward/add", tcpForwardingHandler.AddTcpForwarding) noAuthRouter.POST("/tcpForward/edit", tcpForwardingHandler.EditTcpForwarding) noAuthRouter.POST("/tcpForward/delete", tcpForwardingHandler.DeleteTcpForwarding) noAuthRouter.POST("/udpForward/add", udpForwardingHandler.AddUdpForWarding) noAuthRouter.POST("/udpForward/edit", udpForwardingHandler.EditUdpForWarding) noAuthRouter.POST("/udpForward/delete", udpForwardingHandler.DeleteUdpForWarding) noAuthRouter.POST("/tcpLimit/add", tcpLimitHandler.AddTcpLimit) noAuthRouter.POST("/tcpLimit/edit", tcpLimitHandler.EditTcpLimit) noAuthRouter.POST("/tcpLimit/delete", tcpLimitHandler.DeleteTcpLimit) noAuthRouter.POST("/udpLimit/add", udpLimitHandler.AddUdpLimit) noAuthRouter.POST("/udpLimit/edit", udpLimitHandler.EditUdpLimit) noAuthRouter.POST("/udpLimit/delete", udpLimitHandler.DeleteUdpLimit) } // Non-strict permission routing group noStrictAuthRouter := v1.Group("/").Use(middleware.NoStrictAuth(jwt, logger)) { noStrictAuthRouter.GET("/user", userHandler.GetProfile) } // Strict permission routing group strictAuthRouter := v1.Group("/").Use(middleware.StrictAuth(jwt, logger)) { strictAuthRouter.PUT("/user", userHandler.UpdateProfile) } } return s }