using System; using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Threading; using System.Threading.Tasks; using AccountsDAL.CustomCode.AccountReports.AccountRegisterSummary; using AccountsDAL.DTO.AccountsReports; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.Telemetry; namespace AccountsBLL.AccountReports.AccountRegisterSummary { public class AccountRegisterSummaryBLL : IAccountRegisterSummaryBLL { private const int DEFAULT_MAX_RESULT_CAP = 500; private readonly IAccountRegisterSummaryDAL _accountRegisterSummaryDAL; private readonly IAccountReportAccessControlBLL _accessControlBLL; public AccountRegisterSummaryBLL(IAccountRegisterSummaryDAL accountRegisterSummaryDAL, IAccountReportAccessControlBLL accessControlBLL) { _accountRegisterSummaryDAL = accountRegisterSummaryDAL; _accessControlBLL = accessControlBLL; } // UI paged result public async Task GetAccountRegisterSummaryReport( int firstNumber, int maxResult, CriteriaDTO criteriaDTO, List sortBy, int menuId, LoginDTO loginDTO, CancellationToken ct = default) { try { GB5Trace.Step("parse-criteria-account-register-summary", new { firstNumber, maxResult, menuId }); var criteria = AccountReportCriteriaParser.Parse(criteriaDTO, loginDTO); var cappedMaxResult = maxResult > 0 ? Math.Min(maxResult, DEFAULT_MAX_RESULT_CAP) : DEFAULT_MAX_RESULT_CAP; await _accessControlBLL.EnforceAsync(criteria, cappedMaxResult, menuId, loginDTO).ConfigureAwait(false); GB5Trace.Step("query-account-register-summary", new { firstNumber, cappedMaxResult }); return await _accountRegisterSummaryDAL .GetAccountRegisterSummaryReport(firstNumber, cappedMaxResult, criteria, sortBy, loginDTO, ct) .ConfigureAwait(false); } catch (Exception ex) { GB5Trace.MarkFailed("account-register-summary-failed", ex); throw; } } // Report export / NDJSON stream public async IAsyncEnumerable GetAccountRegisterSummaryReportStream( int firstNumber, int maxResult, CriteriaDTO criteriaDTO, List sortBy, int menuId, LoginDTO loginDTO, [EnumeratorCancellation] CancellationToken ct = default) { GB5Trace.Step("stream-account-register-summary", new { firstNumber, maxResult, menuId }); var criteria = AccountReportCriteriaParser.Parse(criteriaDTO, loginDTO); var cappedMaxResult = maxResult > 0 ? Math.Min(maxResult, DEFAULT_MAX_RESULT_CAP) : DEFAULT_MAX_RESULT_CAP; await _accessControlBLL.EnforceAsync(criteria, cappedMaxResult, menuId, loginDTO).ConfigureAwait(false); await foreach (var row in _accountRegisterSummaryDAL .GetAccountRegisterSummaryReportStream(firstNumber, cappedMaxResult, criteria, sortBy, loginDTO, ct) .ConfigureAwait(false)) { yield return row; } } } }