package main import ( "fmt" "log" "github.com/tradarr/backend/internal/ai" "github.com/tradarr/backend/internal/api" "github.com/tradarr/backend/internal/api/handlers" "github.com/tradarr/backend/internal/auth" "github.com/tradarr/backend/internal/config" "github.com/tradarr/backend/internal/crypto" "github.com/tradarr/backend/internal/database" "github.com/tradarr/backend/internal/models" "github.com/tradarr/backend/internal/scheduler" "github.com/tradarr/backend/internal/scraper" "github.com/tradarr/backend/internal/scraper/bloomberg" "github.com/tradarr/backend/internal/scraper/reuters" "github.com/tradarr/backend/internal/scraper/watcherguru" "github.com/tradarr/backend/internal/scraper/yahoofinance" ) func main() { cfg, err := config.Load() if err != nil { log.Fatalf("config: %v", err) } db, err := database.Connect(cfg.DatabaseURL) if err != nil { log.Fatalf("database: %v", err) } defer db.Close() if err := database.RunMigrations(db); err != nil { log.Fatalf("migrations: %v", err) } repo := models.NewRepository(db) enc := crypto.New(cfg.EncryptionKey) pipeline := ai.NewPipeline(repo, enc) if err := ensureAdmin(repo, cfg); err != nil { log.Printf("ensure admin: %v", err) } registry := scraper.NewRegistry(repo) registry.Register(bloomberg.NewDynamic(repo, enc, cfg.ScraperURL)) registry.Register(yahoofinance.New()) registry.Register(reuters.New()) registry.Register(watcherguru.New()) sched := scheduler.New(registry, pipeline, repo) if err := sched.Start(); err != nil { log.Printf("scheduler: %v", err) } defer sched.Stop() h := handlers.New(repo, cfg, enc, registry, pipeline, sched) r := api.SetupRouter(h, cfg.JWTSecret) addr := fmt.Sprintf(":%s", cfg.Port) log.Printf("server listening on %s", addr) if err := r.Run(addr); err != nil { log.Fatalf("server: %v", err) } } func ensureAdmin(repo *models.Repository, cfg *config.Config) error { if cfg.AdminEmail == "" { return nil } existing, err := repo.GetUserByEmail(cfg.AdminEmail) if err != nil { return err } if existing != nil { return nil } hash, err := auth.HashPassword(cfg.AdminPassword) if err != nil { return err } _, err = repo.CreateUser(cfg.AdminEmail, hash, models.RoleAdmin) if err != nil { return err } log.Printf("admin account created: %s", cfg.AdminEmail) return nil }