using FastEndpoints; using FrameworkBLL.MessageHubService.TemplateApproval; using FrameworkDAL.DTO.MessageHubService.UpdateHandleStatus; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.Framework.ResponseStandard; using GB5Shared.FastEndPoint; using Microsoft.Extensions.Logging; using System; using System.Threading; using System.Threading.Tasks; using static GB5Shared.GB5Constant.Constant; namespace FrameworkSL.Endpoints.MessageHubService.TemplateApproval { public class UpdateCallApproval : BaseEndpoint> { private readonly ITemplateApprovalBLL _templateApprovalBLL; private readonly ILogger _logger; public UpdateCallApproval(ITemplateApprovalBLL templateApprovalBLL, ILogger logger) { _templateApprovalBLL = templateApprovalBLL ?? throw new ArgumentNullException(nameof(templateApprovalBLL)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public override void Configure() { Post("/TemplateApproval/UpdateApprovalStatus"); AllowAnonymous(); } // ----------------------------- // Request Parameters (POST data) // ----------------------------- public class UpdateApprovalStatusParameters { [FromHeader] public string Login { get; set; } = string.Empty; // Expecting POST JSON like: { "callId":"12345", "choice":"ACCEPT", "remarks":"Accepted" } [FromBody] public CallStatusUpdatePayload Payload { get; set; } = new CallStatusUpdatePayload(); } public class CallStatusUpdatePayload { public string CallId { get; set; } = string.Empty; public string Choice { get; set; } = string.Empty; // ACCEPT / REJECT / FORWARD public string Remarks { get; set; } = string.Empty; public string FlowCode { get; set; } = string.Empty; } // ----------------------------- // Endpoint Execution // ----------------------------- protected override async Task> ExecuteAsync(UpdateApprovalStatusParameters req, LoginDTO loginDTO, CancellationToken ct) { try { var payload = req.Payload; // ----------------------------- // Validate POST data // ----------------------------- if (string.IsNullOrWhiteSpace(payload.CallId)) throw new InvalidOperationException("CallId is required."); if (string.IsNullOrWhiteSpace(payload.Choice)) throw new InvalidOperationException("Choice is required (ACCEPT / REJECT / FORWARD)."); // ----------------------------- // Map POST data to TemplateApprovalDTO // ----------------------------- var templateDto = MapCallPayloadToTemplateDto(payload, loginDTO); // ----------------------------- // Call BLL (EIP Engine / REST / Flow) // ----------------------------- var result = await _templateApprovalBLL.UpdateTemplateApproval(templateDto, loginDTO, templateDto.Platform); _logger.LogInformation("TemplateApprovalBLL completed for CallId={CallId}", payload.CallId); return await GB5Shared.ResponseStandard.Response.CreateSuccessResponse(result, CacheKeyLevel.NOT_REQUIRED, loginDTO); } catch (Exception ex) { _logger.LogError(ex, "Error processing CallApproval for Payload | CallId={CallId} | Choice={Choice}", req.Payload?.CallId, req.Payload?.Choice); return await GB5Shared.ResponseStandard.Response.CreateExceptionError(ex, CacheKeyLevel.NOT_REQUIRED, loginDTO, ex.Message, 500); } } // ----------------------------- // Helper: Map CallStatusUpdatePayload → TemplateApprovalDTO // ----------------------------- private TemplateApprovalDTO MapCallPayloadToTemplateDto(CallStatusUpdatePayload payload, LoginDTO loginDTO) { // Map Choice string to DAL ApprovalAction enum var approvalStatus = payload.Choice.Trim().ToUpper() switch { "ACCEPT" => FrameworkDAL.DTO.MessageHubService.UpdateHandleStatus.ApprovalAction.Accept, "REJECT" => FrameworkDAL.DTO.MessageHubService.UpdateHandleStatus.ApprovalAction.Reject, "FORWARD" => FrameworkDAL.DTO.MessageHubService.UpdateHandleStatus.ApprovalAction.Forward, _ => throw new InvalidOperationException($"Unknown Choice '{payload.Choice}'") }; return new TemplateApprovalDTO { TemplateID = int.TryParse(payload.CallId, out var id) ? id : 0, UserId = loginDTO.UserId.ToString(), ClientId = loginDTO.ClientId.ToString(), RawPayload = $"{payload.Choice}_{payload.CallId}", Remarks = payload.Remarks, Platform = "Postman", ApprovalStatus = approvalStatus, FlowCode = payload.FlowCode }; } } }