package main import ( "context" "fmt" "log" "os" "os/signal" "strconv" "syscall" "time" "git.kling.dev/jared/WorkoutTrackerAPI/internal/database" "git.kling.dev/jared/WorkoutTrackerAPI/internal/server" ) func main() { dbHost := os.Getenv("DB_HOST") dbPort := os.Getenv("DB_PORT") dbUser := os.Getenv("DB_USER") dbPassword := os.Getenv("DB_PASSWORD") dbName := os.Getenv("DB_NAME") webPort := os.Getenv("PORT") if dbHost == "" || dbPort == "" || dbUser == "" || dbPassword == "" || dbName == "" { log.Fatal("Not all database params are set") } dbPortParsed, err := strconv.ParseInt(dbPort, 10, 64) if err != nil { log.Fatal("Unable to parse db port to an int") } if webPort == "" { webPort = "8080" } webPortParsed, err := strconv.ParseInt(webPort, 10, 64) if err != nil { log.Fatal("Unable to parse web port to an int") } dbConn, err := database.NewConnection(database.Config{ Host: dbHost, Port: int(dbPortParsed), User: dbUser, Password: dbPassword, DBName: dbName, }) if err != nil { log.Fatal("Failed to connect to database: ", err) } defer dbConn.Close() jwtSecret := os.Getenv("JWT_SECRET") if jwtSecret == "" { log.Fatal("Unable to determine the JWT_SECRET") } s := server.NewServer(dbConn, jwtSecret) go func() { fmt.Printf("Server listening on port %d\n", webPortParsed) webAddr := fmt.Sprintf(":%d", webPortParsed) s.Start(webAddr) }() quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutting down server...") ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() if err := s.Shutdown(ctx); err != nil { log.Fatal("Server forced to shutdown:", err) } log.Println("Server exited") }