fix: get total

This commit is contained in:
Samuel Tariku 2025-05-20 05:21:04 +03:00
parent cdc40397b9
commit e838fea020
6 changed files with 76 additions and 36 deletions

View File

@ -166,12 +166,20 @@ FROM events
WHERE is_live = false WHERE is_live = false
AND status = 'upcoming' AND status = 'upcoming'
AND ( AND (
league_id = $1 league_id = sqlc.narg('league_id')
OR $1 IS NULL OR sqlc.narg('league_id') IS NULL
) )
AND ( AND (
sport_id = $2 sport_id = sqlc.narg('sport_id')
OR $2 IS NULL OR sqlc.narg('sport_id') IS NULL
)
AND (
start_time < sqlc.narg('last_start_time')
OR sqlc.narg('last_start_time') IS NULL
)
AND (
start_time > sqlc.narg('first_start_time')
OR sqlc.narg('first_start_time') IS NULL
); );
-- name: GetPaginatedUpcomingEvents :many -- name: GetPaginatedUpcomingEvents :many
SELECT id, SELECT id,

View File

@ -1,3 +1,4 @@
// Code generated by sqlc. DO NOT EDIT. // Code generated by sqlc. DO NOT EDIT.
// versions: // versions:
// sqlc v1.28.0 // sqlc v1.28.0
@ -303,15 +304,30 @@ WHERE is_live = false
sport_id = $2 sport_id = $2
OR $2 IS NULL OR $2 IS NULL
) )
AND (
start_time < $3
OR $3 IS NULL
)
AND (
start_time > $4
OR $4 IS NULL
)
` `
type GetTotalEventsParams struct { type GetTotalEventsParams struct {
LeagueID pgtype.Text `json:"league_id"` LeagueID pgtype.Text `json:"league_id"`
SportID pgtype.Text `json:"sport_id"` SportID pgtype.Text `json:"sport_id"`
LastStartTime pgtype.Timestamp `json:"last_start_time"`
FirstStartTime pgtype.Timestamp `json:"first_start_time"`
} }
func (q *Queries) GetTotalEvents(ctx context.Context, arg GetTotalEventsParams) (int64, error) { func (q *Queries) GetTotalEvents(ctx context.Context, arg GetTotalEventsParams) (int64, error) {
row := q.db.QueryRow(ctx, GetTotalEvents, arg.LeagueID, arg.SportID) row := q.db.QueryRow(ctx, GetTotalEvents,
arg.LeagueID,
arg.SportID,
arg.LastStartTime,
arg.FirstStartTime,
)
var count int64 var count int64
err := row.Scan(&count) err := row.Scan(&count)
return count, err return count, err

View File

@ -149,7 +149,6 @@ func (s *Store) GetPaginatedUpcomingEvents(ctx context.Context, limit domain.Val
if err != nil { if err != nil {
return nil, 0, err return nil, 0, err
} }
upcomingEvents := make([]domain.UpcomingEvent, len(events)) upcomingEvents := make([]domain.UpcomingEvent, len(events))
for i, e := range events { for i, e := range events {
upcomingEvents[i] = domain.UpcomingEvent{ upcomingEvents[i] = domain.UpcomingEvent{
@ -177,6 +176,14 @@ func (s *Store) GetPaginatedUpcomingEvents(ctx context.Context, limit domain.Val
String: sportID.Value, String: sportID.Value,
Valid: sportID.Valid, Valid: sportID.Valid,
}, },
FirstStartTime: pgtype.Timestamp{
Time: firstStartTime.Value.UTC(),
Valid: firstStartTime.Valid,
},
LastStartTime: pgtype.Timestamp{
Time: lastStartTime.Value.UTC(),
Valid: lastStartTime.Valid,
},
}) })
if err != nil { if err != nil {
return nil, 0, err return nil, 0, err

View File

@ -47,8 +47,9 @@ func (s *Service) FetchAndProcessResults(ctx context.Context) error {
return err return err
} }
fmt.Printf("⚠️ Expired Events: %d \n", len(events)) fmt.Printf("⚠️ Expired Events: %d \n", len(events))
removed := 0
for i, event := range events { for i, event := range events {
fmt.Printf("🕛 Checking if event has bets placed on it %v (%d/%d) \n", event.ID, i+1, len(events))
eventID, err := strconv.ParseInt(event.ID, 10, 64) eventID, err := strconv.ParseInt(event.ID, 10, 64)
if err != nil { if err != nil {
s.logger.Error("Failed to parse event id") s.logger.Error("Failed to parse event id")
@ -61,7 +62,9 @@ func (s *Service) FetchAndProcessResults(ctx context.Context) error {
} }
if len(outcomes) == 0 { if len(outcomes) == 0 {
continue fmt.Printf("🕛 No bets have been placed on event %v (%d/%d) \n", event.ID, i+1, len(events))
} else {
fmt.Printf("✅ %d bets have been placed on event %v (%d/%d) \n", len(outcomes), event.ID, i+1, len(events))
} }
isDeleted := true isDeleted := true
@ -126,12 +129,14 @@ func (s *Service) FetchAndProcessResults(ctx context.Context) error {
if err != bet.ErrOutcomesNotCompleted { if err != bet.ErrOutcomesNotCompleted {
s.logger.Error("Failed to check bet outcome for bet", "event_id", outcome.EventID, "error", err) s.logger.Error("Failed to check bet outcome for bet", "event_id", outcome.EventID, "error", err)
} }
isDeleted = false
continue continue
} }
fmt.Printf("🧾 Updating bet %v - event %v (%d/%d) to %v\n", outcome.BetID, event.ID, j+1, len(outcomes), status.String()) fmt.Printf("🧾 Updating bet %v - event %v (%d/%d) to %v\n", outcome.BetID, event.ID, j+1, len(outcomes), status.String())
err = s.betSvc.UpdateStatus(ctx, outcome.BetID, status) err = s.betSvc.UpdateStatus(ctx, outcome.BetID, status)
if err != nil { if err != nil {
s.logger.Error("Failed to update bet status", "event id", outcome.EventID, "error", err) s.logger.Error("Failed to update bet status", "event id", outcome.EventID, "error", err)
isDeleted = false
continue continue
} }
fmt.Printf("✅ Successfully updated 🎫 Bet %v - event %v(%v) (%d/%d) \n", fmt.Printf("✅ Successfully updated 🎫 Bet %v - event %v(%v) (%d/%d) \n",
@ -141,14 +146,17 @@ func (s *Service) FetchAndProcessResults(ctx context.Context) error {
} }
if isDeleted { if isDeleted {
// err = s.repo.DeleteEvent(ctx, event.ID) removed += 1
// if err != nil { fmt.Printf("⚠️ Removing Event %v \n", event.ID)
// s.logger.Error("Failed to remove event", "event_id", event.ID, "error", err) err = s.repo.DeleteEvent(ctx, event.ID)
// return err if err != nil {
// } s.logger.Error("Failed to remove event", "event_id", event.ID, "error", err)
return err
}
} }
} }
fmt.Printf("🗑️ Removed Events: %d \n", removed)
return nil return nil
} }

View File

@ -21,22 +21,22 @@ func StartDataFetchingCrons(eventService eventsvc.Service, oddsService oddssvc.S
spec string spec string
task func() task func()
}{ }{
{ // {
spec: "0 0 * * * *", // Every 1 hour // spec: "0 0 * * * *", // Every 1 hour
task: func() { // task: func() {
if err := eventService.FetchUpcomingEvents(context.Background()); err != nil { // if err := eventService.FetchUpcomingEvents(context.Background()); err != nil {
log.Printf("FetchUpcomingEvents error: %v", err) // log.Printf("FetchUpcomingEvents error: %v", err)
} // }
}, // },
}, // },
{ // {
spec: "0 */15 * * * *", // Every 15 minutes // spec: "0 */15 * * * *", // Every 15 minutes
task: func() { // task: func() {
if err := oddsService.FetchNonLiveOdds(context.Background()); err != nil { // if err := oddsService.FetchNonLiveOdds(context.Background()); err != nil {
log.Printf("FetchNonLiveOdds error: %v", err) // log.Printf("FetchNonLiveOdds error: %v", err)
} // }
}, // },
}, // },
{ {
spec: "0 */15 * * * *", // Every 15 Minutes spec: "0 */15 * * * *", // Every 15 Minutes
task: func() { task: func() {
@ -52,7 +52,7 @@ func StartDataFetchingCrons(eventService eventsvc.Service, oddsService oddssvc.S
} }
for _, job := range schedule { for _, job := range schedule {
// job.task() job.task()
if _, err := c.AddFunc(job.spec, job.task); err != nil { if _, err := c.AddFunc(job.spec, job.task); err != nil {
log.Fatalf("Failed to schedule cron job: %v", err) log.Fatalf("Failed to schedule cron job: %v", err)
} }

View File

@ -3,6 +3,7 @@ package handlers
import ( import (
"encoding/json" "encoding/json"
"strconv" "strconv"
"time"
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
"github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/response" "github.com/SamuelTariku/FortuneBet-Backend/internal/web_server/response"
@ -76,10 +77,10 @@ func (h *Handler) CreateTicket(c *fiber.Ctx) error {
} }
// Checking to make sure the event hasn't already started // Checking to make sure the event hasn't already started
// currentTime := time.Now() currentTime := time.Now()
// if event.StartTime.Before(currentTime) { if event.StartTime.Before(currentTime) {
// return response.WriteJSON(c, fiber.StatusBadRequest, "The event has already expired", nil, nil) return response.WriteJSON(c, fiber.StatusBadRequest, "The event has already expired", nil, nil)
// } }
odds, err := h.prematchSvc.GetRawOddsByMarketID(c.Context(), marketIDStr, eventIDStr) odds, err := h.prematchSvc.GetRawOddsByMarketID(c.Context(), marketIDStr, eventIDStr)