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);
}
}
}