virtual_games wallet service fixes
This commit is contained in:
parent
857212d9ba
commit
7575f29386
|
|
@ -11176,10 +11176,8 @@ const docTemplate = `{
|
|||
"tournament_name": {
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_stageFK": {
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_stage_name": {
|
||||
"description": "TournamentStageFK string ` + "`" + `json:\"tournament_stageFK\"` + "`" + `",
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_templateFK": {
|
||||
|
|
@ -11381,10 +11379,8 @@ const docTemplate = `{
|
|||
"tournament_name": {
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_stage_fk": {
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_stage_name": {
|
||||
"description": "TournamentStageFK string ` + "`" + `json:\"tournament_stage_fk\"` + "`" + `",
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_template_fk": {
|
||||
|
|
|
|||
|
|
@ -11168,10 +11168,8 @@
|
|||
"tournament_name": {
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_stageFK": {
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_stage_name": {
|
||||
"description": "TournamentStageFK string `json:\"tournament_stageFK\"`",
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_templateFK": {
|
||||
|
|
@ -11373,10 +11371,8 @@
|
|||
"tournament_name": {
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_stage_fk": {
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_stage_name": {
|
||||
"description": "TournamentStageFK string `json:\"tournament_stage_fk\"`",
|
||||
"type": "string"
|
||||
},
|
||||
"tournament_template_fk": {
|
||||
|
|
|
|||
|
|
@ -838,8 +838,7 @@ definitions:
|
|||
tournament_name:
|
||||
type: string
|
||||
tournament_stage_name:
|
||||
type: string
|
||||
tournament_stageFK:
|
||||
description: TournamentStageFK string `json:"tournament_stageFK"`
|
||||
type: string
|
||||
tournament_template_name:
|
||||
type: string
|
||||
|
|
@ -975,9 +974,8 @@ definitions:
|
|||
type: string
|
||||
tournament_name:
|
||||
type: string
|
||||
tournament_stage_fk:
|
||||
type: string
|
||||
tournament_stage_name:
|
||||
description: TournamentStageFK string `json:"tournament_stage_fk"`
|
||||
type: string
|
||||
tournament_template_fk:
|
||||
type: string
|
||||
|
|
|
|||
|
|
@ -116,7 +116,7 @@ func (s *Service) ProcessBet(ctx context.Context, req domain.AtlasBetRequest) (*
|
|||
}
|
||||
|
||||
// 6. Deduct amount from wallet (record transaction)
|
||||
_, err = s.walletSvc.DeductFromWallet(ctx, wallet.ID, domain.Currency(req.Amount), domain.ValidInt64{}, domain.PaymentMethod(domain.DEPOSIT), "")
|
||||
err = s.walletSvc.UpdateBalance(ctx, wallet.RegularID, domain.Currency(float64(wallet.RegularBalance)-req.Amount))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to debit wallet: %w", err)
|
||||
}
|
||||
|
|
@ -157,13 +157,13 @@ func (s *Service) ProcessBetWin(ctx context.Context, req domain.AtlasBetWinReque
|
|||
}
|
||||
|
||||
// 6. Deduct amount from wallet (record transaction)
|
||||
_, err = s.walletSvc.DeductFromWallet(ctx, wallet.ID, domain.Currency(req.BetAmount), domain.ValidInt64{}, domain.PaymentMethod(domain.DEPOSIT), "")
|
||||
err = s.walletSvc.UpdateBalance(ctx, wallet.RegularID, domain.Currency(float64(wallet.RegularBalance)-req.BetAmount))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to debit wallet: %w", err)
|
||||
}
|
||||
|
||||
if req.WinAmount > 0 {
|
||||
_, err = s.walletSvc.AddToWallet(ctx, wallet.ID, domain.Currency(req.WinAmount), domain.ValidInt64{}, domain.PaymentMethod(domain.DEPOSIT), domain.PaymentDetails{}, "")
|
||||
err = s.walletSvc.UpdateBalance(ctx, wallet.RegularID, domain.Currency(float64(wallet.RegularBalance)+req.WinAmount))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to credit wallet: %w", err)
|
||||
}
|
||||
|
|
@ -172,7 +172,7 @@ func (s *Service) ProcessBetWin(ctx context.Context, req domain.AtlasBetWinReque
|
|||
// 8. Build response
|
||||
res := &domain.AtlasBetWinResponse{
|
||||
PlayerID: req.PlayerID,
|
||||
Balance: float64(wallet.RegularBalance) - req.BetAmount + req.WinAmount,
|
||||
Balance: float64(wallet.RegularBalance),
|
||||
}
|
||||
|
||||
return res, nil
|
||||
|
|
@ -196,7 +196,7 @@ func (s *Service) ProcessRoundResult(ctx context.Context, req domain.RoundResult
|
|||
return nil, fmt.Errorf("failed to fetch walllets for player %d: %w", playerIDInt, err)
|
||||
}
|
||||
|
||||
_, err = s.walletSvc.AddToWallet(ctx, wallet.ID, domain.Currency(req.Amount), domain.ValidInt64{}, domain.PaymentMethod(domain.DEPOSIT), domain.PaymentDetails{}, "")
|
||||
err = s.walletSvc.UpdateBalance(ctx, wallet.RegularID, domain.Currency(float64(wallet.RegularBalance)+req.Amount))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to credit wallet: %w", err)
|
||||
}
|
||||
|
|
@ -228,7 +228,7 @@ func (s *Service) ProcessRollBack(ctx context.Context, req domain.RollbackReques
|
|||
return nil, fmt.Errorf("failed to fetch transfer for reference %s: %w", req.BetTransactionID, err)
|
||||
}
|
||||
|
||||
_, err = s.walletSvc.AddToWallet(ctx, wallet.ID, domain.Currency(transfer.Amount), domain.ValidInt64{}, domain.PaymentMethod(domain.DEPOSIT), domain.PaymentDetails{}, "")
|
||||
err = s.walletSvc.UpdateBalance(ctx, wallet.RegularID, domain.Currency(float64(wallet.RegularBalance)+float64(transfer.Amount)))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to credit wallet: %w", err)
|
||||
}
|
||||
|
|
@ -283,7 +283,7 @@ func (s *Service) ProcessFreeSpinResult(ctx context.Context, req domain.FreeSpin
|
|||
return nil, fmt.Errorf("failed to fetch walllets for player %d: %w", playerIDInt, err)
|
||||
}
|
||||
|
||||
_, err = s.walletSvc.AddToWallet(ctx, wallet.ID, domain.Currency(req.Amount), domain.ValidInt64{}, domain.PaymentMethod(domain.DEPOSIT), domain.PaymentDetails{}, "")
|
||||
err = s.walletSvc.UpdateBalance(ctx, wallet.RegularID, domain.Currency(float64(wallet.RegularBalance)+req.Amount))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to credit wallet: %w", err)
|
||||
}
|
||||
|
|
@ -312,7 +312,7 @@ func (s *Service) ProcessJackPot(ctx context.Context, req domain.JackpotRequest)
|
|||
return nil, fmt.Errorf("failed to fetch walllets for player %d: %w", playerIDInt, err)
|
||||
}
|
||||
|
||||
_, err = s.walletSvc.AddToWallet(ctx, wallet.ID, domain.Currency(req.Amount), domain.ValidInt64{}, domain.PaymentMethod(domain.DEPOSIT), domain.PaymentDetails{}, "")
|
||||
_, err = s.walletSvc.AddToWallet(ctx, wallet.RegularID, domain.Currency(req.Amount), domain.ValidInt64{}, domain.PaymentMethod(domain.DEPOSIT), domain.PaymentDetails{}, "")
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to credit wallet: %w", err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -224,16 +224,16 @@ func (s *service) GetPlayerInfo(ctx context.Context, req *domain.PopOKPlayerInfo
|
|||
return nil, fmt.Errorf("invalid token")
|
||||
}
|
||||
|
||||
wallets, err := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
if err != nil || len(wallets) == 0 {
|
||||
wallet, err := s.walletSvc.GetCustomerWallet(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
s.logger.Error("No wallets found for user", "userID", claims.UserID)
|
||||
return nil, fmt.Errorf("no wallet found")
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return &domain.PopOKPlayerInfoResponse{
|
||||
Country: "ET",
|
||||
Currency: claims.Currency,
|
||||
Balance: float64(wallets[0].Balance), // Convert cents to currency
|
||||
Balance: float64(wallet.RegularBalance), // Convert cents to currency
|
||||
PlayerID: fmt.Sprintf("%d", claims.UserID),
|
||||
}, nil
|
||||
}
|
||||
|
|
@ -246,17 +246,17 @@ func (s *service) ProcessBet(ctx context.Context, req *domain.PopOKBetRequest) (
|
|||
}
|
||||
|
||||
// Convert amount to cents (assuming wallet uses cents)
|
||||
amountCents := int64(req.Amount)
|
||||
// amount := int64(req.Amount)
|
||||
|
||||
// Deduct from wallet
|
||||
|
||||
userWallets, err := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
wallet, err := s.walletSvc.GetCustomerWallet(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
return &domain.PopOKBetResponse{}, fmt.Errorf("Failed to read user wallets")
|
||||
}
|
||||
_, err = s.walletSvc.DeductFromWallet(ctx, claims.UserID, domain.Currency(amountCents),
|
||||
_, err = s.walletSvc.DeductFromWallet(ctx, wallet.RegularID, domain.Currency(req.Amount),
|
||||
domain.ValidInt64{}, domain.TRANSFER_DIRECT,
|
||||
fmt.Sprintf("Deducted %v amount from wallet by system while placing virtual game bet", amountCents))
|
||||
fmt.Sprintf("Deducted %v amount from wallet by system while placing virtual game bet", req.Amount))
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("insufficient balance")
|
||||
}
|
||||
|
|
@ -268,7 +268,7 @@ func (s *service) ProcessBet(ctx context.Context, req *domain.PopOKBetRequest) (
|
|||
Provider: string(domain.PROVIDER_POPOK),
|
||||
GameID: req.GameID,
|
||||
TransactionType: "BET",
|
||||
Amount: amountCents, // Negative for bets
|
||||
Amount: int64(req.Amount), // Negative for bets
|
||||
Currency: req.Currency,
|
||||
ExternalTransactionID: req.TransactionID,
|
||||
Status: "COMPLETED",
|
||||
|
|
@ -283,7 +283,7 @@ func (s *service) ProcessBet(ctx context.Context, req *domain.PopOKBetRequest) (
|
|||
return &domain.PopOKBetResponse{
|
||||
TransactionID: req.TransactionID,
|
||||
ExternalTrxID: fmt.Sprintf("%v", tx.ID), // Your internal transaction ID
|
||||
Balance: float64(userWallets[0].Balance),
|
||||
Balance: float64(wallet.RegularBalance),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
|
@ -319,10 +319,15 @@ func (s *service) ProcessWin(ctx context.Context, req *domain.PopOKWinRequest) (
|
|||
}
|
||||
|
||||
// 3. Convert amount to cents
|
||||
amountCents := int64(req.Amount)
|
||||
// amountCents := int64(req.Amount)
|
||||
|
||||
wallet, err := s.walletSvc.GetCustomerWallet(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Failed to read user wallets")
|
||||
}
|
||||
|
||||
// 4. Credit to wallet
|
||||
_, err = s.walletSvc.AddToWallet(ctx, claims.UserID, domain.Currency(amountCents), domain.ValidInt64{},
|
||||
_, err = s.walletSvc.AddToWallet(ctx, wallet.RegularID, domain.Currency(req.Amount), domain.ValidInt64{},
|
||||
domain.TRANSFER_DIRECT, domain.PaymentDetails{},
|
||||
fmt.Sprintf("Added %v to wallet for winning PopOkBet", req.Amount),
|
||||
)
|
||||
|
|
@ -331,10 +336,10 @@ func (s *service) ProcessWin(ctx context.Context, req *domain.PopOKWinRequest) (
|
|||
return nil, fmt.Errorf("wallet credit failed")
|
||||
}
|
||||
|
||||
userWallets, err := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
return &domain.PopOKWinResponse{}, fmt.Errorf("Failed to read user wallets")
|
||||
}
|
||||
// userWallets, err := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
// if err != nil {
|
||||
// return &domain.PopOKWinResponse{}, fmt.Errorf("Failed to read user wallets")
|
||||
// }
|
||||
// 5. Create transaction record
|
||||
tx := &domain.VirtualGameTransaction{
|
||||
UserID: claims.UserID,
|
||||
|
|
@ -342,7 +347,7 @@ func (s *service) ProcessWin(ctx context.Context, req *domain.PopOKWinRequest) (
|
|||
Provider: string(domain.PROVIDER_POPOK),
|
||||
GameID: req.GameID,
|
||||
TransactionType: "WIN",
|
||||
Amount: amountCents,
|
||||
Amount: int64(req.Amount),
|
||||
Currency: req.Currency,
|
||||
ExternalTransactionID: req.TransactionID,
|
||||
Status: "COMPLETED",
|
||||
|
|
@ -354,12 +359,12 @@ func (s *service) ProcessWin(ctx context.Context, req *domain.PopOKWinRequest) (
|
|||
return nil, fmt.Errorf("transaction recording failed")
|
||||
}
|
||||
|
||||
fmt.Printf("\n\n Win balance is:%v\n\n", float64(userWallets[0].Balance))
|
||||
fmt.Printf("\n\n Win balance is:%v\n\n", float64(wallet.RegularBalance))
|
||||
|
||||
return &domain.PopOKWinResponse{
|
||||
TransactionID: req.TransactionID,
|
||||
ExternalTrxID: fmt.Sprintf("%v", tx.ID),
|
||||
Balance: float64(userWallets[0].Balance),
|
||||
Balance: float64(wallet.RegularBalance),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
|
@ -371,6 +376,11 @@ func (s *service) ProcessTournamentWin(ctx context.Context, req *domain.PopOKWin
|
|||
return nil, fmt.Errorf("invalid token")
|
||||
}
|
||||
|
||||
wallet, err := s.walletSvc.GetCustomerWallet(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Failed to read user wallets")
|
||||
}
|
||||
|
||||
// 2. Check for duplicate tournament win transaction
|
||||
existingTx, err := s.repo.GetVirtualGameTransactionByExternalID(ctx, req.TransactionID)
|
||||
if err != nil {
|
||||
|
|
@ -379,15 +389,15 @@ func (s *service) ProcessTournamentWin(ctx context.Context, req *domain.PopOKWin
|
|||
}
|
||||
if existingTx != nil && existingTx.TransactionType == "TOURNAMENT_WIN" {
|
||||
s.logger.Warn("Duplicate tournament win", "transactionID", req.TransactionID)
|
||||
wallets, _ := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
balance := 0.0
|
||||
if len(wallets) > 0 {
|
||||
balance = float64(wallets[0].Balance)
|
||||
}
|
||||
// wallet, _ := s.walletSvc.GetCustomerWallet(ctx, claims.UserID)
|
||||
// balance := 0.0
|
||||
// if len(wallets) > 0 {
|
||||
// balance = float64(wallets[0].Balance)
|
||||
// }
|
||||
return &domain.PopOKWinResponse{
|
||||
TransactionID: req.TransactionID,
|
||||
ExternalTrxID: fmt.Sprintf("%v", existingTx.ID),
|
||||
Balance: balance,
|
||||
Balance: float64(wallet.RegularBalance),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
|
@ -395,7 +405,7 @@ func (s *service) ProcessTournamentWin(ctx context.Context, req *domain.PopOKWin
|
|||
amountCents := int64(req.Amount)
|
||||
|
||||
// 4. Credit user wallet
|
||||
_, err = s.walletSvc.AddToWallet(ctx, claims.UserID, domain.Currency(amountCents), domain.ValidInt64{}, domain.TRANSFER_DIRECT, domain.PaymentDetails{},
|
||||
_, err = s.walletSvc.AddToWallet(ctx, wallet.RegularID, domain.Currency(req.Amount), domain.ValidInt64{}, domain.TRANSFER_DIRECT, domain.PaymentDetails{},
|
||||
fmt.Sprintf("Added %v to wallet for winning Popok Tournament", req.Amount))
|
||||
if err != nil {
|
||||
s.logger.Error("Failed to credit wallet for tournament", "userID", claims.UserID, "error", err)
|
||||
|
|
@ -419,15 +429,15 @@ func (s *service) ProcessTournamentWin(ctx context.Context, req *domain.PopOKWin
|
|||
}
|
||||
|
||||
// 6. Fetch updated balance
|
||||
wallets, err := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Failed to get wallet balance")
|
||||
}
|
||||
// wallets, err := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("Failed to get wallet balance")
|
||||
// }
|
||||
|
||||
return &domain.PopOKWinResponse{
|
||||
TransactionID: req.TransactionID,
|
||||
ExternalTrxID: fmt.Sprintf("%v", tx.ID),
|
||||
Balance: float64(wallets[0].Balance),
|
||||
Balance: float64(wallet.RegularBalance),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
|
@ -438,6 +448,11 @@ func (s *service) ProcessPromoWin(ctx context.Context, req *domain.PopOKWinReque
|
|||
return nil, fmt.Errorf("invalid token")
|
||||
}
|
||||
|
||||
wallet, err := s.walletSvc.GetCustomerWallet(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Failed to read user wallets")
|
||||
}
|
||||
|
||||
existingTx, err := s.repo.GetVirtualGameTransactionByExternalID(ctx, req.TransactionID)
|
||||
if err != nil {
|
||||
s.logger.Error("Failed to check existing promo transaction", "error", err)
|
||||
|
|
@ -445,20 +460,20 @@ func (s *service) ProcessPromoWin(ctx context.Context, req *domain.PopOKWinReque
|
|||
}
|
||||
if existingTx != nil && existingTx.TransactionType == "PROMO_WIN" {
|
||||
s.logger.Warn("Duplicate promo win", "transactionID", req.TransactionID)
|
||||
wallets, _ := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
balance := 0.0
|
||||
if len(wallets) > 0 {
|
||||
balance = float64(wallets[0].Balance)
|
||||
}
|
||||
// wallets, _ := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
// balance := 0.0
|
||||
// if len(wallets) > 0 {
|
||||
// balance = float64(wallets[0].Balance)
|
||||
// }
|
||||
return &domain.PopOKWinResponse{
|
||||
TransactionID: req.TransactionID,
|
||||
ExternalTrxID: fmt.Sprintf("%v", existingTx.ID),
|
||||
Balance: balance,
|
||||
Balance: float64(wallet.RegularBalance),
|
||||
}, nil
|
||||
}
|
||||
|
||||
amountCents := int64(req.Amount * 100)
|
||||
_, err = s.walletSvc.AddToWallet(ctx, claims.UserID, domain.Currency(amountCents), domain.ValidInt64{},
|
||||
// amountCents := int64(req.Amount * 100)
|
||||
_, err = s.walletSvc.AddToWallet(ctx, wallet.RegularID, domain.Currency(req.Amount), domain.ValidInt64{},
|
||||
domain.TRANSFER_DIRECT, domain.PaymentDetails{}, fmt.Sprintf("Added %v to wallet for winning PopOk Promo Win", req.Amount))
|
||||
if err != nil {
|
||||
s.logger.Error("Failed to credit wallet for promo", "userID", claims.UserID, "error", err)
|
||||
|
|
@ -468,7 +483,7 @@ func (s *service) ProcessPromoWin(ctx context.Context, req *domain.PopOKWinReque
|
|||
tx := &domain.VirtualGameTransaction{
|
||||
UserID: claims.UserID,
|
||||
TransactionType: "PROMO_WIN",
|
||||
Amount: amountCents,
|
||||
Amount: int64(wallet.RegularBalance),
|
||||
Currency: req.Currency,
|
||||
ExternalTransactionID: req.TransactionID,
|
||||
Status: "COMPLETED",
|
||||
|
|
@ -480,15 +495,15 @@ func (s *service) ProcessPromoWin(ctx context.Context, req *domain.PopOKWinReque
|
|||
return nil, fmt.Errorf("transaction recording failed")
|
||||
}
|
||||
|
||||
wallets, err := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to read wallets")
|
||||
}
|
||||
// wallets, err := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("failed to read wallets")
|
||||
// }
|
||||
|
||||
return &domain.PopOKWinResponse{
|
||||
TransactionID: req.TransactionID,
|
||||
ExternalTrxID: fmt.Sprintf("%v", tx.ID),
|
||||
Balance: float64(wallets[0].Balance),
|
||||
Balance: float64(wallet.RegularBalance),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
|
@ -535,6 +550,11 @@ func (s *service) ProcessCancel(ctx context.Context, req *domain.PopOKCancelRequ
|
|||
// return nil, fmt.Errorf("invalid token")
|
||||
// }
|
||||
|
||||
wallet, err := s.walletSvc.GetCustomerWallet(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("Failed to read user wallets")
|
||||
}
|
||||
|
||||
// 2. Find the original bet transaction
|
||||
originalBet, err := s.repo.GetVirtualGameTransactionByExternalID(ctx, req.TransactionID)
|
||||
if err != nil {
|
||||
|
|
@ -551,21 +571,21 @@ func (s *service) ProcessCancel(ctx context.Context, req *domain.PopOKCancelRequ
|
|||
// 4. Check if already cancelled
|
||||
if originalBet.Status == "CANCELLED" {
|
||||
s.logger.Warn("Transaction already cancelled", "transactionID", req.TransactionID)
|
||||
wallets, _ := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
balance := 0.0
|
||||
if len(wallets) > 0 {
|
||||
balance = float64(wallets[0].Balance)
|
||||
}
|
||||
// wallets, _ := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
// balance := 0.0
|
||||
// if len(wallets) > 0 {
|
||||
// balance = float64(wallets[0].Balance)
|
||||
// }
|
||||
return &domain.PopOKCancelResponse{
|
||||
TransactionID: req.TransactionID,
|
||||
ExternalTrxID: fmt.Sprintf("%v", originalBet.ID),
|
||||
Balance: balance,
|
||||
Balance: float64(wallet.RegularBalance),
|
||||
}, nil
|
||||
}
|
||||
|
||||
// 5. Refund the bet amount (absolute value since bet amount is negative)
|
||||
refundAmount := -originalBet.Amount
|
||||
_, err = s.walletSvc.AddToWallet(ctx, claims.UserID, domain.Currency(refundAmount), domain.ValidInt64{}, domain.TRANSFER_DIRECT, domain.PaymentDetails{},
|
||||
_, err = s.walletSvc.AddToWallet(ctx, wallet.RegularID, domain.Currency(refundAmount), domain.ValidInt64{}, domain.TRANSFER_DIRECT, domain.PaymentDetails{},
|
||||
fmt.Sprintf("Added %v to wallet as refund for cancelling PopOk bet", refundAmount),
|
||||
)
|
||||
if err != nil {
|
||||
|
|
@ -573,10 +593,10 @@ func (s *service) ProcessCancel(ctx context.Context, req *domain.PopOKCancelRequ
|
|||
return nil, fmt.Errorf("refund failed")
|
||||
}
|
||||
|
||||
userWallets, err := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
if err != nil {
|
||||
return &domain.PopOKCancelResponse{}, fmt.Errorf("Failed to read user wallets")
|
||||
}
|
||||
// userWallets, err := s.walletSvc.GetWalletsByUser(ctx, claims.UserID)
|
||||
// if err != nil {
|
||||
// return &domain.PopOKCancelResponse{}, fmt.Errorf("Failed to read user wallets")
|
||||
// }
|
||||
|
||||
// 6. Mark original bet as cancelled and create cancel record
|
||||
cancelTx := &domain.VirtualGameTransaction{
|
||||
|
|
@ -615,7 +635,7 @@ func (s *service) ProcessCancel(ctx context.Context, req *domain.PopOKCancelRequ
|
|||
return &domain.PopOKCancelResponse{
|
||||
TransactionID: req.TransactionID,
|
||||
ExternalTrxID: fmt.Sprintf("%v", cancelTx.ID),
|
||||
Balance: float64(userWallets[0].Balance),
|
||||
Balance: float64(wallet.RegularBalance),
|
||||
}, nil
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
package veli
|
||||
|
|
@ -218,23 +218,24 @@ func (s *Service) GetBalance(ctx context.Context, req domain.BalanceRequest) (*d
|
|||
if err != nil {
|
||||
return nil, fmt.Errorf("invalid PlayerID: %w", err)
|
||||
}
|
||||
playerWallets, err := s.walletSvc.GetWalletsByUser(ctx, playerIDInt64)
|
||||
// playerWallets, err := s.walletSvc.GetWalletsByUser(ctx, playerIDInt64)
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("failed to get real balance: %w", err)
|
||||
// }
|
||||
// if len(playerWallets) == 0 {
|
||||
// return nil, fmt.Errorf("PLAYER_NOT_FOUND: no wallet found for player %s", req.PlayerID)
|
||||
// }
|
||||
|
||||
wallet, err := s.walletSvc.GetCustomerWallet(ctx, playerIDInt64)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get real balance: %w", err)
|
||||
}
|
||||
if len(playerWallets) == 0 {
|
||||
return nil, fmt.Errorf("PLAYER_NOT_FOUND: no wallet found for player %s", req.PlayerID)
|
||||
return nil, fmt.Errorf("failed to read user wallets")
|
||||
}
|
||||
|
||||
realBalance := playerWallets[0].Balance
|
||||
// realBalance := playerWallets[0].Balance
|
||||
|
||||
// Retrieve bonus balance if applicable
|
||||
var bonusBalance float64
|
||||
if len(playerWallets) > 1 {
|
||||
bonusBalance = float64(playerWallets[1].Balance)
|
||||
} else {
|
||||
bonusBalance = 0
|
||||
}
|
||||
// var bonusBalance float64
|
||||
// bonusBalance := float64(wallet.StaticBalance)
|
||||
|
||||
// Build the response
|
||||
res := &domain.BalanceResponse{
|
||||
|
|
@ -243,19 +244,19 @@ func (s *Service) GetBalance(ctx context.Context, req domain.BalanceRequest) (*d
|
|||
Amount float64 `json:"amount"`
|
||||
}{
|
||||
Currency: req.Currency,
|
||||
Amount: float64(realBalance),
|
||||
Amount: float64(wallet.RegularBalance),
|
||||
},
|
||||
}
|
||||
|
||||
if bonusBalance > 0 {
|
||||
res.Bonus = &struct {
|
||||
Currency string `json:"currency"`
|
||||
Amount float64 `json:"amount"`
|
||||
}{
|
||||
Currency: req.Currency,
|
||||
Amount: bonusBalance,
|
||||
}
|
||||
}
|
||||
// if bonusBalance > 0 {
|
||||
// res.Bonus = &struct {
|
||||
// Currency string `json:"currency"`
|
||||
// Amount float64 `json:"amount"`
|
||||
// }{
|
||||
// Currency: req.Currency,
|
||||
// Amount: bonusBalance,
|
||||
// }
|
||||
// }
|
||||
|
||||
return res, nil
|
||||
}
|
||||
|
|
@ -280,91 +281,64 @@ func (s *Service) ProcessBet(ctx context.Context, req domain.BetRequest) (*domai
|
|||
// }
|
||||
|
||||
// --- 3. Get player wallets ---
|
||||
playerWallets, err := s.walletSvc.GetWalletsByUser(ctx, playerIDInt64)
|
||||
// playerWallets, err := s.walletSvc.GetWalletsByUser(ctx, playerIDInt64)
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("failed to get real balance: %w", err)
|
||||
// }
|
||||
// if len(playerWallets) == 0 {
|
||||
// return nil, fmt.Errorf("no wallets found for player %s", req.PlayerID)
|
||||
// }
|
||||
|
||||
wallet, err := s.walletSvc.GetCustomerWallet(ctx, playerIDInt64)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get real balance: %w", err)
|
||||
}
|
||||
if len(playerWallets) == 0 {
|
||||
return nil, fmt.Errorf("no wallets found for player %s", req.PlayerID)
|
||||
return nil, fmt.Errorf("failed to read user wallets")
|
||||
}
|
||||
|
||||
realWallet := playerWallets[0]
|
||||
realBalance := float64(realWallet.Balance)
|
||||
// realWallet := playerWallets[0]
|
||||
// realBalance := float64(realWallet.Balance)
|
||||
|
||||
var bonusBalance float64
|
||||
if len(playerWallets) > 1 {
|
||||
bonusBalance = float64(playerWallets[1].Balance)
|
||||
}
|
||||
// var bonusBalance float64
|
||||
// if len(playerWallets) > 1 {
|
||||
// bonusBalance = float64(playerWallets[1].Balance)
|
||||
// }
|
||||
|
||||
bonusBalance := float64(wallet.StaticBalance)
|
||||
|
||||
// --- 4. Check sufficient balance ---
|
||||
totalBalance := realBalance + bonusBalance
|
||||
if totalBalance < req.Amount.Amount {
|
||||
// totalBalance := float64(wallet.RegularBalance) + bonusBalance
|
||||
if float64(wallet.RegularBalance) < req.Amount.Amount {
|
||||
return nil, fmt.Errorf("INSUFFICIENT_BALANCE")
|
||||
}
|
||||
|
||||
// --- 5. Deduct funds (bonus first, then real) ---
|
||||
remaining := req.Amount.Amount
|
||||
var usedBonus, usedReal float64
|
||||
// var usedBonus, usedReal float64
|
||||
|
||||
if bonusBalance > 0 {
|
||||
if bonusBalance >= remaining {
|
||||
// fully cover from bonus
|
||||
usedBonus = remaining
|
||||
bonusBalance -= remaining
|
||||
remaining = 0
|
||||
} else {
|
||||
// partially cover from bonus
|
||||
usedBonus = bonusBalance
|
||||
remaining -= bonusBalance
|
||||
bonusBalance = 0
|
||||
}
|
||||
}
|
||||
|
||||
if remaining > 0 {
|
||||
if realBalance >= remaining {
|
||||
usedReal = remaining
|
||||
realBalance -= remaining
|
||||
remaining = 0
|
||||
} else {
|
||||
// should never happen because of totalBalance check
|
||||
if remaining > float64(wallet.RegularBalance) {
|
||||
return nil, fmt.Errorf("INSUFFICIENT_BALANCE")
|
||||
}
|
||||
}
|
||||
|
||||
// --- 6. Persist wallet deductions ---
|
||||
if usedBonus > 0 && len(playerWallets) > 1 {
|
||||
_, err = s.walletSvc.DeductFromWallet(ctx, playerWallets[1].ID,
|
||||
domain.Currency(usedBonus),
|
||||
|
||||
_, err = s.walletSvc.DeductFromWallet(ctx, wallet.RegularID,
|
||||
domain.Currency(req.Amount.Amount),
|
||||
domain.ValidInt64{},
|
||||
domain.TRANSFER_DIRECT,
|
||||
fmt.Sprintf("Deduct bonus %.2f for bet %s", usedBonus, req.TransactionID),
|
||||
fmt.Sprintf("Deduct amount %.2f for bet %s", req.Amount.Amount, req.TransactionID),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("bonus deduction failed: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
if usedReal > 0 {
|
||||
_, err = s.walletSvc.DeductFromWallet(ctx, realWallet.ID,
|
||||
domain.Currency(usedReal),
|
||||
domain.ValidInt64{},
|
||||
domain.TRANSFER_DIRECT,
|
||||
fmt.Sprintf("Deduct real %.2f for bet %s", usedReal, req.TransactionID),
|
||||
)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("real deduction failed: %w", err)
|
||||
}
|
||||
}
|
||||
|
||||
// --- 7. Build response ---
|
||||
res := &domain.BetResponse{
|
||||
Real: domain.BalanceDetail{
|
||||
Currency: "ETB",
|
||||
Amount: realBalance,
|
||||
Amount: float64(wallet.RegularBalance),
|
||||
},
|
||||
WalletTransactionID: req.TransactionID,
|
||||
UsedRealAmount: usedReal,
|
||||
UsedBonusAmount: usedBonus,
|
||||
UsedRealAmount: req.Amount.Amount,
|
||||
UsedBonusAmount: 0,
|
||||
}
|
||||
|
||||
if bonusBalance > 0 {
|
||||
|
|
@ -385,21 +359,19 @@ func (s *Service) ProcessWin(ctx context.Context, req domain.WinRequest) (*domai
|
|||
}
|
||||
|
||||
// --- 2. Get player wallets ---
|
||||
playerWallets, err := s.walletSvc.GetWalletsByUser(ctx, playerIDInt64)
|
||||
wallet, err := s.walletSvc.GetCustomerWallet(ctx, playerIDInt64)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get wallets: %w", err)
|
||||
}
|
||||
if len(playerWallets) == 0 {
|
||||
return nil, fmt.Errorf("PLAYER_NOT_FOUND: no wallets for player %s", req.PlayerID)
|
||||
return nil, fmt.Errorf("failed to read user wallets")
|
||||
}
|
||||
|
||||
realWallet := playerWallets[0]
|
||||
realBalance := float64(realWallet.Balance)
|
||||
// realWallet := playerWallets[0]
|
||||
realBalance := float64(wallet.RegularBalance)
|
||||
|
||||
var bonusBalance float64
|
||||
if len(playerWallets) > 1 {
|
||||
bonusBalance = float64(playerWallets[1].Balance)
|
||||
}
|
||||
// var bonusBalance float64
|
||||
// if len(playerWallets) > 1 {
|
||||
// bonusBalance = float64(playerWallets[1].Balance)
|
||||
// }
|
||||
bonusBalance := float64(wallet.StaticBalance)
|
||||
|
||||
// --- 3. Apply winnings (for now, everything goes to real wallet) ---
|
||||
winAmount := req.Amount.Amount
|
||||
|
|
@ -411,7 +383,7 @@ func (s *Service) ProcessWin(ctx context.Context, req domain.WinRequest) (*domai
|
|||
|
||||
_, err = s.walletSvc.AddToWallet(
|
||||
ctx,
|
||||
realWallet.ID,
|
||||
wallet.RegularID,
|
||||
domain.Currency(winAmount),
|
||||
domain.ValidInt64{},
|
||||
domain.TRANSFER_DIRECT,
|
||||
|
|
@ -422,18 +394,18 @@ func (s *Service) ProcessWin(ctx context.Context, req domain.WinRequest) (*domai
|
|||
return nil, fmt.Errorf("failed to credit real wallet: %w", err)
|
||||
}
|
||||
|
||||
// --- 4. Reload balances after credit ---
|
||||
updatedWallets, err := s.walletSvc.GetWalletsByUser(ctx, playerIDInt64)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to reload balances: %w", err)
|
||||
}
|
||||
// // --- 4. Reload balances after credit ---
|
||||
// updatedWallets, err := s.walletSvc.GetWalletsByUser(ctx, playerIDInt64)
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("failed to reload balances: %w", err)
|
||||
// }
|
||||
|
||||
updatedReal := updatedWallets[0]
|
||||
realBalance = float64(updatedReal.Balance)
|
||||
// updatedReal := updatedWallets[0]
|
||||
// realBalance = float64(wallet.RegularBalance)
|
||||
|
||||
if len(updatedWallets) > 1 {
|
||||
bonusBalance = float64(updatedWallets[1].Balance)
|
||||
}
|
||||
// if len(updatedWallets) > 1 {
|
||||
// bonusBalance = float64(updatedWallets[1].Balance)
|
||||
// }
|
||||
|
||||
// --- 5. Build response ---
|
||||
res := &domain.WinResponse{
|
||||
|
|
@ -464,21 +436,18 @@ func (s *Service) ProcessCancel(ctx context.Context, req domain.CancelRequest) (
|
|||
}
|
||||
|
||||
// --- 2. Get player wallets ---
|
||||
playerWallets, err := s.walletSvc.GetWalletsByUser(ctx, playerIDInt64)
|
||||
wallet, err := s.walletSvc.GetCustomerWallet(ctx, playerIDInt64)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to get wallets: %w", err)
|
||||
}
|
||||
if len(playerWallets) == 0 {
|
||||
return nil, fmt.Errorf("no wallets for player %s", req.PlayerID)
|
||||
return nil, fmt.Errorf("failed to read user wallets")
|
||||
}
|
||||
|
||||
realWallet := playerWallets[0]
|
||||
realBalance := float64(realWallet.Balance)
|
||||
// realWallet := playerWallets[0]
|
||||
realBalance := float64(wallet.RegularBalance)
|
||||
|
||||
var bonusBalance float64
|
||||
if len(playerWallets) > 1 {
|
||||
bonusBalance = float64(playerWallets[1].Balance)
|
||||
}
|
||||
// var bonusBalance float64
|
||||
// if len(playerWallets) > 1 {
|
||||
bonusBalance := float64(wallet.StaticBalance)
|
||||
// }
|
||||
|
||||
// --- 3. Determine refund amount based on IsAdjustment ---
|
||||
var refundAmount float64
|
||||
|
|
@ -502,7 +471,7 @@ func (s *Service) ProcessCancel(ctx context.Context, req domain.CancelRequest) (
|
|||
|
||||
_, err = s.walletSvc.AddToWallet(
|
||||
ctx,
|
||||
realWallet.ID,
|
||||
wallet.RegularID,
|
||||
domain.Currency(refundAmount),
|
||||
domain.ValidInt64{},
|
||||
domain.TRANSFER_DIRECT,
|
||||
|
|
@ -520,23 +489,23 @@ func (s *Service) ProcessCancel(ctx context.Context, req domain.CancelRequest) (
|
|||
}
|
||||
|
||||
// --- 5. Reload balances after refund ---
|
||||
updatedWallets, err := s.walletSvc.GetWalletsByUser(ctx, playerIDInt64)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("failed to reload balances: %w", err)
|
||||
}
|
||||
// updatedWallets, err := s.walletSvc.GetWalletsByUser(ctx, playerIDInt64)
|
||||
// if err != nil {
|
||||
// return nil, fmt.Errorf("failed to reload balances: %w", err)
|
||||
// }
|
||||
|
||||
updatedReal := updatedWallets[0]
|
||||
realBalance = float64(updatedReal.Balance)
|
||||
// updatedReal := updatedWallets[0]
|
||||
// realBalance = float64(wallet.RegularBalance)
|
||||
|
||||
if len(updatedWallets) > 1 {
|
||||
bonusBalance = float64(updatedWallets[1].Balance)
|
||||
}
|
||||
// if len(updatedWallets) > 1 {
|
||||
// bonusBalance = float64(updatedWallets[1].Balance)
|
||||
// }
|
||||
|
||||
// --- 6. Build response ---
|
||||
res := &domain.CancelResponse{
|
||||
WalletTransactionID: req.TransactionID,
|
||||
Real: domain.BalanceDetail{
|
||||
Currency: "ETB",
|
||||
Currency: req.AdjustmentRefund.Currency,
|
||||
Amount: realBalance,
|
||||
},
|
||||
UsedRealAmount: usedReal,
|
||||
|
|
@ -545,7 +514,7 @@ func (s *Service) ProcessCancel(ctx context.Context, req domain.CancelRequest) (
|
|||
|
||||
if bonusBalance > 0 {
|
||||
res.Bonus = &domain.BalanceDetail{
|
||||
Currency: "ETB",
|
||||
Currency: req.AdjustmentRefund.Currency,
|
||||
Amount: bonusBalance,
|
||||
}
|
||||
}
|
||||
|
|
@ -553,12 +522,6 @@ func (s *Service) ProcessCancel(ctx context.Context, req domain.CancelRequest) (
|
|||
return res, nil
|
||||
}
|
||||
|
||||
// Example helper to fetch original bet
|
||||
// func (s *Service) getOriginalBet(ctx context.Context, transactionID string) (*domain.BetRecord, error) {
|
||||
// // TODO: implement actual lookup
|
||||
// return &domain.BetRecord{Amount: 50}, nil
|
||||
// }
|
||||
|
||||
func (s *Service) GetGamingActivity(ctx context.Context, req domain.GamingActivityRequest) (*domain.GamingActivityResponse, error) {
|
||||
// --- Signature Params (flattened strings for signing) ---
|
||||
sigParams := map[string]any{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user