package httpserver import ( "github.com/dujiao-next/internal/app/container" "github.com/dujiao-next/internal/app/httpserver/middleware" affiliatebootstrap "github.com/dujiao-next/internal/bootstrap/affiliate" "github.com/dujiao-next/internal/config" affiliatetransport "github.com/dujiao-next/internal/modules/affiliate/transport/http" apicredentialtransport "github.com/dujiao-next/internal/modules/apicredential/transport/http" auditlogtransport "github.com/dujiao-next/internal/modules/auditlog/transport/http" captchatransport "github.com/dujiao-next/internal/modules/captcha/transport/http" carttransport "github.com/dujiao-next/internal/modules/cart/transport/http" categoryhttp "github.com/dujiao-next/internal/modules/catalog/category/transport/http" producthttp "github.com/dujiao-next/internal/modules/catalog/product/transport/http" contenttransport "github.com/dujiao-next/internal/modules/content/transport/http" giftcardtransport "github.com/dujiao-next/internal/modules/giftcard/transport/http" userauthtransport "github.com/dujiao-next/internal/modules/identity/userauth/transport/http" memberleveltransport "github.com/dujiao-next/internal/modules/memberlevel/transport/http" ordertransport "github.com/dujiao-next/internal/modules/order/transport/http" paymenttransport "github.com/dujiao-next/internal/modules/payment/transport/http" paymentcallbacktransport "github.com/dujiao-next/internal/modules/payment/transport/http/callback" resellertransport "github.com/dujiao-next/internal/modules/reseller/transport/http/user" publicconfigtransport "github.com/dujiao-next/internal/modules/settings/transport/http/public" wallettransport "github.com/dujiao-next/internal/modules/wallet/transport/http" "github.com/gin-gonic/gin" "github.com/redis/go-redis/v9" ) func registerStorefrontRoutes( apiV1 *gin.RouterGroup, cfg *config.Config, c *container.Container, publicContentHandler *contenttransport.PublicHandler, publicCatalogHandler *producthttp.PublicHandler, publicCategoryHandler *categoryhttp.PublicHandler, userResellerHandler *resellertransport.UserHandler, userResellerProductSettingHandler *resellertransport.UserProductSettingHandler, userResellerFinanceHandler *resellertransport.UserFinanceHandler, userResellerOrderHandler *resellertransport.UserOrderHandler, userApiCredentialHandler *apicredentialtransport.UserHandler, userAuditLogHandler *auditlogtransport.UserHandler, userGiftCardHandler *giftcardtransport.UserHandler, publicMemberLevelHandler *memberleveltransport.PublicHandler, userProfileHandler *userauthtransport.UserProfileHandler, userEmailHandler *userauthtransport.UserEmailHandler, userPasswordHandler *userauthtransport.UserPasswordHandler, userVerifyHandler *userauthtransport.UserVerifyHandler, userTelegramOIDCHandler *userauthtransport.UserTelegramOIDCHandler, userTelegramHandler *userauthtransport.UserTelegramHandler, userGoogleHandler *userauthtransport.UserGoogleHandler, userLoginHandler *userauthtransport.UserLoginHandler, user2FAHandler *userauthtransport.User2FAHandler, userInviteHandler *userauthtransport.UserInviteHandler, publicConfigHandler *publicconfigtransport.Handler, userCartHandler *carttransport.UserHandler, userOrderHandler *ordertransport.UserHandler, guestOrderHandler *ordertransport.GuestHandler, orderPreviewHandler *ordertransport.PreviewHandler, orderCreateHandler *ordertransport.CreateHandler, paymentLatestHandler *paymenttransport.LatestHandler, paymentWriteHandler *paymenttransport.WriteHandler, userWalletHandler *wallettransport.UserHandler, redisClient *redis.Client, loginRule middleware.RateLimitRule, guestReadRule middleware.RateLimitRule, guestWriteRule middleware.RateLimitRule, giftCardRedeemRule middleware.RateLimitRule, ) { storefront := apiV1.Group("") storefront.Use(middleware.ResellerTenantMiddleware(c.ResellerDomainResolver)) affiliateHandler := affiliatebootstrap.NewStorefrontHandler(c) // 公开接口 public := storefront.Group("/public") { publicconfigtransport.RegisterPublicRoutes(public, publicConfigHandler) producthttp.RegisterPublicRoutes(public, publicCatalogHandler) categoryhttp.RegisterPublicRoutes(public, publicCategoryHandler) contenttransport.RegisterPublicRoutes(public, publicContentHandler) captchatransport.RegisterPublicRoutes(public, captchatransport.NewPublicHandler(c.CaptchaService)) affiliatetransport.RegisterPublicRoutes(public, affiliateHandler) memberleveltransport.RegisterPublicRoutes(public, publicMemberLevelHandler) } // 游客接口 guest := storefront.Group("/guest") guestRead := guest.Group("") guestRead.Use(middleware.RateLimitMiddleware(redisClient, guestReadRule, middleware.KeyByIP)) { ordertransport.RegisterGuestPreviewRoute(guestRead, orderPreviewHandler) ordertransport.RegisterGuestReadRoutes(guestRead, guestOrderHandler) paymenttransport.RegisterGuestLatestRoute(guestRead, paymentLatestHandler) } guestWrite := guest.Group("") guestWrite.Use(middleware.RateLimitMiddleware(redisClient, guestWriteRule, middleware.KeyByIP)) { ordertransport.RegisterGuestCreateRoute(guestWrite, orderCreateHandler) ordertransport.RegisterGuestCreateAndPayRoute(guestWrite, orderCreateHandler) paymenttransport.RegisterGuestWriteRoutes(guestWrite, paymentWriteHandler) } // 注册 / 忘记密码 / 发送验证码:按 IP 计数,共享出口 IP(NAT)下一次完整流程就要 2~4 次请求, // 不能照搬登录的 5 次/封 15 分钟,否则同网用户会被成批误封。 authRule := middleware.RateLimitRule{ Prefix: loginRule.Prefix + ":auth", WindowSeconds: 300, MaxRequests: 20, BlockSeconds: 300, MessageKey: "error.rate_limited", } authRateLimit := middleware.RateLimitMiddleware(redisClient, authRule, middleware.KeyByIP) // 用户认证接口 auth := storefront.Group("/auth") { userauthtransport.RegisterUserVerifyAuthRoutes(auth, userVerifyHandler, authRateLimit) userauthtransport.RegisterUserRegisterAuthRoutes(auth, userLoginHandler, authRateLimit) userauthtransport.RegisterUserLoginAuthRoutes(auth, userLoginHandler, middleware.RateLimitMiddleware(redisClient, loginRule, middleware.KeyByIPAndJSONField("email"))) userauthtransport.RegisterUser2FAAuthRoutes(auth, user2FAHandler, middleware.RateLimitMiddleware(redisClient, loginRule, middleware.KeyByIP)) userauthtransport.RegisterUserTelegramAuthRoutes(auth, userTelegramHandler, middleware.RateLimitMiddleware(redisClient, loginRule, middleware.KeyByIP)) userauthtransport.RegisterUserTelegramOIDCAuthRoutes(auth, userTelegramOIDCHandler, middleware.RateLimitMiddleware(redisClient, loginRule, middleware.KeyByIP)) userauthtransport.RegisterUserGoogleAuthRoutes(auth, userGoogleHandler, middleware.RateLimitMiddleware(redisClient, loginRule, middleware.KeyByIP)) userauthtransport.RegisterUserInviteAuthRoutes(auth, userInviteHandler, middleware.RateLimitMiddleware(redisClient, loginRule, middleware.KeyByIP)) userauthtransport.RegisterUserPasswordAuthRoutes(auth, userPasswordHandler, authRateLimit) } // 用户接口(需鉴权) user := storefront.Group("") user.Use(middleware.UserJWTAuthMiddleware(cfg.UserJWT.SecretKey, c.UserStore)) { userauthtransport.RegisterUserProfileRoutes(user, userProfileHandler) auditlogtransport.RegisterUserRoutes(user, userAuditLogHandler) userauthtransport.RegisterUserPasswordRoutes(user, userPasswordHandler) userauthtransport.RegisterUserTelegramRoutes(user, userTelegramHandler) userauthtransport.RegisterUserTelegramOIDCRoutes(user, userTelegramOIDCHandler) userauthtransport.RegisterUserGoogleRoutes( user, userGoogleHandler, middleware.RateLimitMiddleware(redisClient, loginRule, middleware.KeyByUserIDAndIP), ) userauthtransport.RegisterUserEmailRoutes(user, userEmailHandler) userauthtransport.RegisterUser2FARoutes(user, user2FAHandler) carttransport.RegisterUserRoutes(user, userCartHandler) ordertransport.RegisterUserCreateRoute(user, orderCreateHandler) ordertransport.RegisterUserCreateAndPayRoute(user, orderCreateHandler) ordertransport.RegisterUserPreviewRoute(user, orderPreviewHandler) ordertransport.RegisterUserPaymentChannelsRoute(user, userOrderHandler) ordertransport.RegisterUserReadRoutes(user, userOrderHandler) ordertransport.RegisterUserCancelRoute(user, userOrderHandler) paymenttransport.RegisterUserWriteRoutes(user, paymentWriteHandler) paymenttransport.RegisterUserLatestRoute(user, paymentLatestHandler) wallettransport.RegisterUserRoutes(user, userWalletHandler) giftCardRedeem := user.Group("", middleware.RateLimitMiddleware(redisClient, giftCardRedeemRule, middleware.KeyByUserIDAndIP)) giftcardtransport.RegisterUserRoutes(giftCardRedeem, userGiftCardHandler) affiliatetransport.RegisterUserRoutes(user, affiliateHandler) resellerConsole := user.Group("/reseller") resellerConsole.Use(middleware.RequireMainTenantForResellerConsole()) { resellertransport.RegisterUserConsoleRoutes(resellerConsole, userResellerHandler) resellertransport.RegisterUserProductSettingRoutes(resellerConsole, userResellerProductSettingHandler) resellertransport.RegisterUserFinanceRoutes(resellerConsole, userResellerFinanceHandler) resellertransport.RegisterUserOrderRoutes(resellerConsole, userResellerOrderHandler) } // API 对接权限(用户中心) apicredentialtransport.RegisterUserRoutes(user, userApiCredentialHandler) } } func registerPaymentCallbackRoutes(apiV1 *gin.RouterGroup, callbackHandler *paymentcallbacktransport.Handler, webhookHandler *paymenttransport.WebhookHandler, epayRedirectHandler *paymenttransport.EpayRedirectHandler, redisClient *redis.Client, callbackRule middleware.RateLimitRule) { callbacks := apiV1.Group("", middleware.RateLimitMiddleware(redisClient, callbackRule, middleware.KeyByIP)) paymentcallbacktransport.RegisterRoutes(callbacks, callbackHandler) paymenttransport.RegisterWebhookRoutes(callbacks, webhookHandler) paymenttransport.RegisterEpayRedirectRoute(callbacks, epayRedirectHandler) }