package main import ( "context" "log" "time" "github.com/joho/godotenv" "github.com/techxcar/backend/internal/auth" "github.com/techxcar/backend/internal/config" "github.com/techxcar/backend/internal/server" "github.com/techxcar/backend/internal/tenant" "github.com/techxcar/backend/pkg/database" redispkg "github.com/techxcar/backend/pkg/redis" ) func main() { if err := godotenv.Load(); err != nil { log.Println("No .env file found, reading from environment") } cfg, err := config.Load() if err != nil { log.Fatal("Config error:", err) } db, err := database.New(cfg.DatabaseURL) if err != nil { log.Fatal("Database error:", err) } defer db.Close() if err := db.MigratePublic(cfg.DatabaseURL, "migrations/public"); err != nil { log.Fatal("Migration error:", err) } if err := db.MigrateAllTenantSchemas(context.Background(), "migrations/tenant"); err != nil { log.Fatal("Tenant migration error:", err) } rdb, err := redispkg.New(cfg.RedisURL) if err != nil { log.Fatal("Redis error:", err) } defer rdb.Close() seedSuperAdmin(db, cfg) app := server.New(server.Deps{Config: cfg, DB: db, Redis: rdb}) log.Printf("TechXCar API v0.2.0 listening on :%s (env: %s)", cfg.Port, cfg.AppEnv) log.Fatal(app.Listen(":" + cfg.Port)) } func seedSuperAdmin(db *database.DB, cfg *config.Config) { if cfg.InitialAdminEmail == "" || cfg.InitialAdminPassword == "" { return } ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) defer cancel() repo := tenant.NewRepository(db) existing, err := repo.GetSuperAdminByEmail(ctx, cfg.InitialAdminEmail) if err != nil || existing != nil { return } hash, err := auth.HashPassword(cfg.InitialAdminPassword) if err != nil { log.Printf("Warning: could not hash initial admin password: %v", err) return } if _, err := repo.CreateSuperAdmin(ctx, cfg.InitialAdminEmail, hash); err != nil { log.Printf("Warning: could not create initial super admin: %v", err) return } log.Printf("Initial super admin created: %s", cfg.InitialAdminEmail) }