Ejemplo n.º 1
0
        public async Task GenerateUserActivityReport(MessageContext context, AggregateUserActivityReportDataEvent inputEvent)
        {
            var accounts = await reportsDataFetcher.GetAccounts(context.FlowId, inputEvent.UserId);

            var accountsIds = accounts.Select(a => a.Id).ToArray();
            var data        = new UserActivityRaportData
            {
                From        = inputEvent.TimestampFrom,
                To          = inputEvent.TimestampTo,
                Granularity = inputEvent.Granularity,
                Accounts    = accounts,
                UserId      = inputEvent.UserId
            };

            var filters = new Filters
            {
                Recipients    = accountsIds.ToHashSet(),
                Senders       = accountsIds.ToHashSet(),
                TimestampFrom = inputEvent.TimestampFrom,
                TimestampTo   = inputEvent.TimestampTo
            };

            var parallelTasks = new List <Task>();

            parallelTasks.Add(Task.Run(() => data.Transactions  = transactionsRepository.GetMany(filters, null)));
            parallelTasks.Add(Task.Run(async() => data.Payments = await reportsDataFetcher.GetPayments(context.FlowId + "_p", accountsIds)));
            parallelTasks.Add(Task.Run(async() => data.Loans    = await reportsDataFetcher.GetLoans(context.FlowId + "_l", accountsIds)));
            parallelTasks.Add(Task.Run(async() => data.Cards    = await reportsDataFetcher.GetCards(context.FlowId + "_c", accountsIds)));
            await Task.WhenAll(parallelTasks);

            var portions = ReportGenerator.AggregateUserActivity(data);

            publishingRouter.Publish(context.ReplyTo, portions, context.FlowId);
        }