91 lines
2.3 KiB
Go
91 lines
2.3 KiB
Go
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
|
|
}
|