From f63e35fb4effe8fbd57280dc2c9be837f5f52c72 Mon Sep 17 00:00:00 2001 From: Asher Samuel Date: Mon, 14 Jul 2025 23:05:17 +0300 Subject: [PATCH] flag multiple bets with same bet outcomes --- db/query/bet.sql | 4 ++ gen/db/bet.sql.go | 13 ++++++ internal/repository/bet.go | 9 +++++ internal/services/bet/port.go | 1 + internal/services/bet/service.go | 50 +++++++++++++++++++----- reports/report_5min_2025-07-14_18-11.csv | 16 -------- reports/report_5min_2025-07-14_18-15.csv | 16 -------- reports/report_5min_2025-07-14_18-16.csv | 16 -------- 8 files changed, 68 insertions(+), 57 deletions(-) delete mode 100644 reports/report_5min_2025-07-14_18-11.csv delete mode 100644 reports/report_5min_2025-07-14_18-15.csv delete mode 100644 reports/report_5min_2025-07-14_18-16.csv diff --git a/db/query/bet.sql b/db/query/bet.sql index 588e3c0..fdc74d8 100644 --- a/db/query/bet.sql +++ b/db/query/bet.sql @@ -106,6 +106,10 @@ SELECT COUNT(*) FROM bets WHERE user_id = $1 AND outcomes_hash = $2; +-- name: GetBetCountByOutcomesHash :one +SELECT COUNT(*) +FROM bets +WHERE outcomes_hash = $1; -- name: UpdateCashOut :exec UPDATE bets SET cashed_out = $2, diff --git a/gen/db/bet.sql.go b/gen/db/bet.sql.go index 965ccdf..c8d18d5 100644 --- a/gen/db/bet.sql.go +++ b/gen/db/bet.sql.go @@ -282,6 +282,19 @@ func (q *Queries) GetBetByUserID(ctx context.Context, userID int64) ([]BetWithOu return items, nil } +const GetBetCountByOutcomesHash = `-- name: GetBetCountByOutcomesHash :one +SELECT COUNT(*) +FROM bets +WHERE outcomes_hash = $1 +` + +func (q *Queries) GetBetCountByOutcomesHash(ctx context.Context, outcomesHash string) (int64, error) { + row := q.db.QueryRow(ctx, GetBetCountByOutcomesHash, outcomesHash) + var count int64 + err := row.Scan(&count) + return count, err +} + const GetBetCountByUserID = `-- name: GetBetCountByUserID :one SELECT COUNT(*) FROM bets diff --git a/internal/repository/bet.go b/internal/repository/bet.go index 75714f8..f61e5c8 100644 --- a/internal/repository/bet.go +++ b/internal/repository/bet.go @@ -290,6 +290,15 @@ func (s *Store) GetBetCountByUserID(ctx context.Context, UserID int64, outcomesH return count, nil } +func (s *Store) GetBetCountByOutcomesHash(ctx context.Context, outcomesHash string) (int64, error) { + count, err := s.queries.GetBetCountByOutcomesHash(ctx, outcomesHash) + if err != nil { + return 0, err + } + + return count, nil +} + func (s *Store) UpdateCashOut(ctx context.Context, id int64, cashedOut bool) error { err := s.queries.UpdateCashOut(ctx, dbgen.UpdateCashOutParams{ ID: id, diff --git a/internal/services/bet/port.go b/internal/services/bet/port.go index e56cd40..6c79f0a 100644 --- a/internal/services/bet/port.go +++ b/internal/services/bet/port.go @@ -18,6 +18,7 @@ type BetStore interface { GetBetOutcomeByEventID(ctx context.Context, eventID int64, is_filtered bool) ([]domain.BetOutcome, error) GetBetOutcomeByBetID(ctx context.Context, betID int64) ([]domain.BetOutcome, error) GetBetCountByUserID(ctx context.Context, userID int64, outcomesHash string) (int64, error) + GetBetCountByOutcomesHash(ctx context.Context, outcomesHash string) (int64, error) UpdateCashOut(ctx context.Context, id int64, cashedOut bool) error UpdateStatus(ctx context.Context, id int64, status domain.OutcomeStatus) error UpdateBetOutcomeStatus(ctx context.Context, id int64, status domain.OutcomeStatus) (domain.BetOutcome, error) diff --git a/internal/services/bet/service.go b/internal/services/bet/service.go index 81cd6bf..7a2f0a4 100644 --- a/internal/services/bet/service.go +++ b/internal/services/bet/service.go @@ -360,15 +360,15 @@ func (s *Service) PlaceBet(ctx context.Context, req domain.CreateBetReq, userID case domain.RoleCustomer: // Only the customer is able to create a online bet newBet.IsShopBet = false - // err = s.DeductBetFromCustomerWallet(ctx, req.Amount, userID) - // if err != nil { - // s.mongoLogger.Error("customer wallet deduction failed", - // zap.Float32("amount", req.Amount), - // zap.Int64("user_id", userID), - // zap.Error(err), - // ) - // return domain.CreateBetRes{}, err - // } + err = s.DeductBetFromCustomerWallet(ctx, req.Amount, userID) + if err != nil { + s.mongoLogger.Error("customer wallet deduction failed", + zap.Float32("amount", req.Amount), + zap.Int64("user_id", userID), + zap.Error(err), + ) + return domain.CreateBetRes{}, err + } default: s.mongoLogger.Error("unknown role type", zap.String("role", string(role)), @@ -415,6 +415,34 @@ func (s *Service) PlaceBet(ctx context.Context, req domain.CreateBetReq, userID } } + // large amount of users betting on the same bet_outcomes + total_bet_count, err := s.betStore.GetBetCountByOutcomesHash(ctx, outcomesHash) + if err != nil { + s.mongoLogger.Error("failed to get bet outcomes count", + zap.String("outcomes_hash", outcomesHash), + zap.Error(err), + ) + return domain.CreateBetRes{}, err + } + + fmt.Println("total bet count: ", total_bet_count) + + if total_bet_count > 3 { + flag := domain.CreateFlagReq{ + BetID: bet.ID, + OddID: 0, + Reason: fmt.Sprintf("too many users bet on same outcomes - (%s)", outcomesHash), + } + _, err := s.betStore.CreateFlag(ctx, flag) + + if err != nil { + s.mongoLogger.Error("failed to get bet outcomes count", + zap.String("outcomes_hash", outcomesHash), + zap.Error(err), + ) + } + } + res := domain.ConvertCreateBet(bet, rows) return res, nil @@ -820,6 +848,10 @@ func (s *Service) GetBetCountByUserID(ctx context.Context, UserID int64, outcome return s.betStore.GetBetCountByUserID(ctx, UserID, outcomesHash) } +func (s *Service) GetBetCountByOutcomesHash(ctx context.Context, outcomesHash string) (int64, error) { + return s.betStore.GetBetCountByOutcomesHash(ctx, outcomesHash) +} + func (s *Service) UpdateCashOut(ctx context.Context, id int64, cashedOut bool) error { return s.betStore.UpdateCashOut(ctx, id, cashedOut) } diff --git a/reports/report_5min_2025-07-14_18-11.csv b/reports/report_5min_2025-07-14_18-11.csv deleted file mode 100644 index c9ad19d..0000000 --- a/reports/report_5min_2025-07-14_18-11.csv +++ /dev/null @@ -1,16 +0,0 @@ -Sports Betting Reports (Periodic) -Period,Total Bets,Total Cash Made,Total Cash Out,Total Cash Backs,Total Deposits,Total Withdrawals,Total Tickets -5min,0,0.00,0.00,0.00,0.00,0.00,0 - -Virtual Game Reports (Periodic) -Game Name,Number of Bets,Total Transaction Sum - -Company Reports (Periodic) -Company ID,Company Name,Total Bets,Total Cash In,Total Cash Out,Total Cash Backs - -Branch Reports (Periodic) -Branch ID,Branch Name,Company ID,Total Bets,Total Cash In,Total Cash Out,Total Cash Backs - -Total Summary -Total Bets,Total Cash In,Total Cash Out,Total Cash Backs -0,0.00,0.00,0.00 diff --git a/reports/report_5min_2025-07-14_18-15.csv b/reports/report_5min_2025-07-14_18-15.csv deleted file mode 100644 index c9ad19d..0000000 --- a/reports/report_5min_2025-07-14_18-15.csv +++ /dev/null @@ -1,16 +0,0 @@ -Sports Betting Reports (Periodic) -Period,Total Bets,Total Cash Made,Total Cash Out,Total Cash Backs,Total Deposits,Total Withdrawals,Total Tickets -5min,0,0.00,0.00,0.00,0.00,0.00,0 - -Virtual Game Reports (Periodic) -Game Name,Number of Bets,Total Transaction Sum - -Company Reports (Periodic) -Company ID,Company Name,Total Bets,Total Cash In,Total Cash Out,Total Cash Backs - -Branch Reports (Periodic) -Branch ID,Branch Name,Company ID,Total Bets,Total Cash In,Total Cash Out,Total Cash Backs - -Total Summary -Total Bets,Total Cash In,Total Cash Out,Total Cash Backs -0,0.00,0.00,0.00 diff --git a/reports/report_5min_2025-07-14_18-16.csv b/reports/report_5min_2025-07-14_18-16.csv deleted file mode 100644 index c9ad19d..0000000 --- a/reports/report_5min_2025-07-14_18-16.csv +++ /dev/null @@ -1,16 +0,0 @@ -Sports Betting Reports (Periodic) -Period,Total Bets,Total Cash Made,Total Cash Out,Total Cash Backs,Total Deposits,Total Withdrawals,Total Tickets -5min,0,0.00,0.00,0.00,0.00,0.00,0 - -Virtual Game Reports (Periodic) -Game Name,Number of Bets,Total Transaction Sum - -Company Reports (Periodic) -Company ID,Company Name,Total Bets,Total Cash In,Total Cash Out,Total Cash Backs - -Branch Reports (Periodic) -Branch ID,Branch Name,Company ID,Total Bets,Total Cash In,Total Cash Out,Total Cash Backs - -Total Summary -Total Bets,Total Cash In,Total Cash Out,Total Cash Backs -0,0.00,0.00,0.00