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, }); }
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); }
public async Task <ActionResult <MakeBetResponseDto> > MakeBet([FromBody] MakeBet cmd) => Ok(await _service.MakeBet(cmd, Request.HttpContext.Connection.RemoteIpAddress.ToString()));