using FrameworkDAL.DTO.DirectAction; using FrameworkDAL.Query.DirectAction.DirectActionAdmin; 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.DirectAction.DirectActionAdmin { public class DirectActionAdminDAL : IDirectActionAdminDAL { private readonly IQueryExecutor _qe; private readonly AutoNumber _autoNumber; private readonly ILogger _logger; public DirectActionAdminDAL(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> GetDirectActionListAsync( string? search, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | GetDirectActionList | Tenant={TenantId} | Search={Search}", login.ClientId, search); var result = await _qe.QueryAsync( login, DirectActionAdminQB.GET_DIRECTACTION_LIST, new { TenantId = login.ClientId, Search = search }, cancellationToken: ct).ConfigureAwait(false); return result ?? []; } catch (OperationCanceledException) { _logger.LogWarning("DAL | GetDirectActionList | Cancelled | Tenant={TenantId}", login.ClientId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | GetDirectActionList | Error | Tenant={TenantId}", login.ClientId); throw; } } public async Task GetDirectActionAsync( int directActionId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | GetDirectAction | Tenant={TenantId} | DirectActionId={Id}", login.ClientId, directActionId); return await _qe.QuerySingleAsync( login, DirectActionAdminQB.GET_DIRECTACTION, new { DirectActionId = directActionId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | GetDirectAction | Cancelled | Id={Id}", directActionId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | GetDirectAction | Error | Id={Id}", directActionId); throw; } } public async Task InsertDirectActionAsync( DirectActionAdminDTO dto, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | InsertDirectAction | Tenant={TenantId} | Code={Code}", login.ClientId, dto.DirectActionCode); // DIRECTACTIONID is a plain INT PK (not IDENTITY) — must be generated here. var auto = await _autoNumber.GetNumberAsync(1, AUTONUMBERCONSTANT.DIRECTACTION, login) .ConfigureAwait(false); var newId = auto.StartNumber; await _qe.ExecuteAsync( login, DirectActionAdminQB.INSERT_DIRECTACTION, new { DirectActionId = newId, TenantId = login.ClientId, dto.DirectActionCode, dto.DirectActionName, dto.ContextIdField, dto.AssigneeUserIdField, dto.Version, CreatedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); _logger.LogInformation("DAL | InsertDirectAction | Completed | NewId={NewId}", newId); return newId; } catch (OperationCanceledException) { _logger.LogWarning("DAL | InsertDirectAction | Cancelled | Code={Code}", dto.DirectActionCode); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | InsertDirectAction | Error | Code={Code}", dto.DirectActionCode); throw; } } public async Task UpdateDirectActionAsync( DirectActionAdminDTO dto, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | UpdateDirectAction | Tenant={TenantId} | Id={Id}", login.ClientId, dto.DirectActionId); await _qe.ExecuteAsync( login, DirectActionAdminQB.UPDATE_DIRECTACTION, new { dto.DirectActionId, TenantId = login.ClientId, dto.DirectActionCode, dto.DirectActionName, dto.ContextIdField, dto.AssigneeUserIdField, dto.Version, ModifiedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | UpdateDirectAction | Cancelled | Id={Id}", dto.DirectActionId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | UpdateDirectAction | Error | Id={Id}", dto.DirectActionId); throw; } } public async Task DeleteDirectActionAsync( int directActionId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); try { _logger.LogInformation("DAL | DeleteDirectAction | Tenant={TenantId} | Id={Id}", login.ClientId, directActionId); await _qe.ExecuteAsync( login, DirectActionAdminQB.DELETE_DIRECTACTION, new { DirectActionId = directActionId, TenantId = login.ClientId, ModifiedById = login.UserId }, cancellationToken: ct).ConfigureAwait(false); } catch (OperationCanceledException) { _logger.LogWarning("DAL | DeleteDirectAction | Cancelled | Id={Id}", directActionId); throw; } catch (Exception ex) { _logger.LogError(ex, "DAL | DeleteDirectAction | Error | Id={Id}", directActionId); throw; } } public async Task DirectActionCodeExistsAsync( string directActionCode, int excludeDirectActionId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); var count = await _qe.ExecuteScalarAsync( login, DirectActionAdminQB.EXISTS_DIRECTACTIONCODE, new { DirectActionCode = directActionCode, DirectActionId = excludeDirectActionId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); return count == 1; } public async Task DirectActionExistsAsync( int directActionId, LoginDTO login, CancellationToken ct = default) { ct.ThrowIfCancellationRequested(); var count = await _qe.ExecuteScalarAsync( login, DirectActionAdminQB.EXISTS_DIRECTACTIONID, new { DirectActionId = directActionId, TenantId = login.ClientId }, cancellationToken: ct).ConfigureAwait(false); return count == 1; } } }