129 lines
3.9 KiB
Go
129 lines
3.9 KiB
Go
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)
|
|
user.GET("/search", userH.SearchUsers)
|
|
}
|
|
|
|
// 排行榜(公开数据,需登录)
|
|
authed.GET("/leaderboard", userH.GetLeaderboard)
|
|
|
|
// 打卡模块
|
|
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
|
|
}
|