using FrameworkDAL.DTO.EIPConversation; using FrameworkDAL.Query.EIPConversation.EIPCapabilityActionMapAdmin; 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.EIPCapabilityActionMapAdmin { public class EIPCapabilityActionMapAdminDAL : IEIPCapabilityActionMapAdminDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; private readonly ILogger _logger; public EIPCapabilityActionMapAdminDAL(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> GetMapListAsync( int capabilityId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | GetMapList | Tenant={TenantId} | CapabilityId={Id}", login.ClientId, capabilityId); var result = await _qe.QueryAsync( login, EIPCapabilityActionMapAdminQB.GET_MAP_LIST, new { CapabilityId = capabilityId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); return result ?? []; } catch (OperationCanceledException) { _logger.LogWarning("DAL | GetMapList | Cancelled | CapabilityId={Id}", capabilityId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | GetMapList | Error | CapabilityId={Id}", capabilityId); throw; } } public async Task GetMapAsync( int capabilityActionMapId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | GetMap | Tenant={TenantId} | Id={Id}", login.ClientId, capabilityActionMapId); return await _qe.QuerySingleAsync( login, EIPCapabilityActionMapAdminQB.GET_MAP, new { CapabilityActionMapId = capabilityActionMapId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | GetMap | Cancelled | Id={Id}", capabilityActionMapId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | GetMap | Error | Id={Id}", capabilityActionMapId); throw; } } public async Task InsertMapAsync( EIPCapabilityActionMapAdminDTO dto, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | InsertMap | CapabilityId={CapId} | ActionId={ActId}", dto.CapabilityId, dto.ActionId); // CAPABILITYACTIONMAPID is a plain INT PK (not IDENTITY) — must be generated here. var auto = await _autoNumber.GetNumberAsync(1, AUTONUMBERCONSTANT.EIPCAPABILITYACTIONMAP, login) .ConfigureAwait(false); var newId = auto.StartNumber; await _qe.ExecuteAsync( login, EIPCapabilityActionMapAdminQB.INSERT_MAP, new { CapabilityActionMapId = newId, dto.CapabilityId, dto.Slno, dto.ActionId, dto.IsEnabled }, cancellationToken: ct).ConfigureAwait(false); _logger.LogInformation("DAL | InsertMap | Completed | NewId={NewId}", newId); return newId; } catch (OperationCanceledException) { _logger.LogWarning("DAL | InsertMap | Cancelled | CapabilityId={Id}", dto.CapabilityId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | InsertMap | Error | CapabilityId={Id}", dto.CapabilityId); throw; } } public async Task UpdateMapAsync( EIPCapabilityActionMapAdminDTO dto, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | UpdateMap | Id={Id}", dto.CapabilityActionMapId); await _qe.ExecuteAsync( login, EIPCapabilityActionMapAdminQB.UPDATE_MAP, new { dto.CapabilityActionMapId, dto.Slno, dto.ActionId, dto.IsEnabled }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | UpdateMap | Cancelled | Id={Id}", dto.CapabilityActionMapId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | UpdateMap | Error | Id={Id}", dto.CapabilityActionMapId); throw; } } public async Task DeleteMapAsync( int capabilityActionMapId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | DeleteMap | Id={Id}", capabilityActionMapId); // Real hard delete — MEIPCAPABILITYACTIONMAP has no STATUS column. await _qe.ExecuteAsync( login, EIPCapabilityActionMapAdminQB.DELETE_MAP, new { CapabilityActionMapId = capabilityActionMapId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | DeleteMap | Cancelled | Id={Id}", capabilityActionMapId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | DeleteMap | Error | Id={Id}", capabilityActionMapId); throw; } } public async Task CapabilityActionExistsAsync( int capabilityId, int actionId, int excludeCapabilityActionMapId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); var count = await _qe.ExecuteScalarAsync( login, EIPCapabilityActionMapAdminQB.EXISTS_CAPABILITY_ACTION, new { CapabilityId = capabilityId, ActionId = actionId, CapabilityActionMapId = excludeCapabilityActionMapId }, cancellationToken: ct).ConfigureAwait(false); return count == 1; } public async Task CapabilityIdExistsAsync(int capabilityId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); var count = await _qe.ExecuteScalarAsync( login, EIPCapabilityActionMapAdminQB.EXISTS_CAPABILITYID, new { CapabilityId = capabilityId }, cancellationToken: ct).ConfigureAwait(false); return count == 1; } public async Task ActionIdExistsAsync(int actionId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); var count = await _qe.ExecuteScalarAsync( login, EIPCapabilityActionMapAdminQB.EXISTS_ACTIONID, new { ActionId = actionId }, cancellationToken: ct).ConfigureAwait(false); return count == 1; } } }