using AmpDAL.DTO.API; using AMPDAL.Query.API; using GB5Shared.DTO.Framework.Criteria; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using Newtonsoft.Json; namespace AmpDAL.CustomCode.API; public class APIDAL(IQueryExecutor _qe) : IAPIDAL { public async Task GetAPIAsync(long APIId, int tenantId, LoginDTO login, CancellationToken ct) => await _qe.QuerySingleAsync( login, APIQB.GET_API, new { APIId = APIId, TenantId = tenantId }).ConfigureAwait(false); public async Task> GetAPISelectListAsync( CriteriaDTO criteriaDTO, LoginDTO login, CancellationToken ct) { var result = await _qe.QueryAsync( login, APIQB.GET_API_SELECT_LIST, new { TenantId = login.ClientId }, null, false, ct ); return result.ToList(); } public async Task> GetPagedList( int firstNumber, int maxResult, LoginDTO login, CancellationToken ct) { var result = await _qe.QueryAsync( login, APIQB.GET_API_LIST_PAGED, new { FirstNumber = firstNumber, MaxResult = maxResult, TenantId = login.ClientId }, null, false, ct ); return result.ToList(); // ✅ FIX } // Executes all-data query — called by BLL when all-data mode public async Task> GetAllList( LoginDTO login, CancellationToken ct) { var result = await _qe.QueryAsync( login, APIQB.GET_API_LIST_ALL, new { TenantId = login.ClientId }, null, // transaction false, // useReadUncommitted ct // ✅ correct position for cancellationToken ); return result.ToList(); // ✅ convert IEnumerable → List } // Executes count query — called by BLL when count is needed public Task GetCount( LoginDTO login, CancellationToken ct) { return _qe.ExecuteScalarAsync( login, APIQB.GET_API_COUNT, null, cancellationToken: ct); } public async Task DeleteById(int mapId, LoginDTO login, CancellationToken ct) { return await _qe.ExecuteAsync( login, APIQB.DELETE_API, new { ApiId = mapId, TenantId = login.ClientId }); } public async Task SaveAPIAsync(APISaveDTO dto, LoginDTO login, CancellationToken ct) { var param = new { dto.ApiId, TenantId = login.ClientId, dto.ApiKey, dto.ApiName, dto.Description, dto.ApiKind, dto.ApiType, dto.Criticality, dto.LifecycleStatus, dto.VisibilityLevel, dto.ApiProviderType, dto.ExposureType, dto.IsHeadlessEnabled, dto.OwnerTeam, dto.BusinessOwner, dto.RuntimeType, dto.Technology, dto.RepoUrl, dto.PipelineRef, dto.ProviderId, dto.CategoryId, dto.ApiDomainId, dto.Geography, dto.RegulatoryImpact, dto.RiskRating, dto.SlaReference, dto.Remarks, dto.AboutApi, dto.KeyFeatures, dto.UseCases, dto.QuickStart, dto.SortOrder, dto.Status, dto.Version, dto.SourceType, CreatedById = login.UserId, ModifiedById = login.UserId }; return await _qe.ExecuteScalarAsync( login, APIQB.SAVE_API, param ).ConfigureAwait(false); } public async Task UpdateAPIAsync(APISaveDTO dto, LoginDTO login, CancellationToken ct) { dto.TenantId = login.ClientId; dto.ModifiedById = login.UserId; await _qe.ExecuteAsync( login, APIQB.UPDATE_API, new { dto.ApiId, dto.TenantId, dto.ApiKey, dto.ApiName, dto.Description, dto.ApiKind, dto.ApiType, dto.Criticality, dto.LifecycleStatus, dto.VisibilityLevel, dto.ApiProviderType, dto.ExposureType, dto.IsHeadlessEnabled, dto.OwnerTeam, dto.BusinessOwner, dto.RuntimeType, dto.Technology, dto.RepoUrl, dto.PipelineRef, dto.ProviderId, dto.CategoryId, // ✅ NEW FIELD dto.ApiDomainId, dto.Geography, dto.RegulatoryImpact, dto.RiskRating, dto.SlaReference, dto.Remarks, // ✅ NEW CONTENT FIELDS dto.AboutApi, dto.KeyFeatures, dto.UseCases, dto.QuickStart, dto.SortOrder, dto.Status, dto.Version, dto.SourceType, dto.ModifiedById }).ConfigureAwait(false); return dto.ApiId; } public async Task UpdateLifecycleAsync(long APIId, int tenantId, int lifecycleStatus, int ModifiedById, LoginDTO login, CancellationToken ct) => await _qe.ExecuteAsync( login, APIQB.UPDATE_LIFECYCLE, new { APIId = APIId, TenantId = tenantId, LifecycleStatus = lifecycleStatus, ModifiedById = ModifiedById }).ConfigureAwait(false); }