Пример #1
0
        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)));
        }
Пример #2
0
        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));
        }