package main import ( "context" "fmt" "log" "os" "time" "github.com/timetracker/backend/internal/models" "gorm.io/gorm/logger" ) func main() { // Parse command line flags force := false for _, arg := range os.Args[1:] { if arg == "--force" || arg == "-f" { force = true } } // Get database configuration with sensible defaults dbConfig := models.DefaultDatabaseConfig() // Override with environment variables if provided if host := os.Getenv("DB_HOST"); host != "" { dbConfig.Host = host } if port := os.Getenv("DB_PORT"); port != "" { var portInt int if _, err := fmt.Sscanf(port, "%d", &portInt); err == nil && portInt > 0 { dbConfig.Port = portInt } } if user := os.Getenv("DB_USER"); user != "" { dbConfig.User = user } if password := os.Getenv("DB_PASSWORD"); password != "" { dbConfig.Password = password } if dbName := os.Getenv("DB_NAME"); dbName != "" { dbConfig.DBName = dbName } if sslMode := os.Getenv("DB_SSLMODE"); sslMode != "" { dbConfig.SSLMode = sslMode } // Set log level dbConfig.LogLevel = logger.Info // Initialize database fmt.Println("Connecting to database...") if err := models.InitDB(dbConfig); err != nil { log.Fatalf("Error initializing database: %v", err) } defer func() { if err := models.CloseDB(); err != nil { log.Printf("Error closing database connection: %v", err) } }() fmt.Println("✓ Database connection successful") // Create context with timeout ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) defer cancel() // Check if we need to seed (e.g., no companies exist) if !force { var count int64 db := models.GetEngine(ctx) if err := db.Model(&models.Company{}).Count(&count).Error; err != nil { log.Fatalf("Error checking if seeding is needed: %v", err) } // If data already exists, skip seeding if count > 0 { fmt.Println("Database already contains data. Use --force to override.") return } } // Seed the database fmt.Println("Seeding database with initial data...") if err := models.SeedDB(ctx); err != nil { log.Fatalf("Error seeding database: %v", err) } fmt.Println("✓ Database seeding completed successfully") }