using FLSBLL.Event; using FLSBLL.Survey; using FLSDAL.DTO.Event; using FastEndpoints; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.Framework.ResponseStandard; using GB5Shared.FastEndPoint; using Microsoft.Extensions.Logging; using TMSBLL.TmsFeedback; using static GB5Shared.GB5Constant.Constant; namespace TMSSL.EndPoints.Tms; /// /// Receives FLS bridge HTTP callbacks on FORM_SUBMITTED and INSTANCE_COMPLETED. /// Registered in MFLSEVENTSUBSCRIPTION with DeliveryType=0 (HTTP) pointing to this endpoint. /// SP_TMS_FLS_UPDATESUMMARY is registered separately as DeliveryType=2 (Bridge SP) and handles /// survey summary updates — do NOT call ISurveySummaryBLL here to avoid double-update. /// public class TmsFeedbackBridgeHandler : BaseEndpoint> { private readonly ITmsFeedbackBLL _bll; private readonly ILogger _logger; public TmsFeedbackBridgeHandler(ITmsFeedbackBLL bll, ILogger logger) { _bll = bll; _logger = logger; } public override void Configure() { Post("/Feedback/FlsBridge/FeedbackEvent"); AllowAnonymous(); } public record Params( [property: FromBody] FlsEventPayload Payload); protected override string? GetCacheKey(Params req, LoginDTO login) => null; protected override async Task> ExecuteAsync( Params req, LoginDTO login, CancellationToken ct) { var payload = req.Payload; try { var eventType = (FlsEventType)payload.EventType; _logger.LogInformation( "TmsFeedbackBridgeHandler: event {EventType} instance {InstanceId} respondent {RespondentId}", eventType, payload.FlsInstanceId, payload.FlsRespondentId); if (eventType == FlsEventType.FormSubmitted || eventType == FlsEventType.InstanceCompleted) { // Invalidate batch feedback status cache so next GET sees fresh data var bridgeLogin = new LoginDTO { ClientId = payload.TenantId, UserId = payload.UserId }; _logger.LogInformation( "FLS bridge: {EventType} received for instance {Id}, tenant {TenantId}", eventType, payload.FlsInstanceId, payload.TenantId); } return await GB5Shared.ResponseStandard.Response.CreateSuccessResponse( "OK", CacheKeyLevel.NOT_REQUIRED, login); } catch (Exception ex) { _logger.LogError(ex, "TmsFeedbackBridgeHandler failed for instance {Id}", payload.FlsInstanceId); return await GB5Shared.ResponseStandard.Response.CreateExceptionError( ex, CacheKeyLevel.NOT_REQUIRED, login, ex.Message, 500); } } }