using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using AdminDAL.DTO.Datawarehouse; using AdminDAL.Query.DataWareHouse; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using GB5Shared.Validation; using Newtonsoft.Json; namespace AdminDAL.CustomCode.DataWareHouse { public class DataWareHouseDAL : IDataWareHouseDAL { private readonly IQueryExecutor _QueryExecutor; private readonly IValidation _Validation; public DataWareHouseDAL(IQueryExecutor IQueryExecutor, IValidation IValidation) { _QueryExecutor = IQueryExecutor; _Validation = IValidation; } public async Task GetDataWareHouse(int DataWareHouseId, LoginDTO LoginDTO) { try { string sql = DataWareHouseQB.GET_DATAWAREHOUSE; var parameters = new { datawarehouseid = DataWareHouseId }; var DataWareHouseDict = new Dictionary(); var result = await _QueryExecutor.QueryMultiMapAsync( LoginDTO, sql, (parent, child) => { if (!DataWareHouseDict.TryGetValue(parent.DataWareHouseId, out var existingParent)) { existingParent = parent; existingParent.DataWareHouseDetailArray = new List(); DataWareHouseDict[parent.DataWareHouseId] = existingParent; } if (child != null && child.DataWareHouseDetailId != 0) { existingParent.DataWareHouseDetailArray.Add(child); } return existingParent; }, parameters, splitOn: "DataWareHouseDetailId" ); var finalResult = DataWareHouseDict.Values.FirstOrDefault(); return JsonConvert.SerializeObject(finalResult); } catch (Exception ex) { throw new Exception($"Failed to retrieve DataWareHouse data: {ex.Message}", ex); } } public async Task GetSelectListDataWareHouse(CriteriaDTO CriteriaDTO, LoginDTO LoginDTO) { try { string SQL = DataWareHouseQB.GET_SELECTLIST_DATAWAREHOUSE; var Result = await _QueryExecutor.QueryAsync(LoginDTO, SQL, null!); string Json = JsonConvert.SerializeObject(Result); return Json; } catch (Exception) { throw; } } public async Task SaveDataWareHouse(DataWareHouseDTO dto, LoginDTO login, CancellationToken ct) { await using var tx = await _QueryExecutor.BeginTransactionAsync(login).ConfigureAwait(false); try { var savedId = await _QueryExecutor.ExecuteScalarAsync( login, DataWareHouseQB.SAVE_DATAWAREHOUSE, new { dto.DataWareHouseId, dto.DataWareHouseCode, dto.DataWareHouseName, dto.DataWareHouseObjectNames, dto.DataWareHouseUpdateFrequency, dto.DataWareHouseSortOrder, dto.DataWareHouseStatus, dto.DataWareHouseSourceType, dto.DataWareHouseRemarks, dto.DataWareHouseCreatedById, dto.DataWareHouseModifiedById }, transaction: tx).ConfigureAwait(false); await _QueryExecutor.ExecuteAsync( login, DataWareHouseQB.DELETE_DATAWAREHOUSE_DETAILS, new { DataWareHouseId = savedId }, transaction: tx, cancellationToken: ct).ConfigureAwait(false); if (dto.DataWareHouseDetailArray?.Count > 0) { foreach (var detail in dto.DataWareHouseDetailArray) { await _QueryExecutor.ExecuteAsync( login, DataWareHouseQB.SAVE_DATAWAREHOUSE_DETAIL, new { DataWareHouseId = savedId, detail.DataWareHouseDetailSlNo, detail.DataWareHouseDetailDescription, detail.DataWareHouseDetailRunOrder, detail.DataWareHouseDetailQuery, detail.DataWareHouseDetailIsRuntimeRequired }, transaction: tx, cancellationToken: ct).ConfigureAwait(false); } } await tx.CommitAsync(ct).ConfigureAwait(false); return JsonConvert.SerializeObject(savedId); } catch { await tx.RollbackAsync(ct).ConfigureAwait(false); throw; } } public async Task DeleteDataWareHouse(int dataWareHouseId, LoginDTO login, CancellationToken ct) { await using var tx = await _QueryExecutor.BeginTransactionAsync(login).ConfigureAwait(false); try { await _QueryExecutor.ExecuteAsync( login, DataWareHouseQB.DELETE_DATAWAREHOUSE_DETAILS, new { DataWareHouseId = dataWareHouseId }, transaction: tx, cancellationToken: ct).ConfigureAwait(false); await _QueryExecutor.ExecuteAsync( login, DataWareHouseQB.DELETE_DATAWAREHOUSE, new { DataWareHouseId = dataWareHouseId }, transaction: tx, cancellationToken: ct).ConfigureAwait(false); await tx.CommitAsync(ct).ConfigureAwait(false); return JsonConvert.SerializeObject(dataWareHouseId); } catch { await tx.RollbackAsync(ct).ConfigureAwait(false); throw; } } } }