using GB5Shared.DaprCache; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.DTO.Qualifier; using GB5Shared.EntityHandler; using GB5Shared.GB5Library.Qualifier; using GB5Shared.GenerateAutoNumber; using GB5Shared.ListQuery; using GB5Shared.QueryExecutor; using GB5Shared.Resource.Response; using Newtonsoft.Json; using SwDAL.CustomCode.DbModel; using SwDAL.DTO.DbModel; using static GB5Shared.GB5Constant.Constant; namespace SwBLL.DbModel; public class DbModelBLL : IDbModelBLL { private readonly IDbModelDAL _DbModelDAL; private readonly AutoNumber _AutoNumber; private readonly IQueryExecutor _QueryExecutor; private readonly KeyInvalidate _KeyInvalidate; private readonly IListHandler _ListHandler; private readonly BaseEntityAppService _BaseEntityAppService; public DbModelBLL( IDbModelDAL dbModelDAL, AutoNumber autoNumber, IQueryExecutor queryExecutor, KeyInvalidate keyInvalidate, IListHandler listHandler, BaseEntityAppService baseEntityAppService) { _DbModelDAL = dbModelDAL; _AutoNumber = autoNumber; _QueryExecutor = queryExecutor; _KeyInvalidate = keyInvalidate; _ListHandler = listHandler; _BaseEntityAppService = baseEntityAppService; } // ── Read — typed pass-through ───────────────────────────────────────── public async Task GetById(int dbModelId, LoginDTO loginDTO, CancellationToken ct) => await _DbModelDAL.GetById(dbModelId, loginDTO, ct).ConfigureAwait(false); public async Task GetList( CriteriaDTO criteria, string? searchText, int pageOffset, int pageSize, LoginDTO loginDTO, CancellationToken ct = default) { var merged = CriteriaRouterHelper.WithSearchAndPaging(criteria, searchText, pageOffset, pageSize); var c = CriteriaBinder.Bind(merged); var result = await _ListHandler .HandleAsync(new DbModelListQuery(c), loginDTO, ct) .ConfigureAwait(false); return JsonConvert.SerializeObject(result); } public async Task GetSelectListDbModel( int firstNumber, int maxResult, CriteriaDTO criteriaDTO, LoginDTO loginDTO) => await _DbModelDAL.GetSelectListDbModel(firstNumber, maxResult,criteriaDTO, loginDTO) .ConfigureAwait(false); // ── Save (insert or update) ─────────────────────────────────────────── public async Task Save(DbModelDTO dto, LoginDTO loginDTO, CancellationToken ct) { if (dto == null) throw new ArgumentNullException(nameof(dto)); dto.TenantId = loginDTO.ClientId; var Trans = await _QueryExecutor.BeginTransactionAsync(loginDTO); try { bool isNew = dto.DbModelId == 0; if (isNew) { var auto = await _AutoNumber.GetNumberAsync(1, AUTONUMBERCONSTANT.SWDBMODEL, loginDTO); dto.DbModelId = auto.StartNumber; } await _BaseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTSWDBMODEL, EventTypeConstant.SAVEDBMODELEVENTTYPEID, dto, loginDTO, async tx => { _ = isNew ? await _DbModelDAL.SaveDbModel(dto, loginDTO, tx, ct) : await _DbModelDAL.UpdateDbModel(dto, loginDTO, tx, ct); return dto.DbModelId; }, null, -1, -1, Trans); await _QueryExecutor.CommitAsync(Trans); //var cacheKey = KeyGenerator.KeyGeneration( // dto.DbModelId, EntityConstant.OBJECTSWDBMODEL, // CacheKeyLevel.CLIENT_LEVEL, loginDTO); //await _KeyInvalidate.AllInvalidateCache(cacheKey); return isNew ? $"{SuccessResponse.SaveSuccessMessage} {dto.DbModelId}" : $"{SuccessResponse.UpdateSuccessMessage} {dto.DbModelId}"; } catch (Exception) { await _QueryExecutor.RollbackAsync(Trans); throw; } } // ── Delete ──────────────────────────────────────────────────────────── public async Task Delete(int dbModelId, LoginDTO loginDTO, CancellationToken ct) { var Trans = await _QueryExecutor.BeginTransactionAsync(loginDTO); try { await _BaseEntityAppService.ExecuteSaveAsync( EntityConstant.OBJECTSWDBMODEL, EventTypeConstant.DELETEDBMODELEVENTTYPEID, new DbModelDTO { DbModelId = dbModelId, TenantId = loginDTO.ClientId }, loginDTO, async tx => { await _DbModelDAL.DeleteDbModel(dbModelId, loginDTO, tx, ct); return dbModelId; // ✅ return int }, null, -1, -1, Trans); await _QueryExecutor.CommitAsync(Trans); //var cacheKey = KeyGenerator.KeyGeneration( // dbModelId, EntityConstant.OBJECTSWDBMODEL, // CacheKeyLevel.CLIENT_LEVEL, loginDTO); //await _KeyInvalidate.AllInvalidateCache(cacheKey); return SuccessResponse.DeleteSuccessMessage; } catch (Exception) { await _QueryExecutor.RollbackAsync(Trans); throw; } } }