From e838fea0202fbdf26ae45f7604e156e9cbee5643 Mon Sep 17 00:00:00 2001 From: Samuel Tariku Date: Tue, 20 May 2025 05:21:04 +0300 Subject: [PATCH] fix: get total --- db/query/events.sql | 16 ++++++--- gen/db/events.sql.go | 22 ++++++++++-- internal/repository/event.go | 9 ++++- internal/services/result/service.go | 22 ++++++++---- internal/web_server/cron.go | 34 +++++++++---------- .../web_server/handlers/ticket_handler.go | 9 ++--- 6 files changed, 76 insertions(+), 36 deletions(-) diff --git a/db/query/events.sql b/db/query/events.sql index 652ac5d..5fb5e46 100644 --- a/db/query/events.sql +++ b/db/query/events.sql @@ -166,12 +166,20 @@ FROM events WHERE is_live = false AND status = 'upcoming' AND ( - league_id = $1 - OR $1 IS NULL + league_id = sqlc.narg('league_id') + OR sqlc.narg('league_id') IS NULL ) AND ( - sport_id = $2 - OR $2 IS NULL + sport_id = sqlc.narg('sport_id') + 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 SELECT id, diff --git a/gen/db/events.sql.go b/gen/db/events.sql.go index 3879adf..37bdad1 100644 --- a/gen/db/events.sql.go +++ b/gen/db/events.sql.go @@ -1,3 +1,4 @@ + // Code generated by sqlc. DO NOT EDIT. // versions: // sqlc v1.28.0 @@ -303,15 +304,30 @@ WHERE is_live = false sport_id = $2 OR $2 IS NULL ) + AND ( + start_time < $3 + OR $3 IS NULL + ) + AND ( + start_time > $4 + OR $4 IS NULL + ) ` type GetTotalEventsParams struct { - LeagueID pgtype.Text `json:"league_id"` - SportID pgtype.Text `json:"sport_id"` + LeagueID pgtype.Text `json:"league_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) { - 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 err := row.Scan(&count) return count, err diff --git a/internal/repository/event.go b/internal/repository/event.go index 03b3abb..b65e034 100644 --- a/internal/repository/event.go +++ b/internal/repository/event.go @@ -149,7 +149,6 @@ func (s *Store) GetPaginatedUpcomingEvents(ctx context.Context, limit domain.Val if err != nil { return nil, 0, err } - upcomingEvents := make([]domain.UpcomingEvent, len(events)) for i, e := range events { upcomingEvents[i] = domain.UpcomingEvent{ @@ -177,6 +176,14 @@ func (s *Store) GetPaginatedUpcomingEvents(ctx context.Context, limit domain.Val String: sportID.Value, 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 { return nil, 0, err diff --git a/internal/services/result/service.go b/internal/services/result/service.go index 77d3a2e..c5d7372 100644 --- a/internal/services/result/service.go +++ b/internal/services/result/service.go @@ -47,8 +47,9 @@ func (s *Service) FetchAndProcessResults(ctx context.Context) error { return err } fmt.Printf("โš ๏ธ Expired Events: %d \n", len(events)) + removed := 0 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) if err != nil { s.logger.Error("Failed to parse event id") @@ -61,7 +62,9 @@ func (s *Service) FetchAndProcessResults(ctx context.Context) error { } 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 @@ -126,12 +129,14 @@ func (s *Service) FetchAndProcessResults(ctx context.Context) error { if err != bet.ErrOutcomesNotCompleted { s.logger.Error("Failed to check bet outcome for bet", "event_id", outcome.EventID, "error", err) } + isDeleted = false continue } 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) if err != nil { s.logger.Error("Failed to update bet status", "event id", outcome.EventID, "error", err) + isDeleted = false continue } 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 { - // err = s.repo.DeleteEvent(ctx, event.ID) - // if err != nil { - // s.logger.Error("Failed to remove event", "event_id", event.ID, "error", err) - // return err - // } + removed += 1 + fmt.Printf("โš ๏ธ Removing Event %v \n", event.ID) + err = s.repo.DeleteEvent(ctx, event.ID) + 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 } diff --git a/internal/web_server/cron.go b/internal/web_server/cron.go index 769d0b3..8e0bfdd 100644 --- a/internal/web_server/cron.go +++ b/internal/web_server/cron.go @@ -21,22 +21,22 @@ func StartDataFetchingCrons(eventService eventsvc.Service, oddsService oddssvc.S 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 */15 * * * *", // Every 15 minutes - task: func() { - if err := oddsService.FetchNonLiveOdds(context.Background()); err != nil { - log.Printf("FetchNonLiveOdds error: %v", err) - } - }, - }, + // { + // spec: "0 0 * * * *", // Every 1 hour + // task: func() { + // if err := eventService.FetchUpcomingEvents(context.Background()); err != nil { + // log.Printf("FetchUpcomingEvents error: %v", err) + // } + // }, + // }, + // { + // spec: "0 */15 * * * *", // Every 15 minutes + // task: func() { + // if err := oddsService.FetchNonLiveOdds(context.Background()); err != nil { + // log.Printf("FetchNonLiveOdds error: %v", err) + // } + // }, + // }, { spec: "0 */15 * * * *", // Every 15 Minutes task: func() { @@ -52,7 +52,7 @@ func StartDataFetchingCrons(eventService eventsvc.Service, oddsService oddssvc.S } for _, job := range schedule { - // job.task() + job.task() if _, err := c.AddFunc(job.spec, job.task); err != nil { log.Fatalf("Failed to schedule cron job: %v", err) } diff --git a/internal/web_server/handlers/ticket_handler.go b/internal/web_server/handlers/ticket_handler.go index 5885ce0..de3eeb2 100644 --- a/internal/web_server/handlers/ticket_handler.go +++ b/internal/web_server/handlers/ticket_handler.go @@ -3,6 +3,7 @@ package handlers import ( "encoding/json" "strconv" + "time" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" "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 - // currentTime := time.Now() - // if event.StartTime.Before(currentTime) { - // return response.WriteJSON(c, fiber.StatusBadRequest, "The event has already expired", nil, nil) - // } + currentTime := time.Now() + if event.StartTime.Before(currentTime) { + return response.WriteJSON(c, fiber.StatusBadRequest, "The event has already expired", nil, nil) + } odds, err := h.prematchSvc.GetRawOddsByMarketID(c.Context(), marketIDStr, eventIDStr)