using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.Login; using GB5Shared.EntityHandler; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using PIEDAL.CustomCode.ConfigItem; using PIEDAL.DTO.ConfigItem; using static GB5Shared.GB5Constant.Constant; namespace PIEBLL.ConfigItem; public class PIEConfigItemBLL : IPIEConfigItemBLL { private readonly IPIEConfigItemDAL _PIEConfigItemDAL; private readonly IQueryExecutor _QueryExecutor; private readonly KeyInvalidate _KeyInvalidate; private readonly BaseEntityAppService _BaseEntityAppService; public PIEConfigItemBLL( IPIEConfigItemDAL pieConfigItemDAL, IQueryExecutor queryExecutor, KeyInvalidate keyInvalidate, BaseEntityAppService baseEntityAppService) { _PIEConfigItemDAL = pieConfigItemDAL; _QueryExecutor = queryExecutor; _KeyInvalidate = keyInvalidate; _BaseEntityAppService = baseEntityAppService; } // ── Read ────────────────────────────────────────────────────────────────── public async Task GetPIEConfigItemAsync( Guid configItemId, LoginDTO login, CancellationToken ct) => await _PIEConfigItemDAL.GetPIEConfigItemAsync(configItemId, login, ct).ConfigureAwait(false); // ── Saves ───────────────────────────────────────────────────────────────── public async Task SavePIEConfigItemAsync( PIEConfigItemDTO dto, LoginDTO login, CancellationToken ct) { if (dto is null) throw new ArgumentNullException(nameof(dto)); bool isNew = dto.ConfigItemId == Guid.Empty; if (isNew) dto.ConfigItemId = Guid.NewGuid(); var Trans = await _QueryExecutor.BeginTransactionAsync(login).ConfigureAwait(false); try { await _BaseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTPIECONFIGITEM, isNew ? EventTypeConstant.SAVEPIECONFIGITEMEVENTTYPEID : EventTypeConstant.UPDATEPIECONFIGITEMEVENTTYPEID, dto, login, async tx => { if (isNew) await _PIEConfigItemDAL.SavePIEConfigItemAsync(dto, login, tx, ct); else await _PIEConfigItemDAL.UpdatePIEConfigItemAsync(dto, login, tx, ct); return 0; // PIEConfigItem uses a Guid PK — no int object ID to report back }, null, BIZTRANSACTIONCLASSCONSTANT.PIECONFIGITEM, BizTransactionConstant.PIECONFIGITEM, Trans).ConfigureAwait(false); await _QueryExecutor.CommitAsync(Trans).ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration( dto.ConfigItemId, EntityConstant.OBJECTPIECONFIGITEM, CacheKeyLevel.CLIENT_LEVEL, login); await _KeyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); return isNew ? SuccessResponse.SaveSuccess : SuccessResponse.UpdateSuccess; } catch (Exception ex) { GB5Shared.Telemetry.GB5Trace.MarkFailed("save-pie-config-item-failed", ex); await _QueryExecutor.RollbackAsync(Trans).ConfigureAwait(false); throw; } } public async Task DeletePIEConfigItemAsync( Guid configItemId, LoginDTO login, CancellationToken ct) { var Trans = await _QueryExecutor.BeginTransactionAsync(login).ConfigureAwait(false); try { await _BaseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTPIECONFIGITEM, EventTypeConstant.DELETEPIECONFIGITEMEVENTTYPEID, new PIEConfigItemDTO { ConfigItemId = configItemId }, login, async tx => { await _PIEConfigItemDAL.SoftDeletePIEConfigItemAsync(configItemId, login, tx, ct); return 0; }, null, BIZTRANSACTIONCLASSCONSTANT.PIECONFIGITEM, BizTransactionConstant.PIECONFIGITEM, Trans).ConfigureAwait(false); await _QueryExecutor.CommitAsync(Trans).ConfigureAwait(false); var cacheKey = new CacheKeyGeneration().KeyGeneration( configItemId, EntityConstant.OBJECTPIECONFIGITEM, CacheKeyLevel.CLIENT_LEVEL, login); await _KeyInvalidate.AllInvalidateCache(cacheKey).ConfigureAwait(false); return SuccessResponse.DeleteSuccessMessage; } catch (Exception ex) { GB5Shared.Telemetry.GB5Trace.MarkFailed("delete-pie-config-item-failed", ex); await _QueryExecutor.RollbackAsync(Trans).ConfigureAwait(false); throw; } } }