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