using System.Runtime.CompilerServices; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.Telemetry; using RecruitmentDAL.CustomeCode.Reports.CandidateSourceQuality; using RecruitmentDAL.DTO.Reports; namespace RecruitmentBLL.Reports.CandidateSourceQuality { // Phase 5 analytics — source-quality report. Whole-tenant aggregate grouped by // Candidate.Source; CriteriaDTO is accepted for API-shape consistency with the other two // reports (and future SearchKeyword/date-range filters) but is not currently used to narrow // this report — see CandidateSourceQualityDTO's doc comment for the bounded row-count reason. public class CandidateSourceQualityBLL : ICandidateSourceQualityBLL { private const int DEFAULT_MAX_RESULT_CAP = 500; private readonly ICandidateSourceQualityDAL _dal; public CandidateSourceQualityBLL(ICandidateSourceQualityDAL dal) { _dal = dal; } public async Task> GetCandidateSourceQuality( int firstNumber, int maxResult, CriteriaDTO? criteriaDTO, LoginDTO login, CancellationToken ct) { try { var cappedMaxResult = maxResult > 0 ? Math.Min(maxResult, DEFAULT_MAX_RESULT_CAP) : DEFAULT_MAX_RESULT_CAP; GB5Trace.Step("query-candidate-source-quality", new { firstNumber, cappedMaxResult }); return await _dal.GetCandidateSourceQuality(firstNumber, cappedMaxResult, login, ct).ConfigureAwait(false); } catch (Exception ex) { GB5Trace.MarkFailed("candidate-source-quality-failed", ex); throw; } } public async IAsyncEnumerable GetCandidateSourceQualityStream( int firstNumber, int maxResult, CriteriaDTO? criteriaDTO, LoginDTO login, [EnumeratorCancellation] CancellationToken ct) { GB5Trace.Step("stream-candidate-source-quality", new { firstNumber, maxResult }); await foreach (var row in _dal.GetCandidateSourceQualityStream(login, ct).ConfigureAwait(false)) yield return row; } } }