From c374fd7a9697485a56fb7b1f3b386e7e28c5bc64 Mon Sep 17 00:00:00 2001 From: Samuel Tariku Date: Thu, 12 Jun 2025 19:09:19 +0300 Subject: [PATCH] feat: removing odds when event is removed --- db/query/odds.sql | 5 ++- gen/db/monitor.sql.go | 2 +- gen/db/odds.sql.go | 10 +++++ internal/repository/odds.go | 7 +++ internal/repository/otp.go | 2 + internal/services/odds/port.go | 1 + internal/services/odds/service.go | 4 ++ internal/services/result/service.go | 5 +++ internal/services/user/reset.go | 3 ++ internal/web_server/cron.go | 44 +++++++++---------- .../handlers/notification_handler.go | 3 +- .../web_server/handlers/wallet_handler.go | 2 +- internal/web_server/middleware.go | 2 +- makefile | 2 +- 14 files changed, 63 insertions(+), 29 deletions(-) diff --git a/db/query/odds.sql b/db/query/odds.sql index d13aced..bdabb44 100644 --- a/db/query/odds.sql +++ b/db/query/odds.sql @@ -112,4 +112,7 @@ WHERE e.id = $1 AND e.status = 'upcoming' AND o.is_active = true AND o.source = 'bet365' -LIMIT sqlc.narg('limit') OFFSET sqlc.narg('offset'); \ No newline at end of file +LIMIT sqlc.narg('limit') OFFSET sqlc.narg('offset'); +-- name: DeleteOddsForEvent :exec +DELETE FROM odds +Where fi = $1; \ No newline at end of file diff --git a/gen/db/monitor.sql.go b/gen/db/monitor.sql.go index a9a7ecb..db8a9ba 100644 --- a/gen/db/monitor.sql.go +++ b/gen/db/monitor.sql.go @@ -1,6 +1,6 @@ // Code generated by sqlc. DO NOT EDIT. // versions: -// sqlc v1.29.0 +// sqlc v1.28.0 // source: monitor.sql package dbgen diff --git a/gen/db/odds.sql.go b/gen/db/odds.sql.go index 1f21fff..99c47b7 100644 --- a/gen/db/odds.sql.go +++ b/gen/db/odds.sql.go @@ -11,6 +11,16 @@ import ( "github.com/jackc/pgx/v5/pgtype" ) +const DeleteOddsForEvent = `-- name: DeleteOddsForEvent :exec +DELETE FROM odds +Where fi = $1 +` + +func (q *Queries) DeleteOddsForEvent(ctx context.Context, fi pgtype.Text) error { + _, err := q.db.Exec(ctx, DeleteOddsForEvent, fi) + return err +} + const GetALLPrematchOdds = `-- name: GetALLPrematchOdds :many SELECT event_id, fi, diff --git a/internal/repository/odds.go b/internal/repository/odds.go index 4da0e21..2a0160e 100644 --- a/internal/repository/odds.go +++ b/internal/repository/odds.go @@ -275,6 +275,13 @@ func (s *Store) GetPrematchOddsByUpcomingID(ctx context.Context, upcomingID stri return domainOdds, nil } +func (s *Store) DeleteOddsForEvent(ctx context.Context, eventID string) error { + return s.queries.DeleteOddsForEvent(ctx, pgtype.Text{ + String: eventID, + Valid: true, + }) +} + func getString(v interface{}) string { if s, ok := v.(string); ok { return s diff --git a/internal/repository/otp.go b/internal/repository/otp.go index aaa4c10..29c3f81 100644 --- a/internal/repository/otp.go +++ b/internal/repository/otp.go @@ -3,6 +3,7 @@ package repository import ( "context" "database/sql" + "fmt" dbgen "github.com/SamuelTariku/FortuneBet-Backend/gen/db" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" @@ -32,6 +33,7 @@ func (s *Store) GetOtp(ctx context.Context, sentTo string, sentfor domain.OtpFor OtpFor: string(sentfor), }) if err != nil { + fmt.Printf("OTP REPO error: %v sentTo: %v, medium: %v, otpFor: %v\n", err, sentTo, medium, sentfor) if err == sql.ErrNoRows { return domain.Otp{}, domain.ErrOtpNotFound } diff --git a/internal/services/odds/port.go b/internal/services/odds/port.go index 69019c9..8dd0088 100644 --- a/internal/services/odds/port.go +++ b/internal/services/odds/port.go @@ -16,4 +16,5 @@ type Service interface { GetPaginatedPrematchOddsByUpcomingID(ctx context.Context, upcomingID string, limit domain.ValidInt64, offset domain.ValidInt64) ([]domain.Odd, error) GetALLPrematchOdds(ctx context.Context) ([]domain.Odd, error) GetRawOddsByMarketID(ctx context.Context, marketID string, upcomingID string) (domain.RawOddsByMarketID, error) + DeleteOddsForEvent(ctx context.Context, eventID string) error } diff --git a/internal/services/odds/service.go b/internal/services/odds/service.go index 70c4b08..b3010d0 100644 --- a/internal/services/odds/service.go +++ b/internal/services/odds/service.go @@ -517,6 +517,10 @@ func (s *ServiceImpl) GetPaginatedPrematchOddsByUpcomingID(ctx context.Context, return s.store.GetPaginatedPrematchOddsByUpcomingID(ctx, upcomingID, limit, offset) } +func (s *ServiceImpl) DeleteOddsForEvent(ctx context.Context, eventID string) error { + return s.store.DeleteOddsForEvent(ctx, eventID) +} + func getString(v interface{}) string { if str, ok := v.(string); ok { return str diff --git a/internal/services/result/service.go b/internal/services/result/service.go index 667d0fa..189a0e3 100644 --- a/internal/services/result/service.go +++ b/internal/services/result/service.go @@ -185,6 +185,11 @@ func (s *Service) FetchAndProcessResults(ctx context.Context) error { s.logger.Error("Failed to remove event", "event_id", event.ID, "error", err) return err } + err = s.repo.DeleteOddsForEvent(ctx, event.ID) + if err != nil { + s.logger.Error("Failed to remove odds for event", "event_id", event.ID, "error", err) + return err + } } } diff --git a/internal/services/user/reset.go b/internal/services/user/reset.go index 70309a8..c6d3f47 100644 --- a/internal/services/user/reset.go +++ b/internal/services/user/reset.go @@ -2,6 +2,7 @@ package user import ( "context" + "time" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain" @@ -33,6 +34,7 @@ func (s *Service) ResetPassword(ctx context.Context, resetReq domain.ResetPasswo } else { sentTo = resetReq.PhoneNumber } + otp, err := s.otpStore.GetOtp( ctx, sentTo, domain.OtpReset, resetReq.OtpMedium) @@ -55,6 +57,7 @@ func (s *Service) ResetPassword(ctx context.Context, resetReq domain.ResetPasswo return err } // reset pass and mark otp as used + err = s.userStore.UpdatePassword(ctx, sentTo, hashedPassword, otp.ID) if err != nil { return err diff --git a/internal/web_server/cron.go b/internal/web_server/cron.go index ec8869a..67632cd 100644 --- a/internal/web_server/cron.go +++ b/internal/web_server/cron.go @@ -37,30 +37,30 @@ func StartDataFetchingCrons(eventService eventsvc.Service, oddsService oddssvc.S // } // }, // }, - // { - // spec: "0 */5 * * * *", // Every 5 Minutes - // task: func() { - // log.Println("Updating expired events status...") + { + 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.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") - // } - // }, - // }, + 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 { diff --git a/internal/web_server/handlers/notification_handler.go b/internal/web_server/handlers/notification_handler.go index 3f6f6b8..24332d0 100644 --- a/internal/web_server/handlers/notification_handler.go +++ b/internal/web_server/handlers/notification_handler.go @@ -78,11 +78,10 @@ func (h *Handler) ConnectSocket(c *fiber.Ctx) error { } h.notificationSvc.Hub.Register <- client - h.logger.Info("WebSocket connection established", "userID", userID) + // h.logger.Info("WebSocket connection established", "userID", userID) defer func() { h.notificationSvc.Hub.Unregister <- client - h.logger.Info("WebSocket connection closed", "userID", userID) conn.Close() }() diff --git a/internal/web_server/handlers/wallet_handler.go b/internal/web_server/handlers/wallet_handler.go index d66a947..443e7ce 100644 --- a/internal/web_server/handlers/wallet_handler.go +++ b/internal/web_server/handlers/wallet_handler.go @@ -253,7 +253,7 @@ func (h *Handler) GetCustomerWallet(c *fiber.Ctx) error { // return fiber.NewError(fiber.StatusBadRequest, "Invalid company_id") // } - h.logger.Info("Fetching customer wallet", "userID", userID) + // h.logger.Info("Fetching customer wallet", "userID", userID) wallet, err := h.walletSvc.GetWalletsByUser(c.Context(), userID) if err != nil { diff --git a/internal/web_server/middleware.go b/internal/web_server/middleware.go index 0074c02..3a6303d 100644 --- a/internal/web_server/middleware.go +++ b/internal/web_server/middleware.go @@ -14,7 +14,7 @@ func (a *App) authMiddleware(c *fiber.Ctx) error { authHeader := c.Get("Authorization") if authHeader == "" { - fmt.Println("Auth Header Missing") + // fmt.Println("Auth Header Missing") return fiber.NewError(fiber.StatusUnauthorized, "Authorization header missing") } diff --git a/makefile b/makefile index a40a255..3f32fcf 100644 --- a/makefile +++ b/makefile @@ -50,7 +50,7 @@ swagger: .PHONY: db-up db-up: - @docker compose up -d postgres migrate + @docker compose up -d postgres migrate mongo .PHONY: db-down db-down: