using ComplianceDAL.DTO.AdapterConfig; using ComplianceDAL.Query.AdapterConfig; using GB5Shared.Connection; using GB5Shared.DTO.Framework.Login; using GB5Shared.QueryExecutor; using Microsoft.Extensions.Logging; using Newtonsoft.Json; namespace ComplianceDAL.CustomCode.AdapterConfig; public class AdapterConfigDAL : IAdapterConfigDAL { private readonly IQueryExecutor _queryExecutor; private readonly IApplicationConnection _appConnection; private readonly ILogger _logger; public AdapterConfigDAL(IQueryExecutor queryExecutor, IApplicationConnection appConnection, ILogger logger) { _queryExecutor = queryExecutor; _appConnection = appConnection; _logger = logger; } public async Task GetAdapterConfig(int adapterConfigId, LoginDTO login, CancellationToken ct) { try { var result = await _queryExecutor.QuerySingleAsync( login, AdapterConfigQB.GET_ADAPTER_CONFIG, new { AdapterConfigId = adapterConfigId }).ConfigureAwait(false); return JsonConvert.SerializeObject(result); } catch (Exception ex) { _logger.LogError(ex, "AdapterConfig DAL: GetAdapterConfig failed for AdapterConfigId {AdapterConfigId}", adapterConfigId); throw; } } public async Task GetAdapterConfigByGSTIN(string gstin, string framework, LoginDTO login, CancellationToken ct) { try { var config = await _queryExecutor.QuerySingleAsync( login, AdapterConfigQB.GET_ADAPTER_CONFIG_BY_GSTIN, new { GSTIN = gstin, Framework = framework, login.ClientId, OUId = login.WorkOUId }).ConfigureAwait(false); if (config is null) return null; // Same transform as GB4's GSTGovtSwitchFrameDAL.GSPHeader: resolve the Sandbox/Production // URL per environment flag, and decrypt the secrets that are stored encrypted in MGSP/MGST. // ASPClientId (GB4's CustomerId) is used raw — GB4 never decrypts it either. config.EInvoiceUrl = config.EInvoiceEnvironment == 0 ? config.EInvoiceSandboxBaseURL : config.EInvoiceProductionBaseURL; config.EWayUrl = config.EWayEnvironment == 0 ? config.EWaySandboxBaseURL : config.EWayProductionBaseURL; config.GSTUrl = config.GSTEnvironment == 0 ? config.GSTSandboxBaseURL : config.GSTProductionBaseURL; config.ASPId = DecryptIfPresent(config.ASPId); config.ASPSecret = DecryptIfPresent(config.ASPSecret); config.ASPSource = DecryptIfPresent(config.ASPSource); config.GSPClientId = DecryptIfPresent(config.GSPClientId); config.GSPClientSecret = DecryptIfPresent(config.GSPClientSecret); config.EInvoicePassword = DecryptIfPresent(config.EInvoicePassword); config.EWayPassword = DecryptIfPresent(config.EWayPassword); return config; } catch (Exception ex) { _logger.LogError(ex, "AdapterConfig DAL: GetAdapterConfigByGSTIN failed for GSTIN {GSTIN}, Framework {Framework}", gstin, framework); throw; } } // DecryptPasswordHash throws on an empty/blank ciphertext (block cipher needs at least one full // block) — several of these columns are optional per-client and may be unset, so guard here. private string DecryptIfPresent(string cipherText) => string.IsNullOrEmpty(cipherText) ? cipherText : _appConnection.DecryptPasswordHash(cipherText, true); public async Task GetAdapterConfigList(LoginDTO login, CancellationToken ct) { try { var result = await _queryExecutor.QueryAsync( login, AdapterConfigQB.GET_ADAPTER_CONFIG_LIST, new { }, cancellationToken: ct).ConfigureAwait(false); return JsonConvert.SerializeObject(result); } catch (Exception ex) { _logger.LogError(ex, "AdapterConfig DAL: GetAdapterConfigList failed"); throw; } } public async Task SaveAdapterConfig(AdapterConfigDTO dto, LoginDTO login, CancellationToken ct) { try { await _queryExecutor.ExecuteAsync( login, AdapterConfigQB.SAVE_ADAPTER_CONFIG, new { dto.AdapterConfigId, dto.GSPConfigId, dto.Framework, dto.GSTIN, dto.AuthURL, dto.BaseURL, dto.ClientIdAPI, dto.ClientSecret, dto.IsActive, dto.CreatedById, login.ClientId, login.DatabaseName }, cancellationToken: ct).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "AdapterConfig DAL: SaveAdapterConfig failed for GSTIN {GSTIN}, Framework {Framework}", dto.GSTIN, dto.Framework); throw; } } public async Task UpdateAdapterConfig(AdapterConfigDTO dto, LoginDTO login, CancellationToken ct) { try { await _queryExecutor.ExecuteAsync( login, AdapterConfigQB.UPDATE_ADAPTER_CONFIG, new { dto.AdapterConfigId, dto.GSPConfigId, dto.Framework, dto.GSTIN, dto.AuthURL, dto.BaseURL, dto.ClientIdAPI, dto.ClientSecret, dto.IsActive, dto.ModifiedById, login.ClientId, login.DatabaseName }, cancellationToken: ct).ConfigureAwait(false); } catch (Exception ex) { _logger.LogError(ex, "AdapterConfig DAL: UpdateAdapterConfig failed for AdapterConfigId {AdapterConfigId}", dto.AdapterConfigId); throw; } } }