|
|
|
@@ -17,9 +17,10 @@ func SetApiRouter(router *gin.Engine) {
|
|
|
|
|
apiRouter.Use(gzip.Gzip(gzip.DefaultCompression))
|
|
|
|
|
apiRouter.Use(middleware.BodyStorageCleanup()) // 清理请求体存储
|
|
|
|
|
apiRouter.Use(middleware.GlobalAPIRateLimit())
|
|
|
|
|
anonymousRequestBodyLimit := middleware.AnonymousRequestBodyLimit()
|
|
|
|
|
{
|
|
|
|
|
apiRouter.GET("/setup", controller.GetSetup)
|
|
|
|
|
apiRouter.POST("/setup", controller.PostSetup)
|
|
|
|
|
apiRouter.POST("/setup", anonymousRequestBodyLimit, controller.PostSetup)
|
|
|
|
|
apiRouter.GET("/status", controller.GetStatus)
|
|
|
|
|
apiRouter.GET("/uptime/status", controller.GetUptimeKumaStatus)
|
|
|
|
|
apiRouter.GET("/models", middleware.UserAuth(), controller.DashboardListModels)
|
|
|
|
@@ -40,39 +41,39 @@ func SetApiRouter(router *gin.Engine) {
|
|
|
|
|
apiRouter.GET("/rankings", middleware.HeaderNavModuleAuth("rankings"), controller.GetRankings)
|
|
|
|
|
apiRouter.GET("/verification", middleware.EmailVerificationRateLimit(), middleware.TurnstileCheck(), controller.SendEmailVerification)
|
|
|
|
|
apiRouter.GET("/reset_password", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.SendPasswordResetEmail)
|
|
|
|
|
apiRouter.POST("/user/reset", middleware.CriticalRateLimit(), controller.ResetPassword)
|
|
|
|
|
apiRouter.POST("/user/reset", middleware.CriticalRateLimit(), anonymousRequestBodyLimit, controller.ResetPassword)
|
|
|
|
|
// OAuth routes - specific routes must come before :provider wildcard
|
|
|
|
|
apiRouter.GET("/oauth/state", middleware.CriticalRateLimit(), controller.GenerateOAuthCode)
|
|
|
|
|
apiRouter.POST("/oauth/email/bind", middleware.CriticalRateLimit(), controller.EmailBind)
|
|
|
|
|
apiRouter.POST("/oauth/email/bind", middleware.CriticalRateLimit(), anonymousRequestBodyLimit, controller.EmailBind)
|
|
|
|
|
// Non-standard OAuth (WeChat, Telegram) - keep original routes
|
|
|
|
|
apiRouter.GET("/oauth/wechat", middleware.CriticalRateLimit(), controller.WeChatAuth)
|
|
|
|
|
apiRouter.POST("/oauth/wechat/bind", middleware.CriticalRateLimit(), controller.WeChatBind)
|
|
|
|
|
apiRouter.POST("/oauth/wechat/bind", middleware.CriticalRateLimit(), anonymousRequestBodyLimit, controller.WeChatBind)
|
|
|
|
|
apiRouter.GET("/oauth/telegram/login", middleware.CriticalRateLimit(), controller.TelegramLogin)
|
|
|
|
|
apiRouter.GET("/oauth/telegram/bind", middleware.CriticalRateLimit(), controller.TelegramBind)
|
|
|
|
|
// Standard OAuth providers (GitHub, Discord, OIDC, LinuxDO) - unified route
|
|
|
|
|
apiRouter.GET("/oauth/:provider", middleware.CriticalRateLimit(), controller.HandleOAuth)
|
|
|
|
|
apiRouter.GET("/ratio_config", middleware.CriticalRateLimit(), controller.GetRatioConfig)
|
|
|
|
|
|
|
|
|
|
apiRouter.POST("/stripe/webhook", controller.StripeWebhook)
|
|
|
|
|
apiRouter.POST("/creem/webhook", controller.CreemWebhook)
|
|
|
|
|
apiRouter.POST("/waffo/webhook", controller.WaffoWebhook)
|
|
|
|
|
apiRouter.POST("/stripe/webhook", anonymousRequestBodyLimit, controller.StripeWebhook)
|
|
|
|
|
apiRouter.POST("/creem/webhook", anonymousRequestBodyLimit, controller.CreemWebhook)
|
|
|
|
|
apiRouter.POST("/waffo/webhook", anonymousRequestBodyLimit, controller.WaffoWebhook)
|
|
|
|
|
// :env separates test vs prod URLs so the operator can register each
|
|
|
|
|
// in Pancake's matching webhook slot; handler enforces env match.
|
|
|
|
|
apiRouter.POST("/waffo-pancake/webhook/:env", controller.WaffoPancakeWebhook)
|
|
|
|
|
apiRouter.POST("/waffo-pancake/webhook/:env", anonymousRequestBodyLimit, controller.WaffoPancakeWebhook)
|
|
|
|
|
|
|
|
|
|
// Universal secure verification routes
|
|
|
|
|
apiRouter.POST("/verify", middleware.UserAuth(), middleware.CriticalRateLimit(), controller.UniversalVerify)
|
|
|
|
|
|
|
|
|
|
userRoute := apiRouter.Group("/user")
|
|
|
|
|
{
|
|
|
|
|
userRoute.POST("/register", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.Register)
|
|
|
|
|
userRoute.POST("/login", middleware.CriticalRateLimit(), middleware.TurnstileCheck(), controller.Login)
|
|
|
|
|
userRoute.POST("/login/2fa", middleware.CriticalRateLimit(), controller.Verify2FALogin)
|
|
|
|
|
userRoute.POST("/passkey/login/begin", middleware.CriticalRateLimit(), controller.PasskeyLoginBegin)
|
|
|
|
|
userRoute.POST("/passkey/login/finish", middleware.CriticalRateLimit(), controller.PasskeyLoginFinish)
|
|
|
|
|
userRoute.POST("/register", middleware.CriticalRateLimit(), anonymousRequestBodyLimit, middleware.TurnstileCheck(), controller.Register)
|
|
|
|
|
userRoute.POST("/login", middleware.CriticalRateLimit(), anonymousRequestBodyLimit, middleware.TurnstileCheck(), controller.Login)
|
|
|
|
|
userRoute.POST("/login/2fa", middleware.CriticalRateLimit(), anonymousRequestBodyLimit, controller.Verify2FALogin)
|
|
|
|
|
userRoute.POST("/passkey/login/begin", middleware.CriticalRateLimit(), anonymousRequestBodyLimit, controller.PasskeyLoginBegin)
|
|
|
|
|
userRoute.POST("/passkey/login/finish", middleware.CriticalRateLimit(), anonymousRequestBodyLimit, controller.PasskeyLoginFinish)
|
|
|
|
|
//userRoute.POST("/tokenlog", middleware.CriticalRateLimit(), controller.TokenLog)
|
|
|
|
|
userRoute.GET("/logout", controller.Logout)
|
|
|
|
|
userRoute.POST("/epay/notify", controller.EpayNotify)
|
|
|
|
|
userRoute.POST("/epay/notify", anonymousRequestBodyLimit, controller.EpayNotify)
|
|
|
|
|
userRoute.GET("/epay/notify", controller.EpayNotify)
|
|
|
|
|
userRoute.GET("/groups", controller.GetUserGroups)
|
|
|
|
|
|
|
|
|
@@ -176,10 +177,10 @@ func SetApiRouter(router *gin.Engine) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Subscription payment callbacks (no auth)
|
|
|
|
|
apiRouter.POST("/subscription/epay/notify", controller.SubscriptionEpayNotify)
|
|
|
|
|
apiRouter.POST("/subscription/epay/notify", anonymousRequestBodyLimit, controller.SubscriptionEpayNotify)
|
|
|
|
|
apiRouter.GET("/subscription/epay/notify", controller.SubscriptionEpayNotify)
|
|
|
|
|
apiRouter.GET("/subscription/epay/return", controller.SubscriptionEpayReturn)
|
|
|
|
|
apiRouter.POST("/subscription/epay/return", controller.SubscriptionEpayReturn)
|
|
|
|
|
apiRouter.POST("/subscription/epay/return", anonymousRequestBodyLimit, controller.SubscriptionEpayReturn)
|
|
|
|
|
optionRoute := apiRouter.Group("/option")
|
|
|
|
|
optionRoute.Use(middleware.RootAuth())
|
|
|
|
|
{
|
|
|
|
|