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 OKRTrendBLL : IOKRTrendBLL { private readonly IGoalTrackDAL _trackDal; private readonly IGoalDAL _goalDal; private readonly ILogger _logger; public OKRTrendBLL(IGoalTrackDAL trackDal, IGoalDAL goalDal, ILogger logger) { _trackDal = trackDal; _goalDal = goalDal; _logger = logger; } public async Task GetGoalProgressTrendAsync(int goalId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("get-goal-trend", new { goalId }); var history = await _trackDal.GetTrackHistoryAsync(goalId, login, ct).ConfigureAwait(false); return JsonSerializer.Serialize(history); } catch (Exception ex) { GB5Trace.MarkFailed("get-goal-trend-failed", ex); _logger.LogError(ex, "GetGoalProgressTrend failed for GoalId {GoalId}", goalId); throw; } } public async Task GetOKRCycleTrendAsync(int employeeId, int okrCycleId, LoginDTO login, CancellationToken ct) { try { GB5Trace.Step("get-okrcycle-trend", new { employeeId, okrCycleId }); // Load all goals for this employee in the cycle, then fetch track history for each var goals = await _goalDal.GetGoalListAsync(okrCycleId, 0, employeeId, -1, 1, 500, login, ct).ConfigureAwait(false); var result = new List(); foreach (var goal in goals) { var history = await _trackDal.GetTrackHistoryAsync(goal.GoalId, login, ct).ConfigureAwait(false); result.Add(new { goal.GoalId, goal.Name, History = history }); } return JsonSerializer.Serialize(result); } catch (Exception ex) { GB5Trace.MarkFailed("get-okrcycle-trend-failed", ex); _logger.LogError(ex, "GetOKRCycleTrend failed for EmployeeId {EmployeeId} OKRCycleId {OKRCycleId}", employeeId, okrCycleId); throw; } } }