using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using IDMSDAL.DTOs; using IDMSDAL.Interfaces; using IDMSBLL.Interfaces; using static GB5Shared.GB5Constant.Constant; using GB5Shared.EntityHandler; namespace IDMSBLL.Implementations; public class SignalBLL : ISignalBLL { private readonly ISignalDAL _SignalDAL; private readonly IQueryExecutor _QueryExecutor; private readonly KeyInvalidate _KeyInvalidate; private readonly BaseEntityAppService _BaseEntityAppService; public SignalBLL( ISignalDAL signalDAL, IQueryExecutor queryExecutor, KeyInvalidate keyInvalidate, BaseEntityAppService baseEntityAppService) { _SignalDAL = signalDAL; _QueryExecutor = queryExecutor; _KeyInvalidate = keyInvalidate; _BaseEntityAppService = baseEntityAppService; } // ── Reads ───────────────────────────────────────────────────────────────── public async Task> GetActiveSignalsAsync( int engagementId, LoginDTO login, CancellationToken ct) { return await _SignalDAL.GetActiveSignalsAsync(engagementId, login, ct) .ConfigureAwait(false); } public async Task GetSignalScoreAsync( int engagementId, LoginDTO login, CancellationToken ct) { return await _SignalDAL.GetSignalScoreAsync(engagementId, login, ct) .ConfigureAwait(false); } // ── Writes ──────────────────────────────────────────────────────────────── public async Task InsertSignalAsync( EngagementSignalDTO dto, LoginDTO login, CancellationToken ct) { if (dto is null) throw new ArgumentNullException(nameof(dto)); if (string.IsNullOrWhiteSpace(dto.SignalType)) throw new ArgumentException("SignalType is required.", nameof(dto)); var Trans = await _QueryExecutor.BeginTransactionAsync(login).ConfigureAwait(false); try { await _BaseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTIDMSSIGNAL, EventTypeConstant.SAVEIDMSSIGNALEVENTTYPEID, dto, login, async tx => { int newId = await _SignalDAL.InsertSignalAsync(dto, login, tx, ct).ConfigureAwait(false); dto.SignalId = newId; return dto.SignalId; }, new Dictionary { { "EngagementId", dto.EngagementId } }, BIZTRANSACTIONCLASSCONSTANT.IDMSSIGNAL, BizTransactionConstant.IDMSSIGNAL, Trans).ConfigureAwait(false); await _QueryExecutor.CommitAsync(Trans).ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration( dto.EngagementId, EntityConstant.OBJECTIDMSSIGNAL, CacheKeyLevel.CLIENT_LEVEL, login); await _KeyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); return SuccessResponse.SaveSuccess; } catch (Exception) { await _QueryExecutor.RollbackAsync(Trans).ConfigureAwait(false); throw; } } public async Task ResolveSignalAsync( int signalId, int resolvedById, LoginDTO login, CancellationToken ct) { var placeholder = new EngagementSignalDTO { SignalId = signalId }; var Trans = await _QueryExecutor.BeginTransactionAsync(login).ConfigureAwait(false); try { await _BaseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTIDMSSIGNAL, EventTypeConstant.SAVEIDMSSIGNALEVENTTYPEID, placeholder, login, async tx => { await _SignalDAL.ResolveSignalAsync( signalId, resolvedById, DateTime.UtcNow, login, tx, ct).ConfigureAwait(false); return signalId; }, null, BIZTRANSACTIONCLASSCONSTANT.IDMSSIGNAL, BizTransactionConstant.IDMSSIGNAL, Trans).ConfigureAwait(false); await _QueryExecutor.CommitAsync(Trans).ConfigureAwait(false); return SuccessResponse.UpdateSuccess; } catch (Exception) { await _QueryExecutor.RollbackAsync(Trans).ConfigureAwait(false); throw; } } }