package main import ( _ "FileRelay/docs" "FileRelay/internal/api/admin" "FileRelay/internal/api/middleware" "FileRelay/internal/api/public" "FileRelay/internal/bootstrap" "FileRelay/internal/config" "FileRelay/internal/task" "context" "fmt" "log" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" swaggerFiles "github.com/swaggo/files" ginSwagger "github.com/swaggo/gin-swagger" ) // @title 文件暂存柜 API // @version 1.0 // @description 自托管的文件暂存柜后端系统 API 文档 // @termsOfService http://swagger.io/terms/ // @contact.name API Support // @contact.url http://www.swagger.io/support // @contact.email support@swagger.io // @license.name Apache 2.0 // @license.url http://www.apache.org/licenses/LICENSE-2.0.html // @BasePath / // @securityDefinitions.apikey AdminAuth // @in header // @name Authorization // @description Type "Bearer " to authenticate. func main() { // 1. 加载配置 if err := config.LoadConfig("config/config.yaml"); err != nil { log.Fatalf("Failed to load config: %v", err) } // 2. 初始化 bootstrap.InitDB() // 3. 启动清理任务 cleaner := task.NewCleaner() go cleaner.Start(context.Background()) // 4. 设置路由 r := gin.Default() // 配置更完善的 CORS corsConfig := cors.DefaultConfig() corsConfig.AllowAllOrigins = true corsConfig.AllowHeaders = append(corsConfig.AllowHeaders, "Authorization", "Accept", "X-Requested-With") corsConfig.AllowMethods = append(corsConfig.AllowMethods, "OPTIONS") r.Use(cors.New(corsConfig)) // Swagger 文档 r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) // 公共接口 uploadHandler := public.NewUploadHandler() pickupHandler := public.NewPickupHandler() api := r.Group("/api") { api.POST("/upload", uploadHandler.Upload) api.POST("/upload/text", uploadHandler.UploadText) api.GET("/pickup/:pickup_code", middleware.PickupRateLimit(), pickupHandler.Pickup) api.GET("/download/file/:file_id", pickupHandler.DownloadFile) api.GET("/download/batch/:pickup_code", pickupHandler.DownloadBatch) } // 管理员接口 authHandler := admin.NewAuthHandler() batchHandler := admin.NewBatchHandler() tokenHandler := admin.NewTokenHandler() r.POST("/admin/login", authHandler.Login) adm := r.Group("/admin") adm.Use(middleware.AdminAuth()) { adm.GET("/batches", batchHandler.ListBatches) adm.GET("/batch/:batch_id", batchHandler.GetBatch) adm.PUT("/batch/:batch_id", batchHandler.UpdateBatch) adm.DELETE("/batch/:batch_id", batchHandler.DeleteBatch) adm.GET("/api-tokens", tokenHandler.ListTokens) adm.POST("/api-tokens", tokenHandler.CreateToken) adm.DELETE("/api-tokens/:id", tokenHandler.DeleteToken) } // 5. 运行 port := 8080 fmt.Printf("Server is running on port %d\n", port) r.Run(fmt.Sprintf(":%d", port)) }