using ZA.CoreService.ESBCertificateManager.Services;
namespace ZA.CoreService.ESBCertificateManager.Models;
///
/// Aus dbo.SonicConnection geladene Verbindungsdaten.
/// CredentialSecret wird durch Microsoft.Data.SqlClient
/// clientseitig entschlüsselt.
///
public sealed class DatabaseSonicConnection
{
public int Id { get; init; }
public required string Name { get; init; }
public required string ManagementHost { get; init; }
public int? ManagementPort { get; init; }
public string? ConnectionProtocol { get; init; }
public string? DomainName { get; init; }
public string? CredentialUserName { get; init; }
public string? CredentialReference { get; init; }
///
/// Nur zur Laufzeit verfügbar.
/// Darf niemals protokolliert oder angezeigt werden.
///
public string? CredentialSecret { get; init; }
public string? JavaHomePath { get; init; }
public string? SonicHomePath { get; init; }
public string? Notes { get; init; }
public bool IsActive { get; init; }
public bool HasCredentials =>
!string.IsNullOrWhiteSpace(CredentialUserName)
&& !string.IsNullOrEmpty(CredentialSecret);
public string BuildConnectionUrl()
{
if (string.IsNullOrWhiteSpace(ConnectionProtocol))
{
throw new InvalidOperationException(
$"Bei der Sonic-Verbindung '{Name}' fehlt ConnectionProtocol.");
}
if (string.IsNullOrWhiteSpace(ManagementHost))
{
throw new InvalidOperationException(
$"Bei der Sonic-Verbindung '{Name}' fehlt ManagementHost.");
}
if (ManagementPort is null or < 1 or > 65535)
{
throw new InvalidOperationException(
$"Bei der Sonic-Verbindung '{Name}' fehlt ein gültiger ManagementPort.");
}
string protocol = ConnectionProtocol
.Trim()
.TrimEnd(':', '/');
string host = ManagementHost.Trim();
return $"{protocol}://{host}:{ManagementPort.Value}";
}
public SonicConnection ToRuntimeConnection(
RuntimeSettings runtimeSettings)
{
if (string.IsNullOrWhiteSpace(DomainName))
{
throw new InvalidOperationException(
$"Bei der Sonic-Verbindung '{Name}' fehlt DomainName.");
}
if (string.IsNullOrWhiteSpace(CredentialUserName))
{
throw new InvalidOperationException(
$"Bei der Sonic-Verbindung '{Name}' fehlt der Benutzername.");
}
if (string.IsNullOrEmpty(CredentialSecret))
{
throw new InvalidOperationException(
$"Bei der Sonic-Verbindung '{Name}' fehlen die Zugangsdaten. " +
"Bitte das Setup ausführen.");
}
string javaExecutablePath =
PathResolver.ResolvePath(
runtimeSettings.JavaExecutablePath);
string sonicClientLibraryPath =
PathResolver.ResolvePath(
runtimeSettings.SonicClientLibraryPath);
string javaBinDirectory =
Path.GetDirectoryName(javaExecutablePath)
?? string.Empty;
string javaHome =
Directory.GetParent(javaBinDirectory)?.FullName
?? string.Empty;
string sonicHome =
Directory.GetParent(sonicClientLibraryPath)?.FullName
?? string.Empty;
return new SonicConnection
{
Name = Name,
DomainName = DomainName,
ConnectionUrl = BuildConnectionUrl(),
Username = CredentialUserName,
// Nur Laufzeitwert, bereits clientseitig entschlüsselt.
Password = CredentialSecret,
JavaPath = javaExecutablePath,
JavaHome = javaHome,
MfClientLibPath = sonicClientLibraryPath,
SonicHome = sonicHome,
TimeoutSeconds = 120,
PostRestartDelaySeconds = 20
};
}
}