diff --git a/db/query/bet.sql b/db/query/bet.sql index fdc74d8..47018e1 100644 --- a/db/query/bet.sql +++ b/db/query/bet.sql @@ -101,6 +101,10 @@ WHERE (event_id = $1) SELECT * FROM bet_outcomes WHERE bet_id = $1; +-- name: GetBetOutcomeCountByOddID :one +SELECT COUNT(*) +FROM bet_outcomes +WHERE odd_id = $1; -- name: GetBetCountByUserID :one SELECT COUNT(*) FROM bets diff --git a/gen/db/bet.sql.go b/gen/db/bet.sql.go index c8d18d5..31ca511 100644 --- a/gen/db/bet.sql.go +++ b/gen/db/bet.sql.go @@ -410,6 +410,19 @@ func (q *Queries) GetBetOutcomeByEventID(ctx context.Context, arg GetBetOutcomeB return items, nil } +const GetBetOutcomeCountByOddID = `-- name: GetBetOutcomeCountByOddID :one +SELECT COUNT(*) +FROM bet_outcomes +WHERE odd_id = $1 +` + +func (q *Queries) GetBetOutcomeCountByOddID(ctx context.Context, oddID int64) (int64, error) { + row := q.db.QueryRow(ctx, GetBetOutcomeCountByOddID, oddID) + var count int64 + err := row.Scan(&count) + return count, err +} + const GetBetsForCashback = `-- name: GetBetsForCashback :many SELECT id, amount, total_odds, status, user_id, is_shop_bet, cashed_out, outcomes_hash, fast_code, processed, created_at, updated_at, full_name, phone_number, outcomes FROM bet_with_outcomes diff --git a/internal/repository/bet.go b/internal/repository/bet.go index f61e5c8..2dee7b1 100644 --- a/internal/repository/bet.go +++ b/internal/repository/bet.go @@ -299,6 +299,15 @@ func (s *Store) GetBetCountByOutcomesHash(ctx context.Context, outcomesHash stri return count, nil } +func (s *Store) GetBetOutcomeCountByOddID(ctx context.Context, oddID int64) (int64, error) { + count, err := s.queries.GetBetOutcomeCountByOddID(ctx, oddID) + 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 6c79f0a..e29b68e 100644 --- a/internal/services/bet/port.go +++ b/internal/services/bet/port.go @@ -17,6 +17,7 @@ type BetStore interface { GetBetByFastCode(ctx context.Context, fastcode string) (domain.GetBet, error) GetBetOutcomeByEventID(ctx context.Context, eventID int64, is_filtered bool) ([]domain.BetOutcome, error) GetBetOutcomeByBetID(ctx context.Context, betID int64) ([]domain.BetOutcome, error) + GetBetOutcomeCountByOddID(ctx context.Context, oddID int64) (int64, 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 diff --git a/internal/services/bet/service.go b/internal/services/bet/service.go index 7a2f0a4..7804ec4 100644 --- a/internal/services/bet/service.go +++ b/internal/services/bet/service.go @@ -398,6 +398,36 @@ func (s *Service) PlaceBet(ctx context.Context, req domain.CreateBetReq, userID return domain.CreateBetRes{}, err } + for i := range outcomes { + // flag odds with large amount of users betting on them + count, err := s.betStore.GetBetOutcomeCountByOddID(ctx, outcomes[i].OddID) + if err != nil { + s.mongoLogger.Error("failed to get count of bet outcome", + zap.Int64("bet_id", bet.ID), + zap.Int64("odd_id", outcomes[i].OddID), + zap.Error(err), + ) + return domain.CreateBetRes{}, err + } + + // TODO: fetch cap from settings in db + if count > 20 { + flag := domain.CreateFlagReq{ + BetID: 0, + OddID: outcomes[i].OddID, + Reason: fmt.Sprintf("too many users targeting odd - (%d)", outcomes[i].OddID), + } + + _, err := s.betStore.CreateFlag(ctx, flag) + if err != nil { + s.mongoLogger.Error("failed to create flag for bet", + zap.Int64("bet_id", bet.ID), + zap.Error(err), + ) + } + } + } + // flag bets that have more than three outcomes if len(outcomes) > 3 { flag := domain.CreateFlagReq{ @@ -425,9 +455,7 @@ func (s *Service) PlaceBet(ctx context.Context, req domain.CreateBetReq, userID return domain.CreateBetRes{}, err } - fmt.Println("total bet count: ", total_bet_count) - - if total_bet_count > 3 { + if total_bet_count > 10 { flag := domain.CreateFlagReq{ BetID: bet.ID, OddID: 0,