Files
FileRelay/main.go
2026-01-13 17:07:27 +08:00

104 lines
2.8 KiB
Go

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 <your-jwt-token>" 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))
}