using FrameworkBLL.Attachment;
using GB5Shared.DTO.PubSub;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Threading;
using System.Threading.Tasks;
namespace FrameworkSL.Controllers.Attachment
{
///
/// Dapr pub/sub subscriber for the "ATTACHMENT-RESOLVE" topic.
///
/// Receives a message whenever an outbox event carries a HeaderRowGuid, then
/// executes SP_RESOLVE_ATTACHMENTS_BATCH to update TATTACHMENT rows that were
/// uploaded before the header entity existed (OBJECTID=0, ROWGUID set) and
/// link them to the now-persisted entity PKs.
///
/// Subscription registered by DaprSubscribeController (GET /dapr/subscribe)
/// via DaprSubscriptionBLL.
///
[ApiController]
public class AttachmentResolveSubscribeController : ControllerBase
{
private readonly IAttachmentResolveSubBLL _bll;
private readonly ILogger _logger;
public AttachmentResolveSubscribeController(
IAttachmentResolveSubBLL bll,
ILogger logger)
{
_bll = bll;
_logger = logger;
}
[HttpPost("/attachment/resolve")]
public async Task HandleAttachmentResolve(
[FromBody] AttachmentResolveMessage message,
CancellationToken ct)
{
_logger.LogInformation(
"[attachment-resolve] Received | TenantId={TenantId} | ObjectHeaderTypeId={ObjectHeaderTypeId} | HeaderRowGuid={HeaderRowGuid} | ObjectId={ObjectId}",
message.TenantId, message.ObjectHeaderTypeId, message.HeaderRowGuid, message.ObjectId);
try
{
await _bll.ResolveAsync(message, ct).ConfigureAwait(false);
_logger.LogInformation(
"[attachment-resolve] ACK | TenantId={TenantId} | ObjectId={ObjectId} | HeaderRowGuid={HeaderRowGuid}",
message.TenantId, message.ObjectId, message.HeaderRowGuid);
return Ok(); // 200 = ACK to Dapr
}
catch (Exception ex)
{
_logger.LogError(ex,
"[attachment-resolve] NACK (Dapr will retry) | TenantId={TenantId} | ObjectId={ObjectId} | HeaderRowGuid={HeaderRowGuid} | Error={Error}",
message.TenantId, message.ObjectId, message.HeaderRowGuid, ex.Message);
return StatusCode(500); // 500 = NACK → Dapr retries
}
}
}
}