package main import ( "log" "os" "os/signal" "syscall" "tercul/internal/app" app_analytics "tercul/internal/app/analytics" analytics_job "tercul/internal/jobs/analytics" "tercul/internal/platform/config" app_log "tercul/internal/platform/log" "github.com/hibiken/asynq" ) func main() { // Load configuration from environment variables config.LoadConfig() // Initialize structured logger app_log.SetDefaultLevel(app_log.InfoLevel) app_log.LogInfo("Starting Tercul worker") // Build application components appBuilder := app.NewApplicationBuilder() if err := appBuilder.Build(); err != nil { log.Fatalf("Failed to build application: %v", err) } defer appBuilder.Close() // Create asynq server srv := asynq.NewServer( asynq.RedisClientOpt{ Addr: config.Cfg.RedisAddr, Password: config.Cfg.RedisPassword, DB: config.Cfg.RedisDB, }, asynq.Config{ Queues: map[string]int{ app_analytics.QueueAnalytics: 10, // Process analytics queue with priority 10 }, }, ) // Create and register analytics worker analyticsWorker := analytics_job.NewWorker(appBuilder.App.AnalyticsService) mux := asynq.NewServeMux() mux.HandleFunc(string(app_analytics.EventTypeWorkViewed), analyticsWorker.ProcessTask) mux.HandleFunc(string(app_analytics.EventTypeWorkLiked), analyticsWorker.ProcessTask) mux.HandleFunc(string(app_analytics.EventTypeWorkCommented), analyticsWorker.ProcessTask) mux.HandleFunc(string(app_analytics.EventTypeWorkBookmarked), analyticsWorker.ProcessTask) mux.HandleFunc(string(app_analytics.EventTypeTranslationViewed), analyticsWorker.ProcessTask) mux.HandleFunc(string(app_analytics.EventTypeTranslationLiked), analyticsWorker.ProcessTask) mux.HandleFunc(string(app_analytics.EventTypeTranslationCommented), analyticsWorker.ProcessTask) // Start the server go func() { if err := srv.Run(mux); err != nil { log.Fatalf("could not run asynq server: %v", err) } }() // Wait for interrupt signal to gracefully shutdown the server quit := make(chan os.Signal, 1) signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) <-quit log.Println("Shutting down worker server...") srv.Shutdown() log.Println("Worker server shutdown successfully") }