using System.Runtime.CompilerServices; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.Telemetry; using TMSDAL.CustomCode.Reports.NominationApprovalSlaRegister; using TMSDAL.DTO.Reports; namespace TMSBLL.Reports.NominationApprovalSlaRegister { public class NominationApprovalSlaRegisterBLL : INominationApprovalSlaRegisterBLL { private const int DEFAULT_MAX_RESULT_CAP = 500; private readonly INominationApprovalSlaRegisterDAL _dal; private readonly ITmsReportAccessControlBLL _accessControlBLL; public NominationApprovalSlaRegisterBLL(INominationApprovalSlaRegisterDAL dal, ITmsReportAccessControlBLL accessControlBLL) { _dal = dal; _accessControlBLL = accessControlBLL; } public async Task> GetNominationApprovalSlaRegister( int firstNumber, int maxResult, CriteriaDTO criteriaDTO, int menuId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("parse-criteria-nomination-approval-sla-register", new { firstNumber, maxResult, menuId }); var criteria = TmsReportCriteriaParser.Parse(criteriaDTO); var cappedMaxResult = maxResult > 0 ? Math.Min(maxResult, DEFAULT_MAX_RESULT_CAP) : DEFAULT_MAX_RESULT_CAP; await _accessControlBLL.EnforceAsync(criteria, cappedMaxResult, menuId, login, ct).ConfigureAwait(false); GB5Trace.Step("query-nomination-approval-sla-register", new { firstNumber, cappedMaxResult }); return await _dal.GetNominationApprovalSlaRegister(firstNumber, cappedMaxResult, criteria, login, ct).ConfigureAwait(false); } catch (Exception ex) { GB5Trace.MarkFailed("nomination-approval-sla-register-failed", ex); throw; } } public async IAsyncEnumerable GetNominationApprovalSlaRegisterStream( int firstNumber, int maxResult, CriteriaDTO criteriaDTO, int menuId, LoginDTO login, [EnumeratorCancellation] CancellationToken ct) { GB5Trace.Step("stream-nomination-approval-sla-register", new { firstNumber, maxResult, menuId }); var criteria = TmsReportCriteriaParser.Parse(criteriaDTO); var cappedMaxResult = maxResult > 0 ? Math.Min(maxResult, DEFAULT_MAX_RESULT_CAP) : DEFAULT_MAX_RESULT_CAP; await _accessControlBLL.EnforceAsync(criteria, cappedMaxResult, menuId, login, ct).ConfigureAwait(false); await foreach (var row in _dal.GetNominationApprovalSlaRegisterStream(firstNumber, cappedMaxResult, criteria, login, ct).ConfigureAwait(false)) yield return row; } } }