using AnalyticsDAL.CustomCode.PerfKPIFeed; using AnalyticsDAL.DTO.PerfKPIFeed; using GB5Shared.DTO.Framework.Login; using GB5Shared.Telemetry; using Microsoft.Extensions.Logging; namespace AnalyticsBLL.PerfKPIFeed; public class PerfKPIFeedBLL : IPerfKPIFeedBLL { private readonly IPerfKPIFeedDAL _dal; private readonly ILogger _logger; public PerfKPIFeedBLL(IPerfKPIFeedDAL dal, ILogger logger) { _dal = dal; _logger = logger; } public async Task IngestAppraisalScoreAsync(AppraisalScoreFinalizedEvent evt, CancellationToken ct) { GB5Trace.Step("ingest-appraisal-score", new { evt.AppraisalId, evt.EmployeeId, evt.TenantId }); var login = BuildLogin(evt.ClientId, evt.DatabaseName, evt.UserId); try { await _dal.IngestAppraisalScoreAsync(evt, login, ct).ConfigureAwait(false); _logger.LogInformation("Appraisal score ingested: AppraisalId {AppraisalId} Employee {EmployeeId}", evt.AppraisalId, evt.EmployeeId); } catch (Exception ex) { GB5Trace.MarkFailed("ingest-appraisal-score-failed", ex); _logger.LogError(ex, "Failed to ingest appraisal score for AppraisalId {AppraisalId}", evt.AppraisalId); throw; } } public async Task IngestOKRCycleAsync(OKRCycleClosedEvent evt, CancellationToken ct) { GB5Trace.Step("ingest-okr-cycle", new { evt.OKRCycleId, evt.TenantId }); var login = BuildLogin(evt.ClientId, evt.DatabaseName, evt.UserId); try { await _dal.IngestOKRCycleAsync(evt, login, ct).ConfigureAwait(false); _logger.LogInformation("OKR cycle ingested: OKRCycleId {OKRCycleId}", evt.OKRCycleId); } catch (Exception ex) { GB5Trace.MarkFailed("ingest-okr-cycle-failed", ex); _logger.LogError(ex, "Failed to ingest OKR cycle for OKRCycleId {OKRCycleId}", evt.OKRCycleId); throw; } } public async Task GetFeedListAsync(short feedSourceType, int employeeId, DateTime periodFrom, DateTime periodTo, LoginDTO login, CancellationToken ct) => await _dal.GetFeedListAsync(feedSourceType, employeeId, periodFrom, periodTo, login, ct).ConfigureAwait(false); private static LoginDTO BuildLogin(int clientId, string databaseName, int userId) => new() { ClientId = clientId, DatabaseName = databaseName, UserId = userId }; }