public async Task <Card[]> GetCards(Metadata headers, string[] accountsIds)
        {
            var request = new GetCardsRequest {
                Ids = { accountsIds }
            };
            var response = await cardsClient.GetByAccountsAsync(request, headers);

            return(response.Cards.ToArray());
        }
        public override async Task <GetPanelResponse> Get(GetPanelRequest request, ServerCallContext context)
        {
            RepeatedField <Loan>        loans        = new RepeatedField <Loan>();
            RepeatedField <Payment>     payments     = new RepeatedField <Payment>();
            RepeatedField <Account>     accounts     = new RepeatedField <Account>();
            RepeatedField <Card>        cards        = new RepeatedField <Card>();
            RepeatedField <Transaction> transactions = new RepeatedField <Transaction>();

            var accountsResponse = await accountsClient.GetUserAccountsAsync(new GetUserAccountsRequest { UserId = request.UserId }, context.RequestHeaders.SelectCustom());

            var accountsIds = accountsResponse.Accounts.Select(a => a.Id).ToArray();

            accounts = accountsResponse.Accounts;

            if (accounts.Any())
            {
                var parallelTasks = new List <Task>();
                parallelTasks.Add(Task.Run(async() =>
                {
                    var transactionsResponse = await transactionsClient.FilterAsync(
                        new FilterTransactionsRequest {
                        Senders = { accountsIds }, Top = PanelTransactionsCount
                    }
                        , context.RequestHeaders.SelectCustom());
                }));

                parallelTasks.Add(Task.Run(async() =>
                {
                    var paymentsAndLoans = await paymentsClient.GetByAccountsAsync(new GetPaymentsRequest {
                        Ids = { accountsIds }
                    }, context.RequestHeaders.SelectCustom());
                    loans    = paymentsAndLoans.Loans;
                    payments = paymentsAndLoans.Payments;
                }));

                parallelTasks.Add(Task.Run(async() =>
                {
                    var cardsResponse = await cardsClient.GetByAccountsAsync(new GetCardsRequest {
                        Ids = { accountsIds }
                    }, context.RequestHeaders.SelectCustom());
                    cards = cardsResponse.Cards;
                }));


                await Task.WhenAll(parallelTasks);
            }

            return(new GetPanelResponse
            {
                Cards = { cards },
                Payments = { payments },
                Accounts = { accounts },
                Loans = { loans },
                Transactions = { transactions.OrderByDescending(t => t.Timestamp) }
            });
        }