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()); }
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)); }
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()); }