router.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. package router
  2. import (
  3. "context"
  4. "net/http"
  5. "time"
  6. "github.com/celestia-trace/backend/config"
  7. "github.com/celestia-trace/backend/handlers"
  8. "github.com/celestia-trace/backend/middleware"
  9. "github.com/gin-gonic/gin"
  10. "gorm.io/gorm"
  11. )
  12. // Setup creates and configures the gin router
  13. func Setup(db *gorm.DB, cfg *config.Config) *gin.Engine {
  14. gin.SetMode(cfg.GinMode)
  15. r := gin.Default()
  16. // CORS middleware for dev
  17. r.Use(func(c *gin.Context) {
  18. c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
  19. c.Writer.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE")
  20. c.Writer.Header().Set("Access-Control-Allow-Headers", "Origin, Content-Type, Content-Length, Accept-Encoding, X-CSRF-Token, Authorization")
  21. if c.Request.Method == "OPTIONS" {
  22. c.AbortWithStatus(204)
  23. return
  24. }
  25. c.Next()
  26. })
  27. v1 := r.Group("/v1")
  28. {
  29. v1.GET("/health", func(c *gin.Context) {
  30. sqlDB, err := db.DB()
  31. if err != nil {
  32. c.JSON(http.StatusServiceUnavailable, gin.H{"code": 1, "message": "database unavailable"})
  33. return
  34. }
  35. ctx, cancel := context.WithTimeout(c.Request.Context(), 2*time.Second)
  36. defer cancel()
  37. if err := sqlDB.PingContext(ctx); err != nil {
  38. c.JSON(http.StatusServiceUnavailable, gin.H{"code": 1, "message": "database unavailable"})
  39. return
  40. }
  41. c.JSON(http.StatusOK, gin.H{"code": 0, "message": "success", "data": "healthy"})
  42. })
  43. authHandler := handlers.AuthHandler{DB: db, Cfg: cfg}
  44. authRoutes := v1.Group("/auth")
  45. {
  46. authRoutes.POST("/register", authHandler.Register)
  47. authRoutes.POST("/login", authHandler.Login)
  48. authRoutes.POST("/refresh", authHandler.Refresh)
  49. // Auth required
  50. authRoutes.Use(middleware.Auth(cfg))
  51. authRoutes.POST("/logout", authHandler.Logout)
  52. }
  53. userRoutes := v1.Group("/user")
  54. userRoutes.Use(middleware.Auth(cfg))
  55. {
  56. userRoutes.GET("/profile", authHandler.GetProfile)
  57. userRoutes.PUT("/profile", authHandler.UpdateProfile)
  58. userRoutes.POST("/change-password", authHandler.ChangePassword)
  59. }
  60. // Device management routes
  61. deviceHandler := handlers.DeviceHandler{DB: db}
  62. deviceRoutes := v1.Group("/devices")
  63. deviceRoutes.Use(middleware.Auth(cfg))
  64. {
  65. deviceRoutes.GET("", deviceHandler.GetDevices)
  66. deviceRoutes.POST("", deviceHandler.BindDevice)
  67. deviceRoutes.PUT("/:id", deviceHandler.UpdateDevice)
  68. deviceRoutes.DELETE("/:id", deviceHandler.UnbindDevice)
  69. }
  70. // Session / Field Record routes
  71. sessionHandler := handlers.SessionHandler{DB: db}
  72. mediaHandler := handlers.MediaHandler{DB: db, Cfg: cfg}
  73. sessionRoutes := v1.Group("/sessions")
  74. sessionRoutes.Use(middleware.Auth(cfg))
  75. {
  76. sessionRoutes.GET("", sessionHandler.GetSessions)
  77. sessionRoutes.POST("", sessionHandler.CreateSession)
  78. sessionRoutes.GET("/:id", sessionHandler.GetSessionDetail)
  79. sessionRoutes.POST("/:id/events", sessionHandler.AddEventToSession)
  80. sessionRoutes.DELETE("/:id", sessionHandler.DeleteSession)
  81. sessionRoutes.POST("/:id/assets", mediaHandler.UploadAsset)
  82. sessionRoutes.GET("/:id/assets/:assetId", mediaHandler.DownloadAsset)
  83. // Chunked upload routes
  84. sessionRoutes.POST("/:id/assets/init", mediaHandler.InitChunkedUpload)
  85. sessionRoutes.POST("/:id/assets/chunk", mediaHandler.UploadChunk)
  86. sessionRoutes.POST("/:id/assets/complete", mediaHandler.CompleteChunkedUpload)
  87. }
  88. // Sync settings & summary routes
  89. syncHandler := handlers.SyncHandler{DB: db}
  90. syncRoutes := v1.Group("/sync")
  91. syncRoutes.Use(middleware.Auth(cfg))
  92. {
  93. syncRoutes.GET("/settings", syncHandler.GetSyncSettings)
  94. syncRoutes.PUT("/settings", syncHandler.UpdateSyncSettings)
  95. syncRoutes.GET("/summary", syncHandler.GetSyncSummary)
  96. syncRoutes.POST("/trigger", syncHandler.TriggerManualSync)
  97. }
  98. // Storage quota route
  99. storageRoutes := v1.Group("/storage")
  100. storageRoutes.Use(middleware.Auth(cfg))
  101. {
  102. storageRoutes.GET("/quota", syncHandler.GetStorageQuota)
  103. }
  104. }
  105. return r
  106. }