public async Task <IActionResult> UpdateAsync(int transactionId, TransactionInputDto inputModel)
        {
            _logger.LogInformation($"{nameof(TransactionsController)}: {nameof(UpdateAsync)} was called for {transactionId}.");

            var accessKey = _currentUserService.AccessKey;

            var transaction = await _transactionsService.GetTransaction(transactionId, accessKey);

            if (transaction == null)
            {
                return(NotFound(transactionId));
            }

            var transactionDomainModel = _mapper.Map <TransactionDomainModel>(inputModel);

            var modelState = _transactionsService.ValidateTransaction(transactionDomainModel);

            if (!modelState.IsValid)
            {
                return(UnprocessableEntity(modelState));
            }

            transactionDomainModel.AccessKey = accessKey;

            _mapper.Map(transactionDomainModel, transaction, typeof(TransactionDomainModel), typeof(TransactionDomainModel));

            await _transactionsService.UpdateTransaction(transaction);

            return(NoContent());
        }
        /// <summary>
        /// Создание нового перевода
        /// </summary>
        /// <param name="transactionInputDto"></param>
        /// <returns></returns>
        public TransactionInfoDto Create(TransactionInputDto transactionInputDto)
        {
            var recipientUserId = transactionInputDto.RecipientUserId;
            var amount          = transactionInputDto.Amount;

            var currentBalance = GetBalance();

            if (amount > currentBalance)
            {
                throw new UserFriendlyException("Суммы на счёте недостаточно для перевода");
            }

            var recipientUser = _userRepository.Get(recipientUserId);

            if (AbpSession.UserId == null)
            {
                throw new UserFriendlyException("Текущий пользователь не найден");
            }

            var creator = _userRepository.Get(AbpSession.UserId.Value);

            if (creator.Id == recipientUser.Id)
            {
                throw new UserFriendlyException("Невозможно выполнить перевод этому же пользователю");
            }

            var transaction = new Transaction()
            {
                Amount        = amount,
                CreatorUser   = creator,
                RecipientUser = recipientUser,
                Type          = -1
            };

            var id = _transactionRepository.InsertAndGetId(transaction);

            transaction = _transactionRepository.Get(id);

            _notificationPublisher.Publish("BalanceChanged",
                                           new BalanceChangedNotificationData(_transactionRepository.GetCurrentBalance(creator.Id)),
                                           userIds: new[]
            {
                new UserIdentifier(creator.TenantId, creator.Id)
            });
            _notificationPublisher.Publish("BalanceChanged",
                                           new BalanceChangedNotificationData(_transactionRepository.GetCurrentBalance(recipientUser.Id)),
                                           userIds: new[]
            {
                new UserIdentifier(creator.TenantId, recipientUser.Id)
            });

            return(Mapper.Map <TransactionInfoDto>(transaction));
        }
        public async Task <IActionResult> CreateAsync(TransactionInputDto inputModel)
        {
            _logger.LogInformation($"{nameof(TransactionsController)}: {nameof(CreateAsync)} was called.");

            var transactionDomainModel = _mapper.Map <TransactionDomainModel>(inputModel);

            var modelState = _transactionsService.ValidateTransaction(transactionDomainModel);

            if (!modelState.IsValid)
            {
                return(UnprocessableEntity(modelState));
            }

            transactionDomainModel.AccessKey = _currentUserService.AccessKey;

            transactionDomainModel = await _transactionsService.CreateTransaction(transactionDomainModel);

            var transactionDto = _mapper.Map <TransactionDto>(transactionDomainModel);

            if (_mediaTypeService.IsLinkedRepresentation(_mediaType))
            {
                var linkedTransactionDto = new LinkedTransactionDto
                {
                    Transaction = transactionDto,
                    Links       = CreateLinksForTransaction(transactionDto.TransactionId)
                };

                return(CreatedAtAction(
                           nameof(GetAsync),
                           new { transactionId = transactionDto.TransactionId },
                           transactionDto));
            }
            else
            {
                return(CreatedAtAction(
                           nameof(GetAsync),
                           new { transactionId = transactionDto.TransactionId },
                           transactionDto));
            }
        }