Пример #1
0
        public RoundBetResponseModel PlaceBet(int userId, RoundBetRequestModel model, string ipAddress)
        {
            // you never know when user will be deleted so maybe some check
            var user = _dbContext.Users.FirstOrDefault(x => x.DeleteDate == null && x.Id == userId);

            if (user == null)
            {
                return(new RoundBetResponseModel
                {
                    Success = false,
                    ErrorCode = ErrorCode.NotFound,
                    DeveloperMessage = $"User not found with {userId} id",
                });
            }
            var isBetValid = CheckBets.IsValid(model.BetString);

            if (!isBetValid.getIsValid())
            {
                return(new RoundBetResponseModel
                {
                    Success = false,
                    ErrorCode = ErrorCode.InvalidValue,
                    DeveloperMessage = $"Requested bet string invalid \"{model.BetString}\"",
                });
            }
            var betAmount = isBetValid.getBetAmount();

            if (user.Balance < betAmount)
            {
                return(new RoundBetResponseModel
                {
                    Success = false,
                    ErrorCode = ErrorCode.BalanceNotEnough,
                    DeveloperMessage = $"Not enough balance",
                });
            }
            user.Balance -= betAmount;
            if (_dbContext.SaveChanges() > 0)
            {
                var betAmountInMilli = betAmount * 100;
                var jackToIncrease   = betAmountInMilli * jackPercFromBet / 100;
                _jackpotService.IncreaseJackpot(jackToIncrease);

                var winningResult = new Random().Next(0, 36);
                int wonAmount     = CheckBets.EstimateWin(model.BetString, winningResult);
                _dbContext.Rounds.Add(new Round
                {
                    IpAddress     = ipAddress,
                    UserId        = userId,
                    WonAmount     = wonAmount,
                    BetAmount     = betAmount,
                    BetString     = model.BetString,
                    CreateDate    = DateTime.UtcNow,
                    WinningResult = winningResult,
                });
                user.Balance += wonAmount;
                if (_dbContext.SaveChanges() > 0)
                {
                    return(new RoundBetResponseModel
                    {
                        Success = true,
                        WonAmount = wonAmount,
                    });
                }
                else
                {
                    return(new RoundBetResponseModel
                    {
                        ErrorCode = ErrorCode.ChangesNotSaved,
                        DeveloperMessage = "Something went wrong and changes could not be saved.",
                    });
                }
            }
            else
            {
                return(new RoundBetResponseModel
                {
                    Success = false,
                    ErrorCode = ErrorCode.ChangesNotSaved,
                    DeveloperMessage = $"Couldnot subtract balance from user",
                });
            }
        }
Пример #2
0
        public RoundBetResponseModel Bet([FromBody] RoundBetRequestModel model)
        {
            var ipAddress = HttpContext.Connection.RemoteIpAddress.ToString();

            return(_roundService.PlaceBet(UserId.Value, model, ipAddress));
        }