package router import ( "github.com/gin-gonic/gin" "github.com/inchstep/server/internal/config" "github.com/inchstep/server/internal/handlers" "github.com/inchstep/server/internal/middleware" "github.com/inchstep/server/internal/services" "gorm.io/gorm" ) // Setup 配置所有路由 func Setup(db *gorm.DB, cfg *config.Config) *gin.Engine { r := gin.Default() r.Use(middleware.CORS()) r.Use(middleware.ErrorHandler()) userSvc := services.NewUserService(db) checkinSvc := services.NewCheckInService(db) pointsSvc := services.NewPointsService(db) socialSvc := services.NewSocialService(db) adminSvc := services.NewAdminService(db, userSvc) pointsSvc.InitAchievements() adminSvc.SeedAdmin() userH := handlers.NewUserHandler(userSvc, cfg.JWTSecret) checkinH := handlers.NewCheckInHandler(checkinSvc, pointsSvc) socialH := handlers.NewSocialHandler(socialSvc) achievementH := handlers.NewAchievementHandler(pointsSvc) adminH := handlers.NewAdminHandler(adminSvc, cfg.JWTSecret) api := r.Group("/api") { // 公开路由 auth := api.Group("/auth") { auth.POST("/register", userH.Register) auth.POST("/login", userH.Login) } // 管理员登录(公开) admin := api.Group("/admin") { admin.POST("/auth/login", adminH.Login) } // 需要认证的路由 authed := api.Group("") authed.Use(middleware.AuthRequired(cfg.JWTSecret)) { // 用户模块 user := authed.Group("/users") { user.GET("/profile", userH.GetProfile) user.PUT("/profile", userH.UpdateProfile) user.DELETE("/account", userH.DeleteAccount) user.GET("/points", userH.GetPoints) } // 打卡模块 checkin := authed.Group("/checkin") { checkin.POST("/items", checkinH.CreateItem) checkin.GET("/items", checkinH.ListItems) checkin.GET("/items/:id", checkinH.GetItem) checkin.PUT("/items/:id", checkinH.UpdateItem) checkin.DELETE("/items/:id", checkinH.DeleteItem) checkin.POST("/items/:id/pause", checkinH.PauseItem) checkin.POST("/items/:id/resume", checkinH.ResumeItem) checkin.POST("/records", checkinH.CreateRecord) checkin.GET("/records", checkinH.GetRecords) checkin.POST("/records/makeup", checkinH.MakeupRecord) checkin.GET("/streak/:id", checkinH.GetStreak) checkin.GET("/stats/monthly", checkinH.GetMonthlyStats) checkin.GET("/today-status", checkinH.GetTodayStatus) } // 社交模块 social := authed.Group("/social") { social.POST("/friends/request", socialH.SendFriendRequest) social.POST("/friends/accept", socialH.AcceptFriendRequest) social.DELETE("/friends/:userId", socialH.RemoveFriend) social.GET("/friends", socialH.ListFriends) social.GET("/feed", socialH.GetFeed) social.POST("/posts", socialH.CreatePost) social.POST("/posts/:id/like", socialH.LikePost) social.POST("/posts/:id/comment", socialH.CommentPost) social.POST("/groups", socialH.CreateGroup) social.POST("/groups/:id/join", socialH.JoinGroup) social.POST("/groups/:id/leave", socialH.LeaveGroup) social.GET("/groups/:id/members", socialH.GetGroupMembers) } // 成就模块 authed.GET("/achievements", achievementH.ListAll) authed.GET("/achievements/mine", achievementH.ListUserAchievements) // 管理后台 API(需额外管理员认证) adminAuthed := api.Group("/admin") adminAuthed.Use(middleware.AuthRequired(cfg.JWTSecret)) { adminAuthed.GET("/dashboard", adminH.Dashboard) adminAuthed.GET("/users", adminH.ListUsers) adminAuthed.GET("/posts", adminH.ListPosts) adminAuthed.GET("/admins", adminH.ListAdmins) adminAuthed.POST("/admins", adminH.CreateAdmin) adminAuthed.DELETE("/admins/:id", adminH.DisableAdmin) } } } r.GET("/health", func(c *gin.Context) { c.JSON(200, gin.H{"status": "ok"}) }) return r }