package router import ( "91porn-server/app/api/sharectrl" "91porn-server/app/api/updownctrl" "91porn-server/app/appg" "91porn-server/app/middleware/authuser" "91porn-server/app/middleware/datacenter" "91porn-server/app/middleware/ip" "91porn-server/app/middleware/requestEncrypt" "91porn-server/app/middleware/verfyparam" "91porn-server/app/middleware/visitlog" "91porn-server/common" "91porn-server/common/constant" "91porn-server/common/stderr" "91porn-server/common/tg" "91porn-server/middleware/cors" "91porn-server/middleware/ginzap" "91porn-server/middleware/requestid" "91porn-server/middleware/ua" "fmt" "net/http" "runtime/debug" "time" "github.com/didip/tollbooth" "github.com/didip/tollbooth/limiter" "github.com/gin-contrib/pprof" "github.com/gin-gonic/gin" ) var Lmt, RechargeLmt, GlobalLmt *limiter.Limiter // SetupGin 初始化gin router func SetupGin() *gin.Engine { if appg.Conf.Base.Env == constant.ProdEnv { gin.SetMode(gin.ReleaseMode) } else { gin.SetMode(gin.DebugMode) } router := gin.New() router.ForwardedByClientIP = true if appg.Conf.Base.PProf { pprof.Register(router) // 性能分析工具 } router.Use( ginzap.Logger([]string{constant.CtxUserID, constant.CtxIP}), ginzap.Recovery(true, func(err interface{}) { var stack string if !stderr.IsContain(err, stderr.WriteBrokenError) { stack = string(debug.Stack()) } common.Go(func() { _ = appg.Bot.Send(tg.Msg{ChatId: tg.ChatIdServerTeam, Text: fmt.Sprintf("[App-Server] panic:%+v, stack:%s", err, stack)}) }) })) router.Use(cors.Cors(&cors.Options{ Origin: nil, Methods: []string{http.MethodGet, http.MethodPost, http.MethodPut, http.MethodHead, http.MethodDelete}, AllowedHeaders: []string{"Content-Length", "Content-Type", "Authorization", "X-User-Agent", "User-Agent", "X-Authorization", "X-Request-ID", "temp", "log-type"}, ExposedHeaders: []string{"Content-Disposition", "Refresh-Authorization", "Cur-Ver", "X-Request-ID"}, OptionsSuccessStatus: http.StatusOK, })) router.Use(ua.UAer, ip.RealIP, requestid.New()) router.HandleMethodNotAllowed = true router.NoMethod(func(c *gin.Context) { c.JSON(http.StatusMethodNotAllowed, gin.H{"result": false, "error": "Method Not Allowed"}) }) router.NoRoute(func(c *gin.Context) { c.JSON(http.StatusNotFound, gin.H{"result": false, "error": "Endpoint Not Found"}) }) Init() registerRouter(router) return router } func registerRouter(router *gin.Engine) { //root Router 根组 rootRouter := router.Group("/api/app", verfyparam.CheckReplayAttackRequest(), verfyparam.VerifyReplayAttackRequest(appg.Conf.Base.ReplayAttack), requestEncrypt.ReqDecode, authuser.Auth, visitlog.Log, datacenter.OnlineStat, //ipblock.IPBlock(constant.GlobalBlock), //limitHandler.LimitHandler(GlobalLmt), ) { updownloadRouter(rootRouter) walletRouter(rootRouter) shareRouter(rootRouter) vidRouter(rootRouter) recommendRouter(rootRouter) userRouter(rootRouter) tagRouter(rootRouter) searchRouter(rootRouter) mineRouter(rootRouter) notificationRoute(rootRouter) rankRouter(rootRouter) toneRouter(rootRouter) wonderRouter(rootRouter) vipRouter(rootRouter) productRouter(rootRouter) paymentGuideRouter(rootRouter) sceneBannerRouter(rootRouter) analyticsRouter(rootRouter) imdRouter(rootRouter) rchgRouter(rootRouter) versionRouter(rootRouter) pingRouter(rootRouter) withdrawRouter(rootRouter) annouRouter(rootRouter) staticRouter(rootRouter) txnactRouter(rootRouter) adsRouter(rootRouter) infmtRouter(rootRouter) hotspotRouter(rootRouter) exchangeRouter(rootRouter) newActivityRoute(rootRouter) userInviteRouter(rootRouter) taskRouter(rootRouter) backpackRouter(rootRouter) moduleRouter(rootRouter) contentMarkerRouter(rootRouter) smsRoute(rootRouter) publishRouter(rootRouter) videoActivityRouter(rootRouter) aiUndressRouter(rootRouter) thumbsRouter(rootRouter) officialRouter(rootRouter) commentRouter(rootRouter) followRouter(rootRouter) proxyRouter(rootRouter) aiChangeFaceRouter(rootRouter) messageRouter(rootRouter) aiModRouter(rootRouter) videoGoldCoinRouter(rootRouter) recreationRouter(rootRouter) advanceConfigRouter(rootRouter) couponRouter(rootRouter) integralRouter(rootRouter) signRecordRouter(rootRouter) aiMateRouter(rootRouter) aiMateV2Router(rootRouter) storeWalletRouter(rootRouter) mediaRouter(rootRouter) dramaRouter(rootRouter) mediaBookshelfRouter(rootRouter) mediaContentRouter(rootRouter) mediaTagRouter(rootRouter) imGroupRouter(rootRouter) imMessageRouter(rootRouter) nakedChatRouter(rootRouter) nakedChatOrderRouter(rootRouter) aiTextToImageRouter(rootRouter) aiImageToVideoRouter(rootRouter) aiTemplateModuleRouter(rootRouter) aiPlazaRouter(rootRouter) aiTextToNovelRouter(rootRouter) checkinRouter(rootRouter) customerApiRouter(rootRouter) healthCheckRouter(rootRouter) } thirdRouter := router.Group("/3rd") { defrayRouter(thirdRouter) } { shareRouter := router.Group("/share") shareRouter.POST("/info", sharectrl.Info) shareRouter.GET("/m3u8/*source", updownctrl.DownloadM3u8H5) } // 客服系统回调相关 customerRouter(router) // 活动服回调相关 activityCallbackRouter(router) // 品牌站相关接口 newOfficialWebsiteRoute(router) } func Init() { GlobalLmt = tollbooth.NewLimiter(float64(appg.Conf.Limit.GlobalLimit), &limiter.ExpirableOptions{DefaultExpirationTTL: time.Second}) Lmt = tollbooth.NewLimiter(float64(appg.Conf.Limit.CommentLimit), &limiter.ExpirableOptions{DefaultExpirationTTL: time.Second}) RechargeLmt = tollbooth.NewLimiter(float64(appg.Conf.Limit.RechargeLimit), &limiter.ExpirableOptions{DefaultExpirationTTL: time.Minute}) Lmt.SetIPLookups([]string{"RemoteAddr", "X-Forwarded-For", "X-Real-IP"}) Lmt.SetMethods([]string{"GET", "POST"}) Lmt.SetMessageContentType("application/json; charset=utf-8") Lmt.SetStatusCode(http.StatusNoContent) GlobalLmt.SetIPLookups([]string{"RemoteAddr", "X-Forwarded-For", "X-Real-IP"}) GlobalLmt.SetMethods([]string{"GET", "POST"}) GlobalLmt.SetMessageContentType("application/json; charset=utf-8") GlobalLmt.SetStatusCode(http.StatusNoContent) RechargeLmt.SetIPLookups([]string{"RemoteAddr", "X-Forwarded-For", "X-Real-IP"}) RechargeLmt.SetMethods([]string{"POST"}) RechargeLmt.SetMessageContentType("application/json; charset=utf-8") RechargeLmt.SetStatusCode(http.StatusNoContent) }