using FrameworkDAL.DTO.EIPConversation; using FrameworkDAL.Query.EIPConversation.EIPRoutingAdmin; 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.EIPRoutingAdmin { public class EIPRoutingAdminDAL : IEIPRoutingAdminDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; private readonly ILogger _logger; public EIPRoutingAdminDAL(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> GetRouteListAsync( int? channelType, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation( "DAL | GetRouteList | Tenant={TenantId} | ChannelType={ChannelType}", login.ClientId, channelType); var result = await _qe.QueryAsync( login, EIPRoutingAdminQB.GET_ROUTE_LIST, new { TenantId = login.ClientId, ChannelType = channelType }, cancellationToken: ct).ConfigureAwait(false); return result ?? []; } catch (OperationCanceledException) { _logger.LogWarning("DAL | GetRouteList | Cancelled | Tenant={TenantId}", login.ClientId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | GetRouteList | Error | Tenant={TenantId}", login.ClientId); throw; } } public async Task GetRouteAsync( int routingRuleId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation( "DAL | GetRoute | Tenant={TenantId} | RoutingRuleId={RoutingRuleId}", login.ClientId, routingRuleId); return await _qe.QuerySingleAsync( login, EIPRoutingAdminQB.GET_ROUTE, new { RoutingRuleId = routingRuleId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | GetRoute | Cancelled | RoutingRuleId={Id}", routingRuleId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | GetRoute | Error | RoutingRuleId={Id}", routingRuleId); throw; } } public async Task InsertRouteAsync( EIPRoutingRuleAdminDTO dto, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation( "DAL | InsertRoute | Tenant={TenantId} | ChannelType={ChannelType} | FlowId={FlowId}", login.ClientId, dto.ChannelType, dto.FlowId); // ROUTINGRULEID is a plain INT PK (not IDENTITY) — must be generated here. var auto = await _autoNumber.GetNumberAsync(1, AUTONUMBERCONSTANT.EIPROUTINGRULE, login) .ConfigureAwait(false); var newId = auto.StartNumber; await _qe.ExecuteAsync( login, EIPRoutingAdminQB.INSERT_ROUTE, new { RoutingRuleId = newId, TenantId = login.ClientId, dto.ChannelType, dto.FlowId, PriorityOrder = dto.PriorityOrder, Pattern = dto.Pattern, dto.MatchType, CreatedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); _logger.LogInformation("DAL | InsertRoute | Completed | NewId={NewId}", newId); return newId; } catch (OperationCanceledException) { _logger.LogWarning("DAL | InsertRoute | Cancelled | Tenant={TenantId}", login.ClientId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | InsertRoute | Error | Tenant={TenantId}", login.ClientId); throw; } } public async Task UpdateRouteAsync( EIPRoutingRuleAdminDTO dto, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation( "DAL | UpdateRoute | Tenant={TenantId} | RoutingRuleId={RoutingRuleId}", login.ClientId, dto.RoutingRuleId); await _qe.ExecuteAsync( login, EIPRoutingAdminQB.UPDATE_ROUTE, new { dto.RoutingRuleId, TenantId = login.ClientId, dto.ChannelType, dto.FlowId, PriorityOrder = dto.PriorityOrder, Pattern = dto.Pattern, dto.MatchType, dto.Version, ModifiedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning( "DAL | UpdateRoute | Cancelled | RoutingRuleId={Id}", dto.RoutingRuleId); throw; } catch (Exception ex) { _logger.LogError( ex, "DAL | UpdateRoute | Error | RoutingRuleId={Id}", dto.RoutingRuleId); throw; } } public async Task DeleteRouteAsync( int routingRuleId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation( "DAL | DeleteRoute | Tenant={TenantId} | RoutingRuleId={RoutingRuleId}", login.ClientId, routingRuleId); await _qe.ExecuteAsync( login, EIPRoutingAdminQB.DELETE_ROUTE, new { RoutingRuleId = routingRuleId, TenantId = login.ClientId, ModifiedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | DeleteRoute | Cancelled | RoutingRuleId={Id}", routingRuleId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | DeleteRoute | Error | RoutingRuleId={Id}", routingRuleId); throw; } } } }