using AnalyticsBLL.PerfKPIFeed; using AnalyticsDAL.DTO.PerfKPIFeed; using Dapr; using Microsoft.AspNetCore.Mvc; namespace AnalyticsSL.Subscriptions; [ApiController] public class PerformanceKPISubscriber : ControllerBase { private readonly IPerfKPIFeedBLL _feedBll; private readonly ILogger _logger; public PerformanceKPISubscriber(IPerfKPIFeedBLL feedBll, ILogger logger) { _feedBll = feedBll; _logger = logger; } [Topic("pubsub", "perm.score.finalized")] [HttpPost("/Analytics/Subscribe/ScoreFinalized")] public async Task HandleScoreFinalizedAsync( [FromBody] AppraisalScoreFinalizedEvent evt, CancellationToken ct) { _logger.LogInformation( "perm.score.finalized received: AppraisalId {AppraisalId} Employee {EmployeeId}", evt.AppraisalId, evt.EmployeeId); try { await _feedBll.IngestAppraisalScoreAsync(evt, ct); return Ok(); } catch (Exception ex) { _logger.LogError(ex, "Failed to process perm.score.finalized for AppraisalId {AppraisalId}", evt.AppraisalId); return StatusCode(500, ex.Message); } } [Topic("pubsub", "okr.cycle.closed")] [HttpPost("/Analytics/Subscribe/OKRCycleClosed")] public async Task HandleOKRCycleClosedAsync( [FromBody] OKRCycleClosedEvent evt, CancellationToken ct) { _logger.LogInformation( "okr.cycle.closed received: OKRCycleId {OKRCycleId} Cycle {CycleName}", evt.OKRCycleId, evt.CycleName); try { await _feedBll.IngestOKRCycleAsync(evt, ct); return Ok(); } catch (Exception ex) { _logger.LogError(ex, "Failed to process okr.cycle.closed for OKRCycleId {OKRCycleId}", evt.OKRCycleId); return StatusCode(500, ex.Message); } } }