From 927eb887cefd55c693d8b2e72d041f17ea06986f Mon Sep 17 00:00:00 2001 From: Samuel Tariku Date: Wed, 24 Sep 2025 21:03:56 +0300 Subject: [PATCH] fix: minor issues --- internal/services/bet/notification.go | 63 ++++++++- internal/services/bet/service.go | 2 +- .../virtualGame/veli/game_orchestration.go | 13 +- internal/web_server/cron.go | 130 +++++++++--------- 4 files changed, 139 insertions(+), 69 deletions(-) diff --git a/internal/services/bet/notification.go b/internal/services/bet/notification.go index 2d4de4e..d239e4f 100644 --- a/internal/services/bet/notification.go +++ b/internal/services/bet/notification.go @@ -184,7 +184,68 @@ func (s *Service) SendErrorStatusNotification(ctx context.Context, betID int64, return nil } -func (s *Service) SendAdminAlertNotification(ctx context.Context, betID int64, status domain.OutcomeStatus, extra string, companyID int64) error { +func (s *Service) SendAdminErrorNotification(ctx context.Context, betID int64, status domain.OutcomeStatus, extra string, companyID int64) error { + + var headline string + var message string + + switch status { + case domain.OUTCOME_STATUS_ERROR, domain.OUTCOME_STATUS_PENDING: + headline = fmt.Sprintf("Processing Error for Bet #%v", betID) + message = "A processing error occurred with this bet. Please review and take corrective action." + + default: + return fmt.Errorf("unsupported status: %v", status) + } + + super_admin_users, _, err := s.userSvc.GetAllUsers(ctx, domain.UserFilter{ + Role: string(domain.RoleSuperAdmin), + }) + + if err != nil { + s.mongoLogger.Error("failed to get super_admin recipients", + zap.Error(err), + zap.Time("timestamp", time.Now()), + ) + return err + } + + admin_users, _, err := s.userSvc.GetAllUsers(ctx, domain.UserFilter{ + Role: string(domain.RoleAdmin), + CompanyID: domain.ValidInt64{ + Value: companyID, + Valid: true, + }, + }) + + if err != nil { + s.mongoLogger.Error("failed to get admin recipients", + zap.Error(err), + zap.Time("timestamp", time.Now()), + ) + return err + } + + users := append(super_admin_users, admin_users...) + + for _, user := range users { + for _, channel := range []domain.DeliveryChannel{ + domain.DeliveryChannelInApp, + domain.DeliveryChannelEmail, + } { + n := newBetResultNotification(user.ID, domain.NotificationLevelError, channel, headline, message, map[string]any{ + "status": status, + "more": extra, + }) + if err := s.notificationSvc.SendNotification(ctx, n); err != nil { + return err + } + } + } + + return nil +} +func (s *Service) SendAdminLargeNotification(ctx context.Context, betID int64, status domain.OutcomeStatus, extra string, companyID int64) error { var headline string var message string diff --git a/internal/services/bet/service.go b/internal/services/bet/service.go index 4ba3a66..f101b07 100644 --- a/internal/services/bet/service.go +++ b/internal/services/bet/service.go @@ -870,7 +870,7 @@ func (s *Service) UpdateStatus(ctx context.Context, betId int64, status domain.O } if status == domain.OUTCOME_STATUS_ERROR || status == domain.OUTCOME_STATUS_PENDING { - if err := s.SendAdminAlertNotification(ctx, betId, status, "", bet.CompanyID); err != nil { + if err := s.SendAdminErrorNotification(ctx, betId, status, "", bet.CompanyID); err != nil { updateLogger.Error("failed to send admin notification", zap.Error(err)) return err } diff --git a/internal/services/virtualGame/veli/game_orchestration.go b/internal/services/virtualGame/veli/game_orchestration.go index e374cf0..24fb175 100644 --- a/internal/services/virtualGame/veli/game_orchestration.go +++ b/internal/services/virtualGame/veli/game_orchestration.go @@ -250,18 +250,27 @@ func (s *Service) FetchAndStoreAllVirtualGames(ctx context.Context, req domain.P // --- Save to DB --- _, err = s.repo.CreateVirtualGame(ctx, dbgen.CreateVirtualGameParams{ - GameID: fmt.Sprintf("%d", g.ID), //The id here needs to be clean for me to access + GameID: fmt.Sprintf("%d", g.ID), //The id here needs to be clean for me to access ProviderID: "popok", Name: g.GameName, Bets: betsNumeric, Thumbnail: pgtype.Text{ String: g.Thumbnail, Valid: g.Thumbnail != "", - }, + }, Status: pgtype.Int4{ Int32: int32(g.Status), Valid: true, }, + HasDemo: pgtype.Bool{ + Bool: true, + Valid: true, + }, + Category: pgtype.Text{ + String: "Crash", + Valid: true, + }, + }) if err != nil { diff --git a/internal/web_server/cron.go b/internal/web_server/cron.go index 1cf19c6..3c39dfc 100644 --- a/internal/web_server/cron.go +++ b/internal/web_server/cron.go @@ -26,71 +26,71 @@ func StartDataFetchingCrons(eventService eventsvc.Service, oddsService oddssvc.S spec string task func() }{ - { - spec: "0 0 * * * *", // Every 1 hour - task: func() { - mongoLogger.Info("Began fetching upcoming events cron task") - if err := eventService.FetchUpcomingEvents(context.Background()); err != nil { - mongoLogger.Error("Failed to fetch upcoming events", - zap.Error(err), - ) - } else { - mongoLogger.Info("Completed fetching upcoming events without errors") - } - }, - }, - { - spec: "0 0 * * * *", // Every 1 hour (since its takes that long to fetch all the events) - task: func() { - mongoLogger.Info("Began fetching non live odds cron task") - if err := oddsService.FetchNonLiveOdds(context.Background()); err != nil { - mongoLogger.Error("Failed to fetch non live odds", - zap.Error(err), - ) - } else { - mongoLogger.Info("Completed fetching non live odds without errors") - } - }, - }, - { - spec: "0 */5 * * * *", // Every 5 Minutes - task: func() { - mongoLogger.Info("Began update all expired events status cron task") - if _, err := resultService.CheckAndUpdateExpiredEvents(context.Background()); err != nil { - mongoLogger.Error("Failed to update expired events status", - zap.Error(err), - ) - } else { - mongoLogger.Info("Completed expired events without errors") - } - }, - }, - { - spec: "0 */15 * * * *", // Every 15 Minutes - task: func() { - mongoLogger.Info("Began fetching results for upcoming events cron task") - if err := resultService.FetchAndProcessResults(context.Background()); err != nil { - mongoLogger.Error("Failed to process result", - zap.Error(err), - ) - } else { - mongoLogger.Info("Completed processing all event result outcomes without errors") - } - }, - }, - { - spec: "0 0 0 * * *", // Every Day - task: func() { - mongoLogger.Info("Began Send daily result notification cron task") - if err := resultService.CheckAndSendResultNotifications(context.Background(), time.Now().Add(-24*time.Hour)); err != nil { - mongoLogger.Error("Failed to process result", - zap.Error(err), - ) - } else { - mongoLogger.Info("Completed sending daily result notification without errors") - } - }, - }, + // { + // spec: "0 0 * * * *", // Every 1 hour + // task: func() { + // mongoLogger.Info("Began fetching upcoming events cron task") + // if err := eventService.FetchUpcomingEvents(context.Background()); err != nil { + // mongoLogger.Error("Failed to fetch upcoming events", + // zap.Error(err), + // ) + // } else { + // mongoLogger.Info("Completed fetching upcoming events without errors") + // } + // }, + // }, + // { + // spec: "0 0 * * * *", // Every 1 hour (since its takes that long to fetch all the events) + // task: func() { + // mongoLogger.Info("Began fetching non live odds cron task") + // if err := oddsService.FetchNonLiveOdds(context.Background()); err != nil { + // mongoLogger.Error("Failed to fetch non live odds", + // zap.Error(err), + // ) + // } else { + // mongoLogger.Info("Completed fetching non live odds without errors") + // } + // }, + // }, + // { + // spec: "0 */5 * * * *", // Every 5 Minutes + // task: func() { + // mongoLogger.Info("Began update all expired events status cron task") + // if _, err := resultService.CheckAndUpdateExpiredEvents(context.Background()); err != nil { + // mongoLogger.Error("Failed to update expired events status", + // zap.Error(err), + // ) + // } else { + // mongoLogger.Info("Completed expired events without errors") + // } + // }, + // }, + // { + // spec: "0 */15 * * * *", // Every 15 Minutes + // task: func() { + // mongoLogger.Info("Began fetching results for upcoming events cron task") + // if err := resultService.FetchAndProcessResults(context.Background()); err != nil { + // mongoLogger.Error("Failed to process result", + // zap.Error(err), + // ) + // } else { + // mongoLogger.Info("Completed processing all event result outcomes without errors") + // } + // }, + // }, + // { + // spec: "0 0 0 * * *", // Every Day + // task: func() { + // mongoLogger.Info("Began Send daily result notification cron task") + // if err := resultService.CheckAndSendResultNotifications(context.Background(), time.Now().Add(-24*time.Hour)); err != nil { + // mongoLogger.Error("Failed to process result", + // zap.Error(err), + // ) + // } else { + // mongoLogger.Info("Completed sending daily result notification without errors") + // } + // }, + // }, } for _, job := range schedule {