package httpserver // "time" // func StartBetAPIDataFetchingCrons( // eventService *eventsvc.Service, // oddsService oddssvc.ServiceImpl, // resultService *resultsvc.Service, // mongoLogger *zap.Logger, // ) { // c := cron.New(cron.WithSeconds()) // schedule := []struct { // spec string // task func() // }{ // { // spec: "0 0 * * * *", // Every 1 hour // task: func() { // start := time.Now() // mongoLogger.Info("[BetAPI Event Fetching Crons] Began fetching upcoming events cron task", zap.Time("timestamp", time.Now())) // if err := eventService.FetchUpcomingEvents(context.Background()); err != nil { // mongoLogger.Error("[BetAPI Event Fetching Crons] Failed to fetch upcoming events", // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // zap.Error(err), // ) // } else { // mongoLogger.Info("[BetAPI Event Fetching Crons] Completed fetching upcoming events without errors", // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } // }, // }, // { // spec: "0 0 * * * *", // Every 1 hour (since its takes that long to fetch all the events) // task: func() { // start := time.Now() // mongoLogger.Info("[BetAPI Pre-Match Odds Fetching Crons] Began fetching pre-match odds cron task", // zap.Time("timestamp", time.Now()), // ) // if err := oddsService.FetchNonLiveOdds(context.Background()); err != nil { // mongoLogger.Error("[BetAPI Pre-Match Odds Fetching Crons] Failed to fetch pre-match odds", // zap.Error(err), // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } else { // mongoLogger.Info("[BetAPI Pre-Match Odds Fetching Crons] Completed fetching pre-match odds without errors", // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } // }, // }, // { // spec: "0 */5 * * * *", // Every 5 Minutes // task: func() { // start := time.Now() // mongoLogger.Info("[BetAPI Check And Update Expired Events Crons] Began update all expired events status cron task", // zap.Time("timestamp", time.Now()), // ) // if _, err := resultService.CheckAndUpdateExpiredB365Events(context.Background()); err != nil { // mongoLogger.Error("[BetAPI Check And Update Expired Events Crons] Failed to update expired events status", // zap.Error(err), // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } else { // mongoLogger.Info("[BetAPI Check And Update Expired Events Crons] Completed expired events without errors", // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } // }, // }, // { // spec: "0 */15 * * * *", // Every 15 Minutes // task: func() { // start := time.Now() // mongoLogger.Info("[BetAPI Fetch Result and Update Bets Crons] Began updating bets based on event results cron task") // if err := resultService.FetchB365ResultAndUpdateBets(context.Background()); err != nil { // mongoLogger.Error("[BetAPI Fetch Result and Update Bets Crons] Failed to process result", // zap.Error(err), // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } else { // mongoLogger.Info("[BetAPI Fetch Result and Update Bets Crons] Completed processing all event result outcomes without errors", // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } // }, // }, // { // spec: "0 0 0 * * 1", // Every Monday // task: func() { // mongoLogger.Info("[BetAPI Send Result Notification Crons] Began Send weekly result notification cron task", // zap.Time("timestamp", time.Now()), // ) // if err := resultService.CheckAndSendResultNotifications(context.Background(), time.Now().Add(-7*24*time.Hour)); err != nil { // mongoLogger.Error("[BetAPI Send Result Notification Crons] Failed to process result", // zap.Time("timestamp", time.Now()), // zap.Error(err), // ) // } else { // mongoLogger.Info("[BetAPI Send Result Notification Crons] Completed sending weekly result notification without errors", // zap.Time("timestamp", time.Now()), // ) // } // }, // }, // } // for _, job := range schedule { // // job.task() // if _, err := c.AddFunc(job.spec, job.task); err != nil { // mongoLogger.Error("[BetAPI Data Fetching Crons] Failed to schedule data fetching cron job", // zap.Time("timestamp", time.Now()), // zap.Error(err), // ) // } // } // c.Start() // mongoLogger.Info("[BetAPI Data Fetching Crons] Started Data Fetching Cron jobs", // zap.Time("timestamp", time.Now()), // ) // } // func StartCleanupCrons(ticketService ticket.Service, notificationSvc *notificationservice.Service, mongoLogger *zap.Logger) { // c := cron.New(cron.WithSeconds()) // schedule := []struct { // spec string // task func() // }{ // { // spec: "0 0 * * * *", // Every hour // task: func() { // mongoLogger.Info("[Delete Old Ticket Crons] Deleting old tickets", zap.Time("timestamp", time.Now())) // if err := ticketService.DeleteOldTickets(context.Background()); err != nil { // mongoLogger.Error("[Delete Old Ticket Crons] Failed to remove old ticket", // zap.Error(err), // zap.Time("timestamp", time.Now()), // ) // } else { // mongoLogger.Info("[Delete Old Ticket Crons] Successfully deleted old tickets", // zap.Time("timestamp", time.Now()), // ) // } // }, // }, // { // spec: "0 0 0 * * 1", // Every Monday (Weekly) // task: func() { // mongoLogger.Info("[Delete Old Notification Crons] Deleting old notifications") // if err := notificationSvc.DeleteOldNotifications(context.Background()); err != nil { // mongoLogger.Error("Failed to remove old notifications", // zap.Time("timestamp", time.Now()), // zap.Error(err), // ) // } else { // mongoLogger.Info("[Delete Old Notification Crons] Successfully deleted old notifications", // zap.Time("timestamp", time.Now()), // ) // } // }, // }, // } // for _, job := range schedule { // if _, err := c.AddFunc(job.spec, job.task); err != nil { // mongoLogger.Error("[Start Cleanup Crons] Failed to schedule cleanup cron job", // zap.Time("timestamp", time.Now()), // zap.Error(err), // ) // } // } // c.Start() // mongoLogger.Info("[Start Cleanup Crons] Started cleanup cron jobs", // zap.Time("timestamp", time.Now()), // ) // } // func StartStatCrons(statService *stats.Service, mongoLogger *zap.Logger) { // c := cron.New(cron.WithSeconds()) // schedule := []struct { // spec string // task func() // }{ // { // spec: "0 0 * * * *", // Every hour // task: func() { // start := time.Now() // mongoLogger.Info("[Company Stats Crons] Updating company stats", zap.Time("timestamp", time.Now())) // if err := statService.UpdateCompanyStats(context.Background()); err != nil { // mongoLogger.Error("[Company Stats Crons] Failed to update company stats", // zap.Error(err), // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } else { // mongoLogger.Info("[Company Stats Crons] Successfully updated company stats", // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } // }, // }, // { // spec: "0 0 * * * *", // Every hour // task: func() { // start := time.Now() // mongoLogger.Info("[Branch Stats Crons] Updating branch stats", zap.Time("timestamp", time.Now())) // if err := statService.UpdateBranchStats(context.Background()); err != nil { // mongoLogger.Error("[Branch Stats Crons] Failed to update branch stats", // zap.Error(err), // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } else { // mongoLogger.Info("[Branch Stats Crons] Successfully updated branch stats", // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } // }, // }, // { // spec: "0 0 * * * *", // Every hour // task: func() { // start := time.Now() // mongoLogger.Info("[Wallet Stats Crons] Updating wallet stats", zap.Time("timestamp", time.Now())) // if err := statService.UpdateWalletStats(context.Background()); err != nil { // mongoLogger.Error("[Wallet Stats Crons] Failed to update wallet stats", // zap.Error(err), // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } else { // mongoLogger.Info("[Wallet Stats Crons] Successfully updated wallet stats", // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } // }, // }, // { // spec: "0 0 * * * *", // Hourly // task: func() { // start := time.Now() // mongoLogger.Info("[Event Stats Crons] Updating event stats") // if err := statService.UpdateEventBetStats(context.Background()); err != nil { // mongoLogger.Error("[Event Stats Crons] Failed to update event bet stats", // zap.Error(err), // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start)), // ) // } else { // mongoLogger.Info("[Event Stats Crons] Successfully updated event stats", // zap.Time("timestamp", time.Now()), // zap.Duration("duration", time.Since(start))) // } // }, // }, // } // for _, job := range schedule { // job.task() // if _, err := c.AddFunc(job.spec, job.task); err != nil { // mongoLogger.Error("[Starting Stats Crons] Failed to schedule stats cron job", // zap.Error(err), // zap.Time("timestamp", time.Now()), // ) // } // } // c.Start() // mongoLogger.Info("Starting Stats Crons] Started Stat Cron Jobs", zap.Time("timestamp", time.Now())) // } // func StartReportCrons(reportService report.ReportService, mongoLogger *zap.Logger) { // c := cron.New(cron.WithSeconds()) // schedule := []struct { // spec string // task func() // }{ // { // spec: "0 * * * * *", // Every 5 Minutes // task: func() { // mongoLogger.Info("[Process Report Crons] Started Checking and Processing Reports") // if err := reportService.ProcessReportRequests(context.Background()); err != nil { // mongoLogger.Error("[Process Report Crons] Failed to process reports", // zap.Error(err), // ) // } else { // mongoLogger.Info("[Process Report Crons] Successfully processed all reports") // } // }, // }, // } // for _, job := range schedule { // job.task() // if _, err := c.AddFunc(job.spec, job.task); err != nil { // mongoLogger.Error("[Report Crons] Failed to schedule report cron job", // zap.Time("timestamp", time.Now()), // zap.Error(err), // ) // } // } // c.Start() // mongoLogger.Info("[Report Crons] Cron jobs started for reports", zap.Time("timestamp", time.Now())) // } // // SetupReportCronJobs schedules periodic report generation // func SetupReportandVirtualGameCronJobs( // ctx context.Context, // reportService report.ReportService, // virtualGameOrchestrationService *orchestration.Service, // outputDir string, // ) { // c := cron.New(cron.WithSeconds()) // WithSeconds for testing, remove in prod // schedule := []struct { // spec string // period string // }{ // // { spec: "*/60 * * * * *", period: "test" }, // every 60 seconds for testing // { // spec: "0 0 0 * * *", // daily at midnight // period: "daily", // }, // } // for _, job := range schedule { // period := job.period // if _, err := c.AddFunc(job.spec, func() { // log.Printf("[%s] Running virtual game & provider report job...", period) // brandID := os.Getenv("VELI_BRAND_ID") // if brandID == "" { // log.Println("VELI_BRAND_ID not set, skipping virtual game sync") // return // } // // Step 1. Fetch and store all virtual games // req := domain.ProviderRequest{ // BrandID: brandID, // ExtraData: true, // Size: 1000, // Page: 1, // } // allGames, err := virtualGameOrchestrationService.FetchAndStoreAllVirtualGames(ctx, req, "ETB") // if err != nil { // log.Printf("[%s] Error fetching/storing virtual games: %v", period, err) // return // } // log.Printf("[%s] Successfully fetched & stored %d virtual games", period, len(allGames)) // // Step 2. Fetch all providers // providers, total, err := virtualGameOrchestrationService.ListProviders(ctx, 1000, 0) // if err != nil { // log.Printf("[%s] Failed to list providers: %v", period, err) // return // } else if total == 0 { // log.Printf("[%s] No providers found, skipping report generation", period) // return // } // log.Printf("[%s] Found %d total providers", period, total) // // Step 3. Create provider-level daily report entries // reportDate := time.Now().UTC().Truncate(24 * time.Hour) // for _, p := range providers { // createReq := domain.CreateVirtualGameProviderReport{ // ProviderID: p.ProviderID, // ReportDate: reportDate, // TotalGamesPlayed: 0, // TotalBets: 0, // TotalPayouts: 0, // TotalPlayers: 0, // ReportType: period, // "daily" // } // _, err := virtualGameOrchestrationService.CreateVirtualGameProviderReport(ctx, createReq) // if err != nil { // log.Printf("[%s] Failed to create report for provider %s: %v", period, p.ProviderID, err) // continue // } // log.Printf("[%s] Created daily report row for provider: %s", period, p.ProviderID) // } // log.Printf("[%s] Daily provider reports created successfully", period) // }); err != nil { // log.Fatalf("Failed to schedule %s cron job: %v", period, err) // } // } // c.Start() // log.Printf("Cron jobs started. Reports will be saved to: %s", outputDir) // } // func ProcessBetCashback(ctx context.Context, betService *betSvc.Service) { // c := cron.New(cron.WithSeconds()) // schedule := []struct { // spec string // task func() // }{ // { // spec: "0 0 0 * * *", // Daily at midnight // task: func() { // log.Println("process bet cashbacks...") // if err := betService.ProcessBetCashback(ctx); err != nil { // log.Printf("Failed to process bet cashbacks: %v", err) // } else { // log.Printf("Successfully processed bet cashbacks") // } // }, // }, // } // for _, job := range schedule { // if _, err := c.AddFunc(job.spec, job.task); err != nil { // log.Fatalf("Failed to schedule cron job: %v", err) // } // } // c.Start() // log.Println("Cron jobs started for bet cashbacks") // } // func StartEnetPulseCron(enetPulseSvc *enetpulse.Service, mongoLogger *zap.Logger) { // c := cron.New(cron.WithSeconds()) // schedule := []struct { // spec string // task func() // }{ // { // spec: "0 0 */2 * * *", // Every 2 hours // task: func() { // ctx := context.Background() // // 1️⃣ Sports // mongoLogger.Info("Began fetching and storing sports cron task") // if err := enetPulseSvc.FetchAndStoreSports(ctx); err != nil { // mongoLogger.Error("Failed to fetch and store sports", zap.Error(err)) // } else { // mongoLogger.Info("\n\n✅ Completed fetching and storing sports\n\n") // } // // 2️⃣ Tournament Templates // mongoLogger.Info("Began fetching and storing tournament templates cron task") // if err := enetPulseSvc.FetchAndStoreTournamentTemplates(ctx); err != nil { // mongoLogger.Error("Failed to fetch and store tournament templates", zap.Error(err)) // } else { // mongoLogger.Info("\n\n✅ Completed fetching and storing tournament templates\n\n") // } // // 3️⃣ Tournaments // mongoLogger.Info("Began fetching and storing tournaments cron task") // if err := enetPulseSvc.FetchAndStoreTournaments(ctx); err != nil { // mongoLogger.Error("Failed to fetch and store tournaments", zap.Error(err)) // } else { // mongoLogger.Info("\n\n✅ Completed fetching and storing tournaments\n\n") // } // // 4️⃣ Tournament Stages // // mongoLogger.Info("Began fetching and storing tournament stages cron task") // // if err := enetPulseSvc.FetchAndStoreTournamentStages(ctx); err != nil { // // mongoLogger.Error("Failed to fetch and store tournament stages", zap.Error(err)) // // } else { // // mongoLogger.Info("✅ \n\nCompleted fetching and storing tournament stages\n\n") // // } // // // 5️⃣ Fixtures // mongoLogger.Info("Began fetching and storing fixtures cron task") // today := time.Now().Format("2006-01-02") // if err := enetPulseSvc.FetchAndStoreFixtures(ctx, today); err != nil { // mongoLogger.Error("Failed to fetch and store fixtures", zap.Error(err)) // } else { // mongoLogger.Info("\n\n✅ Completed fetching and storing fixtures\n\n") // } // // 6️⃣ Results // // mongoLogger.Info("Began fetching and storing results cron task") // // if err := enetPulseSvc.FetchAndStoreResults(ctx); err != nil { // // mongoLogger.Error("Failed to fetch and store results", zap.Error(err)) // // } else { // // mongoLogger.Info("\n\n✅ Completed fetching and storing results\n\n") // // } // // 7 Outcome Types // mongoLogger.Info("Began fetching and storing outcome_types cron task") // if err := enetPulseSvc.FetchAndStoreOutcomeTypes(ctx); err != nil { // mongoLogger.Error("Failed to fetch and store outcome_types", zap.Error(err)) // } else { // mongoLogger.Info("\n\n✅ Completed fetching and storing outcome_types\n\n") // } // // 8 Preodds // mongoLogger.Info("Began fetching and storing preodds cron task") // if err := enetPulseSvc.FetchAndStorePreodds(ctx); err != nil { // mongoLogger.Error("Failed to fetch and store preodds", zap.Error(err)) // } else { // mongoLogger.Info("\n\n✅ Completed fetching and storing preodds\n\n") // } // }, // }, // } // for _, job := range schedule { // // Run immediately at startup // job.task() // // Schedule the task // if _, err := c.AddFunc(job.spec, job.task); err != nil { // mongoLogger.Error("Failed to schedule EnetPulse cron job", zap.Error(err)) // } // } // c.Start() // log.Println("EnetPulse cron jobs started for sports, tournament templates, tournaments, tournament stages, fixtures, and results") // mongoLogger.Info("EnetPulse cron jobs started for sports, tournament templates, tournaments, tournament stages, fixtures, and results") // }