// Path: Backend/cmd/server/main.go package main import ( "boostai-backend/internal/config" "boostai-backend/internal/database" "boostai-backend/internal/router" "context" "log" "os" "os/signal" "syscall" "time" "github.com/gofiber/fiber/v2" "github.com/gofiber/fiber/v2/middleware/cors" "github.com/gofiber/fiber/v2/middleware/logger" "github.com/gofiber/fiber/v2/middleware/recover" ) func main() { cfg := config.Load() db, err := database.NewPostgres(cfg.DatabaseURL) if err != nil { log.Fatalf("failed to connect to database: %v", err) } defer db.Close() log.Println("Connected to database") if err := db.Migrate(); err != nil { log.Fatalf("failed to run migrations: %v", err) } log.Println("Database migrations complete") app := fiber.New(fiber.Config{ AppName: "BoostAI Backend", ReadTimeout: 10 * time.Second, WriteTimeout: 10 * time.Second, IdleTimeout: 120 * time.Second, }) app.Use(recover.New()) app.Use(logger.New(logger.Config{ Format: "${time} | ${status} | ${latency} | ${ip} | ${method} | ${path}\n", TimeFormat: "2006-01-02 15:04:05", })) app.Use(cors.New(cors.Config{ AllowOrigins: cfg.AllowedOrigins, AllowMethods: "GET,POST,PUT,DELETE,PATCH,OPTIONS", AllowHeaders: "Origin,Content-Type,Accept,Authorization", AllowCredentials: true, MaxAge: 86400, })) router.Setup(app, cfg, db) go func() { if err := app.Listen(":" + cfg.Port); err != nil { log.Fatalf("failed to start server: %v", err) } }() log.Printf("BoostAI backend listening on port %s", cfg.Port) quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutting down backend server...") ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := app.ShutdownWithContext(ctx); err != nil { log.Fatalf("server forced to shutdown: %v", err) } log.Println("Backend server exited") }