Files
0451meishi/backend/internal/httpx/router.go
2026-01-15 11:37:22 +08:00

126 lines
4.0 KiB
Go

package httpx
import (
"net/http"
"time"
"0451meishiditu/backend/internal/config"
"0451meishiditu/backend/internal/handlers"
"0451meishiditu/backend/internal/middleware"
"0451meishiditu/backend/internal/settings"
"github.com/gin-contrib/cors"
"github.com/gin-contrib/gzip"
"github.com/gin-gonic/gin"
"github.com/redis/go-redis/v9"
"go.uber.org/zap"
"gorm.io/gorm"
)
func NewRouter(cfg config.Config, log *zap.Logger, db *gorm.DB, rdb *redis.Client, st *settings.Store) *gin.Engine {
if cfg.AppEnv == "prod" {
gin.SetMode(gin.ReleaseMode)
}
r := gin.New()
r.Use(middleware.Recover(log))
r.Use(middleware.RequestID())
r.Use(middleware.AccessLog(log))
r.Use(gzip.Gzip(gzip.DefaultCompression))
r.Use(cors.New(cors.Config{
AllowOriginFunc: func(origin string) bool { return st.CORSAllowOrigin(origin) },
AllowMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"},
AllowHeaders: []string{"Authorization", "Content-Type", "X-API-Key", "X-Request-Id"},
ExposeHeaders: []string{"X-Request-Id"},
AllowCredentials: true,
MaxAge: 12 * time.Hour,
}))
r.Static("/static", "./static")
r.GET("/healthz", func(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{"ok": true})
})
h := handlers.New(cfg, log, db, rdb, st)
api := r.Group("/api")
api.Use(middleware.APIKey(cfg, db))
public := api.Group("")
public.GET("/captcha/new", h.CaptchaNew)
public.GET("/categories", h.PublicCategoryList)
public.GET("/stores", h.PublicStoreList)
public.GET("/stores/:id", h.PublicStoreGet)
public.GET("/stores/:id/reviews", h.PublicStoreReviews)
public.GET("/rankings/stores", h.PublicStoreRanking)
public.POST("/merchant/apply", h.MerchantApply)
public.GET("/stores/search", h.PublicStoreSearch)
public.GET("/stores/hot", h.PublicStoreHotRank)
user := api.Group("/user")
user.POST("/register", h.UserRegister)
user.POST("/login", h.UserLogin)
user.POST("/douyin/login", h.DouyinLogin)
userAuth := user.Group("")
userAuth.Use(middleware.UserJWT(cfg))
userAuth.GET("/me", h.UserMe)
userAuth.GET("/reviews", h.UserMyReviews)
userAuth.POST("/upload", h.UserUpload)
userAuth.POST("/stores/:id/reviews", h.UserCreateReview)
userAuth.POST("/stores/:id/like", h.UserToggleStoreLike)
admin := api.Group("/admin")
admin.POST("/login", h.AdminLogin)
adminAuth := admin.Group("")
adminAuth.Use(middleware.AdminJWT(cfg))
adminAuth.GET("/me", h.AdminMe)
adminAuth.GET("/dashboard/overview", h.DashboardOverview)
adminAuth.GET("/apikeys", h.APIKeyList)
adminAuth.POST("/apikeys", h.APIKeyCreate)
adminAuth.PATCH("/apikeys/:id/revoke", h.APIKeyRevoke)
adminAuth.GET("/settings/cors", h.SettingsGetCORS)
adminAuth.PUT("/settings/cors", h.SettingsUpdateCORS)
adminAuth.GET("/merchant/applications", h.AdminMerchantApplyList)
adminAuth.PATCH("/merchant/applications/:id/review", h.AdminMerchantApplyReview)
adminAuth.GET("/rankings/stores", h.AdminStoreRanking)
adminAuth.POST("/rankings/stores/recalc", h.AdminRecalcStoreScore)
adminAuth.GET("/admins", h.AdminListAdmins)
adminAuth.POST("/admins", h.AdminCreateAdmin)
adminAuth.PATCH("/admins/:id/password", h.AdminUpdateAdminPassword)
adminAuth.PATCH("/admins/:id/enabled", h.AdminUpdateAdminEnabled)
adminAuth.GET("/users", h.AdminUserList)
adminAuth.GET("/users/:id", h.AdminUserGet)
adminAuth.PATCH("/users/:id/status", h.AdminUserUpdateStatus)
adminAuth.GET("/categories", h.CategoryList)
adminAuth.POST("/categories", h.CategoryCreate)
adminAuth.PUT("/categories/:id", h.CategoryUpdate)
adminAuth.DELETE("/categories/:id", h.CategoryDelete)
adminAuth.GET("/stores", h.StoreList)
adminAuth.GET("/stores/:id", h.StoreGet)
adminAuth.POST("/stores", h.StoreCreate)
adminAuth.PUT("/stores/:id", h.StoreUpdate)
adminAuth.PATCH("/stores/:id/status", h.StoreUpdateStatus)
adminAuth.DELETE("/stores/:id", h.StoreDelete)
adminAuth.GET("/reviews", h.ReviewList)
adminAuth.PATCH("/reviews/:id/status", h.ReviewUpdateStatus)
adminAuth.DELETE("/reviews/:id", h.ReviewDelete)
adminAuth.POST("/upload", h.Upload)
return r
}