Esempio n. 1
0
        public override async Task <Empty> BatchTransfer(BatchTransferRequest request, Grpc.Core.ServerCallContext context)
        {
            if (request.Transfers.Any(r => !accountsRepository.CanTransfer(r.AccountId, r.Recipient, r.Amount)))
            {
                throw new ArgumentException("Cannot transfer founds.");
            }

            var transferRequests            = request.Transfers.Select(r => CreateRequest(r));
            var batchAddTransactionsRequest = new BatchCreateTransactionRequest
            {
                Requests = { transferRequests }
            };
            var result = await transactionsClient.BatchCreateAsync(batchAddTransactionsRequest, context.RequestHeaders.SelectCustom());

            var affectedAccounts = ApplyBatchToRepository(request).ToArray();

            if (affectedAccounts.Length > 0)
            {
                projectionChannel.Publish(context.RequestHeaders.GetFlowId(), new DataProjection <Models.Account, string> {
                    Upsert = affectedAccounts
                });
            }

            return(new Empty());
        }
Esempio n. 2
0
        private IEnumerable <Models.Account> ApplyBatchToRepository(BatchTransferRequest request)
        {
            var accounts = new Dictionary <string, Models.Account>();

            foreach (var t in request.Transfers)
            {
                accountsRepository.Transfer(t.AccountId, t.Recipient, t.Amount);
                accounts[t.AccountId] = accountsRepository.Get(t.AccountId);
                accounts[t.Recipient] = accountsRepository.Get(t.Recipient);
            }

            return(accounts.Select(a => a.Value));
        }
Esempio n. 3
0
        public override async Task <Empty> BatchTransfer(BatchTransferRequest request, Grpc.Core.ServerCallContext context)
        {
            if (request.Transfers.Any(r => !accountsRepository.CanTransfer(r.AccountId, r.Recipient, r.Amount)))
            {
                throw new ArgumentException("Cannot transfer founds.");
            }

            var transferRequests            = request.Transfers.Select(r => CreateRequest(r));
            var batchAddTransactionsRequest = new BatchCreateTransactionRequest
            {
                Requests = { transferRequests }
            };
            var result = await transactionsClient.BatchCreateAsync(batchAddTransactionsRequest, context.RequestHeaders.SelectCustom());

            foreach (var t in request.Transfers)
            {
                accountsRepository.Transfer(t.AccountId, t.Recipient, t.Amount);
            }
            return(new Empty());
        }