using GB5Shared.DTO.Framework.Login; using GB5Shared.Telemetry; using Microsoft.Extensions.Logging; using OKRBLL.Interfaces; using OKRDAL.Interfaces; using System.Text.Json; namespace OKRBLL.Implementations; public class OKRDashboardBLL : IOKRDashboardBLL { private readonly IOKRDashboardDAL _dal; private readonly IGoalDAL _goalDal; private readonly ILogger _logger; public OKRDashboardBLL(IOKRDashboardDAL dal, IGoalDAL goalDal, ILogger logger) { _dal = dal; _goalDal = goalDal; _logger = logger; } public async Task GetOKRDashboardAsync(int okrCycleId, int ouid, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("get-okr-dashboard", new { okrCycleId, ouid }); var objectives = await _dal.GetDashboardObjectivesAsync(okrCycleId, ouid, login, ct).ConfigureAwait(false); return JsonSerializer.Serialize(objectives); } catch (Exception ex) { GB5Trace.MarkFailed("get-okr-dashboard-failed", ex); _logger.LogError(ex, "GetOKRDashboard failed for OKRCycleId {OKRCycleId}", okrCycleId); throw; } } public async Task GetMyOKRDashboardAsync(int okrCycleId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("get-my-okr-dashboard", new { okrCycleId, login.UserId }); // ESS — ouid=0 means filter by EmployeeId in query var objectives = await _dal.GetDashboardObjectivesAsync(okrCycleId, login.UserId, login, ct).ConfigureAwait(false); return JsonSerializer.Serialize(objectives); } catch (Exception ex) { GB5Trace.MarkFailed("get-my-okr-dashboard-failed", ex); _logger.LogError(ex, "GetMyOKRDashboard failed for UserId {UserId}", login.UserId); throw; } } public async Task GetStatusDistributionAsync(int okrCycleId, int forLevel, int forObjectId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("get-status-distribution", new { okrCycleId }); var bands = await _dal.GetStatusDistributionAsync(okrCycleId, forLevel, forObjectId, login, ct).ConfigureAwait(false); return JsonSerializer.Serialize(bands); } catch (Exception ex) { GB5Trace.MarkFailed("get-status-distribution-failed", ex); _logger.LogError(ex, "GetStatusDistribution failed for OKRCycleId {OKRCycleId}", okrCycleId); throw; } } public async Task GetPerspectiveBreakdownAsync(int okrCycleId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("get-perspective-breakdown", new { okrCycleId }); var bands = await _dal.GetPerspectiveBreakdownAsync(okrCycleId, login, ct).ConfigureAwait(false); return JsonSerializer.Serialize(bands); } catch (Exception ex) { GB5Trace.MarkFailed("get-perspective-breakdown-failed", ex); _logger.LogError(ex, "GetPerspectiveBreakdown failed for OKRCycleId {OKRCycleId}", okrCycleId); throw; } } }