示例#1
0
        public async Task <MakeBetResponseDto> MakeBet(MakeBet cmd, string ipAddress)
        {
            var validationResult = CheckBets.IsValid(cmd.Bet);

            if (!validationResult.getIsValid())
            {
                throw new BadRequestException(Constants.InvalidBetExceptionTest);
            }

            var user = await _dbHelper.GetUserAsync(_securityService.CurrentUser.Id, User.ControlFlags.Basic | User.ControlFlags.Bets);

            if (user.RowVersion != cmd.RowVersion)
            {
                throw new ConcurrencyException();
            }

            var winningNumber = new Random().Next(0, 36);

            var(spinId, won, wonAmount) = user.MakeBat(cmd, CheckBets.EstimateWin, winningNumber, validationResult.getBetAmount(), ipAddress);

            await _dbHelper.UpdateUserAsync(user, cmd.RowVersion);

            return(new MakeBetResponseDto
            {
                WinningNumber = winningNumber,
                Won = won,
                SpinId = spinId,
                WonAmount = wonAmount,
            });
        }
示例#2
0
        public delegate int EstimateWin(string bet, int winingNumber); // Using delegate to decouple domain logic to external lib and to test better

        public (Guid spinId, bool won, decimal?wonAmount) MakeBat(MakeBet cmd, EstimateWin estimateWin, int winningNumber, long betAmount, string ipAddress)
        {
            if (betAmount > Balance)
            {
                throw new BadRequestException(Constants.NotEnoughBalanceExceptionText);
            }

            var estWin    = estimateWin(cmd.Bet, winningNumber);
            var won       = estWin > 0;
            var wonAmount = won ? estWin : default(int?);
            var spinId    = Guid.NewGuid();

            Balance = won ? Balance - betAmount + estWin : Balance - betAmount;

            if (Bets == null)
            {
                Bets = new List <UserBet>();
            }

            Bets.Add(new UserBet
            {
                UserId        = Id,
                Bet           = cmd.Bet,
                Amount        = betAmount,
                WonAmount     = wonAmount,
                SpinId        = spinId,
                Won           = won,
                WinningNumber = winningNumber,
                IpAddress     = ipAddress,
                DateCreated   = DateTime.Now
            });

            BetMade = true;

            return(spinId, won, wonAmount);
        }
示例#3
0
 public async Task <ActionResult <MakeBetResponseDto> > MakeBet([FromBody] MakeBet cmd)
 => Ok(await _service.MakeBet(cmd, Request.HttpContext.Connection.RemoteIpAddress.ToString()));