Files

178 lines
9.8 KiB
Go

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)
}