126 lines
4.0 KiB
Go
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
|
|
}
|