public override async Task <AggregateUserActivityResponse> AggregateUserActivity(AggregateUserActivityRequest request, ServerCallContext context) { var headers = context.RequestHeaders.SelectCustom(); var accounts = await dataFetcher.GetAccounts(headers, request.UserId); var accountsIds = accounts.Select(a => a.Id).ToArray(); var data = new UserActivityRaportData { From = request.TimestampFrom.ToDateTime(), To = request.TimestampTo.ToDateTime(), Granularity = request.Granularity, Accounts = accounts, UserId = request.UserId }; var parallelTasks = new List <Task>(); parallelTasks.Add(Task.Run(async() => data.Transactions = await dataFetcher.GetAccountsTransactions(headers, accountsIds, request.TimestampFrom, request.TimestampTo))); parallelTasks.Add(Task.Run(async() => { var paymentsAndLoans = await dataFetcher.GetPaymentsWithLoans(headers, accountsIds); data.Payments = paymentsAndLoans.Payments; data.Loans = paymentsAndLoans.Loans; })); parallelTasks.Add(Task.Run(async() => data.Cards = await dataFetcher.GetCards(headers, accountsIds))); await Task.WhenAll(parallelTasks); var report = ReportGenerator.AggregateUserActivity(data); return(new AggregateUserActivityResponse { Report = report }); }
public static string AggregateUserActivity(UserActivityRaportData data) { var withTimestamps = data.Transactions.Select(t => new TransactionWithTimestamp { Timestamp = t.Timestamp.ToDateTime(), Transaction = t }); var accountsPortion = data.Accounts.SelectMany(a => AggregateUserAccountsTransactions(a, withTimestamps, data.Granularity)).ToArray(); var cardsTransactions = withTimestamps.Where(t => t.Transaction.CardId != null); var cardsPortion = data.Cards.SelectMany(c => AggregateUserCardTransactions(c, cardsTransactions, data.Granularity)).ToArray(); var paymentsTransactions = withTimestamps.Where(t => t.Transaction.PaymentId != null); var paymentsPortion = data.Payments.SelectMany(p => AggregateUserPaymentsTransactions(p, paymentsTransactions, data.Granularity)).ToArray(); var loansPortion = data.Loans.SelectMany(l => AggregateUserLoansTransactions(l, paymentsTransactions, data.Granularity)).ToArray(); return(ReportCsvSerializer.SerializerUserActivityReport(data, accountsPortion, cardsPortion, paymentsPortion, loansPortion)); }
public static string SerializerUserActivityReport(UserActivityRaportData data, UserReportPortion[] accountsPortions, UserReportPortion[] cardsPortions, UserReportPortion[] paymentsPortions, UserReportPortion[] loansPortions) { var sb = new StringBuilder(); sb.AppendLine($"Raport aktywności użytkownika; {data.UserId}"); sb.AppendLine($"Zakres od; {data.From?.ToString() ?? "-"}"); sb.AppendLine($"Zakres do; {data.To?.ToString() ?? "-"}"); sb.AppendLine($"Granularność; {data.Granularity}"); sb.WriteAccountsData(accountsPortions.ToArray()); sb.WriteCardsData(cardsPortions.ToArray()); sb.WritePaymentsData(paymentsPortions.ToArray()); sb.WriteLoansData(loansPortions.ToArray()); return(sb.ToString()); }