public async Task <IActionResult> SendMoneyToCard([FromBody] SendMoneyDto sendMoneyDto) { var userIdHolder = await _userService.GetUserId(User.Identity.Name); if (userIdHolder.Status == DataHolderStatus.Unauthorized) { return(Unauthorized()); } var sendMoneyHolder = await _creditCardService.SendMoneyAsync(sendMoneyDto, new Guid(userIdHolder.Data)); if (sendMoneyHolder.Status == DataHolderStatus.Failure) { return(BadRequest(sendMoneyHolder.Message)); } return(Ok(_mapper.Map <CreditCard, CreditCardDto>(sendMoneyHolder.Data))); }
public async Task <DataHolder <CreditCard> > SendMoneyAsync(SendMoneyDto sendMoneyDto, Guid userId) { var fromCard = await _userRepository .Table .Where(user => user.Id == userId) .SelectMany(user => user.CreditCards) .FirstOrDefaultAsync(card => card.Id == sendMoneyDto.FromCardId); if (fromCard == null) { return(DataHolder <CreditCard> .CreateFailure("Incorrect user id or credit card number")); } var destCard = await _creditCardRepository .Table .FirstOrDefaultAsync(card => card.CardNumber == sendMoneyDto.ToCardNumber); if (destCard == null) { return(DataHolder <CreditCard> .CreateFailure("Invalid destination card number")); } var amount = await _convertCurrencyService.ConvertAsync(sendMoneyDto.Currency, (decimal)sendMoneyDto.Amount); if (!fromCard.SubtractMoney(amount)) { return(DataHolder <CreditCard> .CreateFailure("Not enough money")); } if (!destCard.AddMoney(amount)) { return(DataHolder <CreditCard> .CreateFailure("Exceeded the money limit")); } var updateResult = await _creditCardRepository.UpdateAsync(new List <CreditCard> { fromCard, destCard }); if (updateResult <= 0) { return(DataHolder <CreditCard> .CreateFailure("Can't update balance")); } await _transactionMoneyLogRepository.InsertAsync(new [] { new TransactionMoneyLog { Amount = amount, Currency = sendMoneyDto.Currency, UserFromId = userId, UserToId = destCard.UserId, IsInput = false }, new TransactionMoneyLog { Amount = amount, Currency = sendMoneyDto.Currency, UserFromId = destCard.UserId, UserToId = userId, IsInput = true } }); return(DataHolder <CreditCard> .CreateSuccess(fromCard)); }