private async Task <Ticket> CreateTicket(CommitTicketRequest request) { var pairsToBetIds = request.BetingPairs.Select(p => p.BetedPairId); var betablePairs = await _dataProvider.BetablePairs(pairsToBetIds); if (request.BetingPairs.Count != betablePairs.Count) { var betablePairsIds = betablePairs.Select(p => p.Id); var difference = pairsToBetIds.Except(betablePairsIds); throw new BetablePairsNotFound(difference); } var betedPairs = CreateBetedPairs(request, betablePairs).ToArray(); var ticket = new Ticket { BetedPairs = betedPairs, Stake = request.Stake, UserId = _currentUser.Id() }; CalculateQuota(ticket); _unitOfWork.Add(ticket); _unitOfWork.AddRange(ticket.BetedPairs); await _unitOfWork.SaveChanges(); return(ticket); }
public async Task <TicketDto> Handle(CommitTicketRequest request) { var ticket = await CreateTicket(request); await _walletService.SubtractMoney(ticket.Stake, WalletTransaction.WalletTransactionType.TicketCommit); await _bonusService.ApplyBonuses(ticket); return(_mapper.Map <TicketDto>(ticket)); }
private static IEnumerable <BetedPair> CreateBetedPairs(CommitTicketRequest request, IEnumerable <BetablePair> betablePairs) { BetingType GetSelectedTypeOfPair(int pairId) => request.BetingPairs.First(p => p.BetedPairId == pairId).BetingType; return(betablePairs.Select(p => new BetedPair { BetedType = GetSelectedTypeOfPair(p.Id), BetablePair = p, BetablePairId = p.Id })); }
public async Task Run() { var data = new DataFactory(); var unitOfWorkMock = new UnitOfWorkMock(); var pair1SelectedQuota = 23; var pair2SelectedQuota = 6; var pair3SelectedQuota = 2; var betablePair1 = data.BetablePair(1, pair1SelectedQuota, -1, -1, new Team(), new Team()); var betablePair2 = data.BetablePair(2, -1, pair2SelectedQuota, -1, new Team(), new Team()); var betablePair3 = data.BetablePair(3, -1, -1, pair3SelectedQuota, new Team(), new Team()); IReadOnlyCollection <BetablePair> betablePairs = new[] { betablePair1, betablePair2, betablePair3 }; var request = new CommitTicketRequest { Stake = 19, BetingPairs = new[] { new CommitTicketRequest.BetingPair { BetedPairId = betablePair1.Id, BetingType = BetingType.Team1Win }, new CommitTicketRequest.BetingPair { BetedPairId = betablePair2.Id, BetingType = BetingType.Team2Win }, new CommitTicketRequest.BetingPair { BetedPairId = betablePair3.Id, BetingType = BetingType.Draw }, } }; var userId = "a"; var currentUserAccessor = TestServicesFactory.CureCurrentUserAccessor(userId); var dataProviderMock = new Mock <IDataProvider>(); dataProviderMock.Setup(dp => dp.BetablePairs(It.IsAny <IEnumerable <int> >())).Returns(Task.FromResult(betablePairs)); var service = new TicketService( Mock.Of <IBonusService>(), unitOfWorkMock.Object, Mock.Of <IWalletService>(), currentUserAccessor, dataProviderMock.Object, Mock.Of <IMapper>()); await service.Handle(request); unitOfWorkMock.Changes.SavedChanges.Should().BeTrue(); var insertedObjects = unitOfWorkMock.Changes.Inserted; insertedObjects.OfType <Ticket>().Should().ContainSingle(); var commitedTicket = insertedObjects.OfType <Ticket>().Single(); var betedPairs = insertedObjects.OfType <BetedPair>().ToArray(); betedPairs.Length.Should().Be(3); void AssertOnPair(int betablePairId, int quota, BetingType type) { var pair = betedPairs.Single(p => p.BetablePairId == betablePairId); pair.GetQuota().Should().Be(quota); pair.BetedType.Should().Be(type); } AssertOnPair(betablePair1.Id, pair1SelectedQuota, BetingType.Team1Win); AssertOnPair(betablePair2.Id, pair2SelectedQuota, BetingType.Team2Win); AssertOnPair(betablePair3.Id, pair3SelectedQuota, BetingType.Draw); commitedTicket.Quota.Should().Be(pair1SelectedQuota * pair2SelectedQuota * pair3SelectedQuota); commitedTicket.UserId.Should().Be(userId); commitedTicket.Stake.Should().Be(request.Stake); }
public Task <IActionResult> Post([FromBody] CommitTicketRequest request) => _safeRunner.Run(() => _ticketService.Handle(request), ticket => Created("", ticket));