package main import ( "context" "log" "net/http" "os" "path/filepath" "fastfileviewer/backend/internal/config" "fastfileviewer/backend/internal/db" "fastfileviewer/backend/internal/handlers" "fastfileviewer/backend/internal/middleware" "fastfileviewer/backend/internal/services" "github.com/gin-gonic/gin" ) func main() { cfg := config.Load() if cfg.AutoPassword { log.Printf("ADMIN_PASSWORD 未设置,已自动生成临时密码: %s", cfg.AdminPassword) } if err := os.MkdirAll(cfg.RootDir, 0o755); err != nil { log.Fatalf("create root dir failed: %v", err) } database, err := db.New(cfg.DBPath) if err != nil { log.Fatalf("db init failed: %v", err) } fsSvc := services.NewFSService(cfg.RootDir) taskSvc := services.NewTaskService(database, fsSvc, cfg.MaxWorkers) taskSvc.Start(context.Background()) authHandler := handlers.NewAuthHandler(cfg) fileHandler := handlers.NewFileHandler(fsSvc) taskHandler := handlers.NewTaskHandler(taskSvc) router := gin.Default() router.GET("/healthz", func(ctx *gin.Context) { ctx.JSON(http.StatusOK, gin.H{"ok": true}) }) router.POST("/api/login", authHandler.Login) api := router.Group("/api") api.Use(middleware.AuthRequired(cfg.JWTSecret)) { api.GET("/fs/list", fileHandler.List) api.POST("/fs/upload", fileHandler.Upload) api.POST("/fs/move", fileHandler.Move) api.POST("/fs/rename", fileHandler.Rename) api.POST("/fs/delete", fileHandler.Delete) api.GET("/fs/download", fileHandler.Download) api.POST("/tasks/download", taskHandler.CreateDownload) api.POST("/tasks/extract", taskHandler.CreateExtract) api.GET("/tasks", taskHandler.List) api.GET("/tasks/:id", taskHandler.Get) api.GET("/tasks/:id/stream", taskHandler.Stream) } frontendDist := filepath.Join("/app", "web", "dist") if _, err := os.Stat(frontendDist); err != nil { frontendDist = filepath.Join("web", "dist") } if _, err := os.Stat(frontendDist); err == nil { router.Static("/assets", filepath.Join(frontendDist, "assets")) router.NoRoute(func(ctx *gin.Context) { ctx.File(filepath.Join(frontendDist, "index.html")) }) } else { log.Printf("frontend dist not found, only API routes are available") } log.Printf("server listening on :%s", cfg.Port) log.Printf("storage root: %s", cfg.RootDir) if err := router.Run(":" + cfg.Port); err != nil { log.Fatalf("server failed: %v", err) } }