using System; using System.Data.Common; using System.Linq; using System.Threading; using System.Threading.Tasks; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using Microsoft.Extensions.Logging; namespace GB5Shared.FileUpload { public class AttachmentResolutionService : IAttachmentResolutionService { private readonly IQueryExecutor _qe; private readonly ILogger _logger; // UPDATE TATTACHMENT — set real ObjectId, clear TempRefKey. // Keyed on AttachmentId (returned from the upload response). private const string RESOLVE_OBJECTID = @" UPDATE TATTACHMENT SET OBJECTID = @ObjectId, OBJECTTYPEID = @ObjectTypeId, BIZTRANSACTIONTYPEID = @BizTransactionTypeId, TEMPREFKEY = NULL, MODIFIEDBYID = @ModifiedById, MODIFIEDON = GETUTCDATE() WHERE ATTACHMENTID = @AttachmentId;"; public AttachmentResolutionService( IQueryExecutor qe, ILogger logger) { _qe = qe; _logger = logger; } public async Task ResolveHeaderAsync( AttachmentResolutionEnvelope envelope, int entityId, LoginDTO login, DbTransaction tx, CancellationToken ct = default) { foreach (var mapping in envelope.LevelMappings) mapping.ObjectId = entityId; await ResolveAsync(envelope, login, tx, ct).ConfigureAwait(false); } public async Task ResolveAsync( AttachmentResolutionEnvelope envelope, LoginDTO login, DbTransaction tx, CancellationToken ct = default) { if (envelope is null) throw new ArgumentNullException(nameof(envelope)); var valid = envelope.LevelMappings .Where(m => m.ObjectId > 0 && m.AttachmentIds.Count > 0) .ToList(); if (valid.Count == 0) return; foreach (var map in valid) { foreach (var attachmentId in map.AttachmentIds) { await _qe.ExecuteAsync( login, RESOLVE_OBJECTID, new { AttachmentId = attachmentId, map.ObjectId, map.ObjectTypeId, map.BizTransactionTypeId, ModifiedById = login.UserId }, tx).ConfigureAwait(false); } } _logger.LogInformation( "AttachmentResolution: resolved {Count} level(s) for user {UserId}", valid.Count, login.UserId); } } }