public override async Task <TransferResponse> Transfer(TransferRequest request, ServerCallContext context)
        {
            var card = cardsRepository.GetCard(request.CardId);

            if (card == null)
            {
                throw new ArgumentException("Card not found.");
            }

            var blockRequestTime = DateTime.UtcNow;
            var title            = $"{DateTime.UtcNow} card usage for a transfer worth {request.Amount} EUR";

            var transfer = new Transfer
            {
                AccountId = card.AccountId,
                CardId    = card.Id,
                Recipient = request.Recipient,
                Amount    = request.Amount,
                Title     = title
            };
            var transferRequest = new AccountsWriteMicroservice.TransferRequest {
                Transfer = transfer,
            };

            var transferResponse = await accountsClient.TransferAsync(transferRequest, context.RequestHeaders.SelectCustom());

            var block  = cardsRepository.CreateBlock(card.Id, transferResponse.Transaction.Id, blockRequestTime);
            var upsert = new CardsUpsert {
                Block = block
            };

            projectionChannel.Publish(context.RequestHeaders.GetFlowId(), new DataProjection <CardsUpsert, string> {
                Upsert = new[] { upsert }
            });

            return(new TransferResponse {
                Transaction = transferResponse.Transaction
            });
        }
 public async Task Transfer(AccountTransfer data)
 {
     var transfer = mapper.Map<Transfer>(data);
     var request = new TransferRequest { Transfer = transfer };
     await accountsWriteClient.TransferAsync(request, HttpContext.CreateHeadersWithFlowId());
 }