using GB5Shared.Connection;
using GB5Shared.DTO.Framework.CommonConfig;
using GB5Shared.DTO.Framework.Login;
using GB5Shared.DTO.Framework.ServerConfig;
using Microsoft.Data.SqlClient;
using Microsoft.Extensions.Options;
namespace ApiRegistrationTool;
///
/// Custom IApplicationConnection for the CLI tool.
///
/// The standard ApplicationConnection.DBConnectionStringCached(LoginDTO) does a
/// SERVERCONFIG table lookup to resolve tenant DB connections. For the tool we
/// always want the master Gb5System connection (MAPI tables live there), so we
/// short-circuit that lookup and return Gb5SystemConnectionString() directly.
///
public sealed class ToolApplicationConnection : IApplicationConnection
{
private readonly IApplicationConnection _inner;
private readonly ToolConfig _cfg;
private readonly IOptions _gb5SystemDto;
public ToolApplicationConnection(ApplicationConnection inner, ToolConfig cfg, IOptions gb5SystemDto)
{
_inner = inner;
_cfg = cfg;
_gb5SystemDto = gb5SystemDto;
}
// ── When DatabaseName is configured: go through SERVERCONFIG lookup.
// ── When not configured: fall back to the Gb5System master connection.
public async Task DBConnectionStringCached(LoginDTO loginDTO)
{
if (!string.IsNullOrWhiteSpace(_cfg.DatabaseName))
{
loginDTO.DatabaseName = _cfg.DatabaseName;
return await _inner.DBConnectionStringCached(loginDTO);
}
return await _inner.Gb5SystemConnectionString();
}
// ── All other methods delegate unchanged ─────────────────────────────
public Task DBConnectionStringCached(string connectionName)
=> _inner.DBConnectionStringCached(connectionName);
public Task DatabaseConnectionObject(string connectionName)
=> _inner.DatabaseConnectionObject(connectionName);
public Task Gb5SystemConnectionString()
=> _inner.Gb5SystemConnectionString();
public Task DBConnectionStringCachedConnectionName(string connectionName)
=> _inner.DBConnectionStringCachedConnectionName(connectionName);
public string Decrypt(string encryptedText, string key)
=> _inner.Decrypt(encryptedText, key);
public string DecryptPasswordHash(string CipherString, bool UseHashing)
=> _inner.DecryptPasswordHash(CipherString, UseHashing);
public string Encrypt(string plaintext, string key = "GB5")
=> _inner.Encrypt(plaintext, key);
public string RandomGenerateAlphaNumeric(int size)
=> _inner.RandomGenerateAlphaNumeric(size);
// ── The tool always targets the master Gb5System connection (see class
// doc comment), so the DB type is just the configured global default —
// no SERVERCONFIG/tenant lookup needed. ────────────────────────────
public Task DatabaseTypeCached(LoginDTO LoginDTO)
=> Task.FromResult(_gb5SystemDto.Value.DataBaseType);
public Task DatabaseTypeCached(string ConnectionName)
=> Task.FromResult(_gb5SystemDto.Value.DataBaseType);
}