151 lines
3.9 KiB
Go
151 lines
3.9 KiB
Go
package httpserver
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"log"
|
|
|
|
// "time"
|
|
|
|
eventsvc "github.com/SamuelTariku/FortuneBet-Backend/internal/services/event"
|
|
oddssvc "github.com/SamuelTariku/FortuneBet-Backend/internal/services/odds"
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/services/report"
|
|
resultsvc "github.com/SamuelTariku/FortuneBet-Backend/internal/services/result"
|
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/services/ticket"
|
|
"github.com/robfig/cron/v3"
|
|
)
|
|
|
|
func StartDataFetchingCrons(eventService eventsvc.Service, oddsService oddssvc.ServiceImpl, resultService *resultsvc.Service) {
|
|
c := cron.New(cron.WithSeconds())
|
|
|
|
schedule := []struct {
|
|
spec string
|
|
task func()
|
|
}{
|
|
// {
|
|
// spec: "0 0 * * * *", // Every 1 hour
|
|
// task: func() {
|
|
// if err := eventService.FetchUpcomingEvents(context.Background()); err != nil {
|
|
// log.Printf("FetchUpcomingEvents error: %v", err)
|
|
// }
|
|
// },
|
|
// },
|
|
// {
|
|
// spec: "0 0 * * * *", // Every 1 hour (since its takes that long to fetch all the events)
|
|
// task: func() {
|
|
// if err := oddsService.FetchNonLiveOdds(context.Background()); err != nil {
|
|
// log.Printf("FetchNonLiveOdds error: %v", err)
|
|
// }
|
|
// },
|
|
// },
|
|
{
|
|
spec: "0 */5 * * * *", // Every 5 Minutes
|
|
task: func() {
|
|
log.Println("Updating expired events status...")
|
|
|
|
if _, err := resultService.CheckAndUpdateExpiredEvents(context.Background()); err != nil {
|
|
log.Printf("Failed to update events: %v", err)
|
|
} else {
|
|
log.Printf("Successfully updated expired events")
|
|
}
|
|
},
|
|
},
|
|
{
|
|
spec: "0 */15 * * * *", // Every 15 Minutes
|
|
task: func() {
|
|
log.Println("Fetching results for upcoming events...")
|
|
|
|
if err := resultService.FetchAndProcessResults(context.Background()); err != nil {
|
|
log.Printf("Failed to process result: %v", err)
|
|
} else {
|
|
log.Printf("Successfully processed all outcomes")
|
|
}
|
|
},
|
|
},
|
|
}
|
|
|
|
for _, job := range schedule {
|
|
job.task()
|
|
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 event and odds services")
|
|
}
|
|
|
|
func StartTicketCrons(ticketService ticket.Service) {
|
|
c := cron.New(cron.WithSeconds())
|
|
|
|
schedule := []struct {
|
|
spec string
|
|
task func()
|
|
}{
|
|
{
|
|
spec: "0 0 * * * *", // Every hour
|
|
task: func() {
|
|
log.Println("Deleting old tickets...")
|
|
if err := ticketService.DeleteOldTickets(context.Background()); err != nil {
|
|
log.Printf("Failed to remove old ticket: %v", err)
|
|
} else {
|
|
log.Printf("Successfully deleted old tickets")
|
|
}
|
|
},
|
|
},
|
|
}
|
|
|
|
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 ticket service")
|
|
}
|
|
|
|
func SetupReportCronJobs(ctx context.Context, reportService *report.Service) {
|
|
c := cron.New(cron.WithSeconds()) // use WithSeconds for tighter intervals during testing
|
|
|
|
schedule := []struct {
|
|
spec string
|
|
period string
|
|
}{
|
|
{
|
|
spec: "*/300 * * * * *", // Every 5 minutes (300 seconds)
|
|
period: "5min",
|
|
},
|
|
{
|
|
spec: "0 0 0 * * *", // Daily at midnight
|
|
period: "daily",
|
|
},
|
|
{
|
|
spec: "0 0 1 * * 0", // Weekly: Sunday at 1 AM
|
|
period: "weekly",
|
|
},
|
|
{
|
|
spec: "0 0 2 1 * *", // Monthly: 1st day of month at 2 AM
|
|
period: "monthly",
|
|
},
|
|
}
|
|
|
|
for _, job := range schedule {
|
|
period := job.period
|
|
if _, err := c.AddFunc(job.spec, func() {
|
|
log.Printf("Running %s report at %s", period, time.Now().Format(time.RFC3339))
|
|
if err := reportService.GenerateReport(ctx, period); err != nil {
|
|
log.Printf("Error generating %s report: %v", period, err)
|
|
} else {
|
|
log.Printf("Successfully generated %s report", period)
|
|
}
|
|
}); err != nil {
|
|
log.Fatalf("Failed to schedule %s report cron job: %v", period, err)
|
|
}
|
|
}
|
|
|
|
c.Start()
|
|
log.Println("Cron jobs started for report generation service")
|
|
}
|