using CMGMBLL.Interfaces; using Dapr; using GB5Shared.DTO.Framework.Login; using Microsoft.AspNetCore.Mvc; namespace CMGMSL.Subscriptions; [ApiController] public class AppraisalFinalizedSubscriber : ControllerBase { private readonly ICompetencyProfileBLL _profileBll; private readonly ILogger _logger; public AppraisalFinalizedSubscriber( ICompetencyProfileBLL profileBll, ILogger logger) { _profileBll = profileBll; _logger = logger; } [Topic("pubsub", "perm.appraisal.finalized")] [HttpPost("/Competency/Subscribe/AppraisalFinalized")] public async Task HandleAppraisalFinalizedAsync( [FromBody] AppraisalFinalizedEvent evt, CancellationToken ct) { _logger.LogInformation( "perm.appraisal.finalized received: AppraisalId {AppraisalId} EmployeeId {EmployeeId}", evt.AppraisalId, evt.EmployeeId); try { var login = new LoginDTO { ClientId = evt.ClientId, DatabaseName = evt.DatabaseName, UserId = evt.UserId }; await _profileBll.GenerateAllProfilesAsync(evt.EmployeeId, login, ct); return Ok(); } catch (Exception ex) { _logger.LogError(ex, "Failed to process perm.appraisal.finalized for AppraisalId {AppraisalId} EmployeeId {EmployeeId}", evt.AppraisalId, evt.EmployeeId); return StatusCode(500, ex.Message); } } } public sealed class AppraisalFinalizedEvent { public int AppraisalId { get; set; } public int EmployeeId { get; set; } public int OUId { get; set; } public decimal FinalPercentage { get; set; } public string? GradeLetter { get; set; } public DateTime PerformanceFrom { get; set; } public DateTime PerformanceTo { get; set; } public int TenantId { get; set; } public string DatabaseName { get; set; } = string.Empty; public int ClientId { get; set; } public int UserId { get; set; } }