using FrameworkDAL.DTO.EIPConversation; using FrameworkDAL.Query.EIPConversation.EIPMessageTemplateAdmin; 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.EIPMessageTemplateAdmin { public class EIPMessageTemplateAdminDAL : IEIPMessageTemplateAdminDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; private readonly ILogger _logger; public EIPMessageTemplateAdminDAL(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> GetTemplateListAsync( string? search, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation( "DAL | GetTemplateList | Tenant={TenantId} | Search={Search}", login.ClientId, search); var result = await _qe.QueryAsync( login, EIPMessageTemplateAdminQB.GET_TEMPLATE_LIST, new { TenantId = login.ClientId, Search = search }, cancellationToken: ct).ConfigureAwait(false); return result ?? []; } catch (OperationCanceledException) { _logger.LogWarning("DAL | GetTemplateList | Cancelled | Tenant={TenantId}", login.ClientId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | GetTemplateList | Error | Tenant={TenantId}", login.ClientId); throw; } } public async Task GetTemplateAsync( int messageId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation( "DAL | GetTemplate | Tenant={TenantId} | MessageId={MessageId}", login.ClientId, messageId); return await _qe.QuerySingleAsync( login, EIPMessageTemplateAdminQB.GET_TEMPLATE, new { MessageId = messageId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | GetTemplate | Cancelled | MessageId={Id}", messageId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | GetTemplate | Error | MessageId={Id}", messageId); throw; } } public async Task InsertTemplateAsync( EIPMessageTemplateAdminDTO dto, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation( "DAL | InsertTemplate | Tenant={TenantId} | MessageKey={MessageKey}", login.ClientId, dto.MessageKey); // MESSAGEID is a plain INT PK (not IDENTITY) — must be generated here. var auto = await _autoNumber.GetNumberAsync(1, AUTONUMBERCONSTANT.EIPMESSAGETEMPLATE, login) .ConfigureAwait(false); var newId = auto.StartNumber; await _qe.ExecuteAsync( login, EIPMessageTemplateAdminQB.INSERT_TEMPLATE, new { MessageId = newId, TenantId = login.ClientId, dto.MessageKey, dto.LanguageCode, dto.ChannelType, dto.TemplateContent, dto.TemplateVersion, dto.IsActive, dto.Version, CreatedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); _logger.LogInformation("DAL | InsertTemplate | Completed | NewId={NewId}", newId); return newId; } catch (OperationCanceledException) { _logger.LogWarning("DAL | InsertTemplate | Cancelled | MessageKey={Key}", dto.MessageKey); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | InsertTemplate | Error | MessageKey={Key}", dto.MessageKey); throw; } } public async Task UpdateTemplateAsync( EIPMessageTemplateAdminDTO dto, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation( "DAL | UpdateTemplate | Tenant={TenantId} | MessageId={MessageId}", login.ClientId, dto.MessageId); await _qe.ExecuteAsync( login, EIPMessageTemplateAdminQB.UPDATE_TEMPLATE, new { dto.MessageId, TenantId = login.ClientId, dto.MessageKey, dto.LanguageCode, dto.ChannelType, dto.TemplateContent, dto.TemplateVersion, dto.IsActive, dto.Version, ModifiedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | UpdateTemplate | Cancelled | MessageId={Id}", dto.MessageId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | UpdateTemplate | Error | MessageId={Id}", dto.MessageId); throw; } } public async Task DeleteTemplateAsync( int messageId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation( "DAL | DeleteTemplate | Tenant={TenantId} | MessageId={MessageId}", login.ClientId, messageId); await _qe.ExecuteAsync( login, EIPMessageTemplateAdminQB.DELETE_TEMPLATE, new { MessageId = messageId, TenantId = login.ClientId, ModifiedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | DeleteTemplate | Cancelled | MessageId={Id}", messageId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | DeleteTemplate | Error | MessageId={Id}", messageId); throw; } } public async Task TemplateKeyExistsAsync( EIPMessageTemplateAdminDTO dto, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); var count = await _qe.ExecuteScalarAsync( login, EIPMessageTemplateAdminQB.EXISTS_TEMPLATE_KEY, new { TenantId = login.ClientId, dto.MessageKey, dto.LanguageCode, dto.ChannelType, dto.TemplateVersion, dto.MessageId }, cancellationToken: ct).ConfigureAwait(false); return count == 1; } } }