feat: removing odds when event is removed

This commit is contained in:
Samuel Tariku 2025-06-12 19:09:19 +03:00
parent 35a03e1959
commit c374fd7a96
14 changed files with 63 additions and 29 deletions

View File

@ -112,4 +112,7 @@ WHERE e.id = $1
AND e.status = 'upcoming' AND e.status = 'upcoming'
AND o.is_active = true AND o.is_active = true
AND o.source = 'bet365' AND o.source = 'bet365'
LIMIT sqlc.narg('limit') OFFSET sqlc.narg('offset'); LIMIT sqlc.narg('limit') OFFSET sqlc.narg('offset');
-- name: DeleteOddsForEvent :exec
DELETE FROM odds
Where fi = $1;

View File

@ -1,6 +1,6 @@
// Code generated by sqlc. DO NOT EDIT. // Code generated by sqlc. DO NOT EDIT.
// versions: // versions:
// sqlc v1.29.0 // sqlc v1.28.0
// source: monitor.sql // source: monitor.sql
package dbgen package dbgen

View File

@ -11,6 +11,16 @@ import (
"github.com/jackc/pgx/v5/pgtype" "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 const GetALLPrematchOdds = `-- name: GetALLPrematchOdds :many
SELECT event_id, SELECT event_id,
fi, fi,

View File

@ -275,6 +275,13 @@ func (s *Store) GetPrematchOddsByUpcomingID(ctx context.Context, upcomingID stri
return domainOdds, nil 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 { func getString(v interface{}) string {
if s, ok := v.(string); ok { if s, ok := v.(string); ok {
return s return s

View File

@ -3,6 +3,7 @@ package repository
import ( import (
"context" "context"
"database/sql" "database/sql"
"fmt"
dbgen "github.com/SamuelTariku/FortuneBet-Backend/gen/db" dbgen "github.com/SamuelTariku/FortuneBet-Backend/gen/db"
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain" "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), OtpFor: string(sentfor),
}) })
if err != nil { if err != nil {
fmt.Printf("OTP REPO error: %v sentTo: %v, medium: %v, otpFor: %v\n", err, sentTo, medium, sentfor)
if err == sql.ErrNoRows { if err == sql.ErrNoRows {
return domain.Otp{}, domain.ErrOtpNotFound return domain.Otp{}, domain.ErrOtpNotFound
} }

View File

@ -16,4 +16,5 @@ type Service interface {
GetPaginatedPrematchOddsByUpcomingID(ctx context.Context, upcomingID string, limit domain.ValidInt64, offset domain.ValidInt64) ([]domain.Odd, error) GetPaginatedPrematchOddsByUpcomingID(ctx context.Context, upcomingID string, limit domain.ValidInt64, offset domain.ValidInt64) ([]domain.Odd, error)
GetALLPrematchOdds(ctx context.Context) ([]domain.Odd, error) GetALLPrematchOdds(ctx context.Context) ([]domain.Odd, error)
GetRawOddsByMarketID(ctx context.Context, marketID string, upcomingID string) (domain.RawOddsByMarketID, error) GetRawOddsByMarketID(ctx context.Context, marketID string, upcomingID string) (domain.RawOddsByMarketID, error)
DeleteOddsForEvent(ctx context.Context, eventID string) error
} }

View File

@ -517,6 +517,10 @@ func (s *ServiceImpl) GetPaginatedPrematchOddsByUpcomingID(ctx context.Context,
return s.store.GetPaginatedPrematchOddsByUpcomingID(ctx, upcomingID, limit, offset) 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 { func getString(v interface{}) string {
if str, ok := v.(string); ok { if str, ok := v.(string); ok {
return str return str

View File

@ -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) s.logger.Error("Failed to remove event", "event_id", event.ID, "error", err)
return 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
}
} }
} }

View File

@ -2,6 +2,7 @@ package user
import ( import (
"context" "context"
"time" "time"
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain" "github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
@ -33,6 +34,7 @@ func (s *Service) ResetPassword(ctx context.Context, resetReq domain.ResetPasswo
} else { } else {
sentTo = resetReq.PhoneNumber sentTo = resetReq.PhoneNumber
} }
otp, err := s.otpStore.GetOtp( otp, err := s.otpStore.GetOtp(
ctx, sentTo, ctx, sentTo,
domain.OtpReset, resetReq.OtpMedium) domain.OtpReset, resetReq.OtpMedium)
@ -55,6 +57,7 @@ func (s *Service) ResetPassword(ctx context.Context, resetReq domain.ResetPasswo
return err return err
} }
// reset pass and mark otp as used // reset pass and mark otp as used
err = s.userStore.UpdatePassword(ctx, sentTo, hashedPassword, otp.ID) err = s.userStore.UpdatePassword(ctx, sentTo, hashedPassword, otp.ID)
if err != nil { if err != nil {
return err return err

View File

@ -37,30 +37,30 @@ func StartDataFetchingCrons(eventService eventsvc.Service, oddsService oddssvc.S
// } // }
// }, // },
// }, // },
// { {
// spec: "0 */5 * * * *", // Every 5 Minutes spec: "0 */5 * * * *", // Every 5 Minutes
// task: func() { task: func() {
// log.Println("Updating expired events status...") log.Println("Updating expired events status...")
// if _, err := resultService.CheckAndUpdateExpiredEvents(context.Background()); err != nil { if _, err := resultService.CheckAndUpdateExpiredEvents(context.Background()); err != nil {
// log.Printf("Failed to update events: %v", err) log.Printf("Failed to update events: %v", err)
// } else { } else {
// log.Printf("Successfully updated expired events") log.Printf("Successfully updated expired events")
// } }
// }, },
// }, },
// { {
// spec: "0 */15 * * * *", // Every 15 Minutes spec: "0 */15 * * * *", // Every 15 Minutes
// task: func() { task: func() {
// log.Println("Fetching results for upcoming events...") log.Println("Fetching results for upcoming events...")
// if err := resultService.FetchAndProcessResults(context.Background()); err != nil { if err := resultService.FetchAndProcessResults(context.Background()); err != nil {
// log.Printf("Failed to process result: %v", err) log.Printf("Failed to process result: %v", err)
// } else { } else {
// log.Printf("Successfully processed all outcomes") log.Printf("Successfully processed all outcomes")
// } }
// }, },
// }, },
} }
for _, job := range schedule { for _, job := range schedule {

View File

@ -78,11 +78,10 @@ func (h *Handler) ConnectSocket(c *fiber.Ctx) error {
} }
h.notificationSvc.Hub.Register <- client h.notificationSvc.Hub.Register <- client
h.logger.Info("WebSocket connection established", "userID", userID) // h.logger.Info("WebSocket connection established", "userID", userID)
defer func() { defer func() {
h.notificationSvc.Hub.Unregister <- client h.notificationSvc.Hub.Unregister <- client
h.logger.Info("WebSocket connection closed", "userID", userID)
conn.Close() conn.Close()
}() }()

View File

@ -253,7 +253,7 @@ func (h *Handler) GetCustomerWallet(c *fiber.Ctx) error {
// return fiber.NewError(fiber.StatusBadRequest, "Invalid company_id") // 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) wallet, err := h.walletSvc.GetWalletsByUser(c.Context(), userID)
if err != nil { if err != nil {

View File

@ -14,7 +14,7 @@ func (a *App) authMiddleware(c *fiber.Ctx) error {
authHeader := c.Get("Authorization") authHeader := c.Get("Authorization")
if authHeader == "" { if authHeader == "" {
fmt.Println("Auth Header Missing") // fmt.Println("Auth Header Missing")
return fiber.NewError(fiber.StatusUnauthorized, "Authorization header missing") return fiber.NewError(fiber.StatusUnauthorized, "Authorization header missing")
} }

View File

@ -50,7 +50,7 @@ swagger:
.PHONY: db-up .PHONY: db-up
db-up: db-up:
@docker compose up -d postgres migrate @docker compose up -d postgres migrate mongo
.PHONY: db-down .PHONY: db-down
db-down: db-down: