package main import ( "context" "flag" "log" "time" "gitcitadel-online/internal/cache" "gitcitadel-online/internal/config" "gitcitadel-online/internal/generator" "gitcitadel-online/internal/nostr" "gitcitadel-online/internal/server" ) func main() { configPath := flag.String("config", "config.yaml", "Path to configuration file") devMode := flag.Bool("dev", false, "Enable development mode") flag.Parse() // Load configuration cfg, err := config.LoadConfig(*configPath) if err != nil { log.Fatalf("Failed to load config: %v", err) } if err := cfg.Validate(); err != nil { log.Fatalf("Invalid config: %v", err) } if *devMode { log.Println("Development mode enabled") } // Initialize caches pageCache := cache.NewCache() feedCache := cache.NewFeedCache() // Initialize Nostr client nostrClient := nostr.NewClient(cfg.Relays.Primary, cfg.Relays.Fallback) ctx := context.Background() if err := nostrClient.Connect(ctx); err != nil { log.Printf("Warning: Failed to connect to relays: %v", err) } // Initialize services wikiService := nostr.NewWikiService(nostrClient) feedService := nostr.NewFeedService(nostrClient) issueService := nostr.NewIssueService(nostrClient) // Initialize HTML generator htmlGenerator, err := generator.NewHTMLGenerator( "templates", cfg.LinkBaseURL, cfg.SEO.SiteName, cfg.SEO.SiteURL, cfg.SEO.DefaultImage, ) if err != nil { log.Fatalf("Failed to initialize HTML generator: %v", err) } // Initialize cache rewarming rewarmer := cache.NewRewarmer( pageCache, feedCache, wikiService, feedService, htmlGenerator, cfg.WikiIndex, cfg.BlogIndex, cfg.Feed.Relay, cfg.Feed.MaxEvents, time.Duration(cfg.Cache.RefreshIntervalMinutes)*time.Minute, time.Duration(cfg.Feed.PollIntervalMinutes)*time.Minute, ) // Start cache rewarming rewarmer.Start(ctx) // Initialize HTTP server httpServer := server.NewServer(cfg.Server.Port, pageCache, feedCache, issueService, cfg.RepoAnnouncement, htmlGenerator) // Start server in goroutine go func() { if err := httpServer.Start(); err != nil { log.Fatalf("Server failed: %v", err) } }() log.Printf("Server started on port %d", cfg.Server.Port) log.Println("Waiting for initial cache population...") // Wait a bit for initial cache time.Sleep(5 * time.Second) // Wait for shutdown signal httpServer.WaitForShutdown() // Close Nostr client nostrClient.Close() }