예제 #1
0
        public async Task <TransferOutput> Handle(
            TransferCommand command,
            CancellationToken token)
        {
            var validationResult = await new TransferValidation()
                                   .ValidateAsync(
                command,
                token);

            if (!validationResult.IsValid)
            {
                return(new TransferOutput(
                           null,
                           null,
                           validationResult));
            }

            var idsForCheck = new List <Guid>
            {
                (Guid)command.AccountNumberFrom,
                (Guid)command.AccountNumberTo
            };

            var(areExist, ids) = await _read
                                 .AreExist(
                idsForCheck,
                token);

            if (!areExist)
            {
                _logger.LogError($"Accounts with " +
                                 $"{ids.Select(s=>s)} " +
                                 "account numbers doesn't exist");
                throw new AccountNotExistException(
                          $"Accounts with " +
                          $"{ids.Select(s => s.ToString())}" +
                          " accounts number doesn't exist");
            }

            var accounts = await _read
                           .GetList(
                idsForCheck,
                token);

            accounts.ForEach(ac =>
            {
                if (ac.AccountNumber
                    == command.AccountNumberFrom)
                {
                    ac.Withdraw((decimal)command.Amount);
                }
                ac.Deposit((decimal)command.Amount);
            });

            await _write
            .UnitOfWork
            .SaveEntitiesAsync(token);

            var sourceAccount = accounts
                                .FirstOrDefault(ac => ac.AccountNumber == command.AccountNumberFrom);

            return(new TransferOutput(
                       sourceAccount.AccountNumber,
                       sourceAccount.Balance,
                       validationResult));
        }