using FrameworkDAL.DTO.EIPConversation; using FrameworkDAL.Query.EIPConversation.EIPRestActionCfgAdmin; using GB5Shared.DTO.Framework.Login; using GB5Shared.GenerateAutoNumber; using GB5Shared.QueryExecutor; using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using static GB5Shared.GB5Constant.Constant; namespace FrameworkDAL.CustomCode.EIPConversation.EIPRestActionCfgAdmin { public class EIPRestActionCfgAdminDAL : IEIPRestActionCfgAdminDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; private readonly ILogger _logger; public EIPRestActionCfgAdminDAL(IQueryExecutor qe, AutoNumber autoNumber, ILogger logger) { _qe = qe ?? throw new ArgumentNullException(nameof(qe)); _autoNumber = autoNumber ?? throw new ArgumentNullException(nameof(autoNumber)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public async Task> GetCfgListAsync( int actionId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | GetCfgList | Tenant={TenantId} | ActionId={Id}", login.ClientId, actionId); var result = await _qe.QueryAsync( login, EIPRestActionCfgAdminQB.GET_CFG_LIST, new { ActionId = actionId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); return result ?? []; } catch (OperationCanceledException) { _logger.LogWarning("DAL | GetCfgList | Cancelled | ActionId={Id}", actionId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | GetCfgList | Error | ActionId={Id}", actionId); throw; } } public async Task GetCfgAsync( int restActionCfgId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | GetCfg | Tenant={TenantId} | Id={Id}", login.ClientId, restActionCfgId); return await _qe.QuerySingleAsync( login, EIPRestActionCfgAdminQB.GET_CFG, new { RestActionCfgId = restActionCfgId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | GetCfg | Cancelled | Id={Id}", restActionCfgId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | GetCfg | Error | Id={Id}", restActionCfgId); throw; } } public async Task InsertCfgAsync( EIPRestActionCfgAdminDTO dto, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | InsertCfg | Tenant={TenantId} | ActionId={ActId}", login.ClientId, dto.ActionId); // RESTACTIONCFGID is a plain INT PK (not IDENTITY) — must be generated here. var auto = await _autoNumber.GetNumberAsync(1, AUTONUMBERCONSTANT.EIPRESTACTIONCFG, login) .ConfigureAwait(false); var newId = auto.StartNumber; await _qe.ExecuteAsync( login, EIPRestActionCfgAdminQB.INSERT_CFG, new { RestActionCfgId = newId, TenantId = login.ClientId, dto.ActionId, dto.HttpMethod, dto.EndpointPath, dto.PayloadTemplate, dto.HeadersJson, dto.TimeoutSeconds, dto.ConfigVersion, dto.IsActive, dto.Version, CreatedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); _logger.LogInformation("DAL | InsertCfg | Completed | NewId={NewId}", newId); return newId; } catch (OperationCanceledException) { _logger.LogWarning("DAL | InsertCfg | Cancelled | ActionId={Id}", dto.ActionId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | InsertCfg | Error | ActionId={Id}", dto.ActionId); throw; } } public async Task UpdateCfgAsync( EIPRestActionCfgAdminDTO dto, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | UpdateCfg | Tenant={TenantId} | Id={Id}", login.ClientId, dto.RestActionCfgId); await _qe.ExecuteAsync( login, EIPRestActionCfgAdminQB.UPDATE_CFG, new { dto.RestActionCfgId, TenantId = login.ClientId, dto.ActionId, dto.HttpMethod, dto.EndpointPath, dto.PayloadTemplate, dto.HeadersJson, dto.TimeoutSeconds, dto.ConfigVersion, dto.IsActive, dto.Version, ModifiedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | UpdateCfg | Cancelled | Id={Id}", dto.RestActionCfgId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | UpdateCfg | Error | Id={Id}", dto.RestActionCfgId); throw; } } public async Task DeleteCfgAsync( int restActionCfgId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | DeleteCfg | Tenant={TenantId} | Id={Id}", login.ClientId, restActionCfgId); await _qe.ExecuteAsync( login, EIPRestActionCfgAdminQB.DELETE_CFG, new { RestActionCfgId = restActionCfgId, TenantId = login.ClientId, ModifiedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | DeleteCfg | Cancelled | Id={Id}", restActionCfgId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | DeleteCfg | Error | Id={Id}", restActionCfgId); throw; } } public async Task ActionIdExistsAsync(int actionId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); var count = await _qe.ExecuteScalarAsync( login, EIPRestActionCfgAdminQB.EXISTS_ACTIONID, new { ActionId = actionId }, cancellationToken: ct).ConfigureAwait(false); return count == 1; } } }