using Microsoft.Data.SqlClient; using ZA.CoreService.ESBCertificateManager.Models; namespace ZA.CoreService.ESBCertificateManager.Data; public sealed class SqlTargetRepository : ITargetRepository { private readonly string _connectionString; public SqlTargetRepository(string connectionString) { _connectionString = connectionString; } public string SourceDescription => "SQL Server (dbo.DeploymentTargets)"; public async Task> GetActiveTargetsAsync( CancellationToken cancellationToken = default) { if (string.IsNullOrWhiteSpace(_connectionString)) { throw new InvalidOperationException("Es ist keine SQL-Verbindungszeichenfolge konfiguriert."); } const string sql = """ SELECT Id, Name, Environment, IsActive, CertificateTargetPath, CertificateFileName, ContainerName, RestartType, RestartCommand, RestartArguments, RestartTimeoutSeconds, SonicConnectionName, XapiSourcePath, TlsHost, TlsPort, TlsServerName, ExpectedFingerprint, SortOrder FROM dbo.DeploymentTargets WHERE IsActive = 1 ORDER BY SortOrder, Name; """; List targets = []; await using SqlConnection connection = new(_connectionString); await connection.OpenAsync(cancellationToken); await using SqlCommand command = new(sql, connection); await using SqlDataReader reader = await command.ExecuteReaderAsync(cancellationToken); int id = reader.GetOrdinal("Id"); int name = reader.GetOrdinal("Name"); int environment = reader.GetOrdinal("Environment"); int isActive = reader.GetOrdinal("IsActive"); int certificateTargetPath = reader.GetOrdinal("CertificateTargetPath"); int certificateFileName = reader.GetOrdinal("CertificateFileName"); int containerName = reader.GetOrdinal("ContainerName"); int restartType = reader.GetOrdinal("RestartType"); int restartCommand = reader.GetOrdinal("RestartCommand"); int restartArguments = reader.GetOrdinal("RestartArguments"); int restartTimeoutSeconds = reader.GetOrdinal("RestartTimeoutSeconds"); int sonicConnectionName = reader.GetOrdinal("SonicConnectionName"); int xapiSourcePath = reader.GetOrdinal("XapiSourcePath"); int tlsHost = reader.GetOrdinal("TlsHost"); int tlsPort = reader.GetOrdinal("TlsPort"); int tlsServerName = reader.GetOrdinal("TlsServerName"); int expectedFingerprint = reader.GetOrdinal("ExpectedFingerprint"); int sortOrder = reader.GetOrdinal("SortOrder"); while (await reader.ReadAsync(cancellationToken)) { RestartType parsedRestartType = Enum.TryParse( reader.GetString(restartType), ignoreCase: true, out RestartType parsed) ? parsed : RestartType.None; targets.Add(new DeploymentTarget { Id = reader.GetInt32(id), Name = reader.GetString(name), Environment = reader.GetString(environment), IsActive = reader.GetBoolean(isActive), TargetDirectory = reader.GetString(certificateTargetPath), CertificateFileName = reader.GetString(certificateFileName), ContainerName = reader.GetString(containerName), RestartType = parsedRestartType, RestartCommand = reader.IsDBNull(restartCommand) ? string.Empty : reader.GetString(restartCommand), RestartArguments = reader.GetString(restartArguments), RestartTimeoutSeconds = reader.GetInt32(restartTimeoutSeconds), SonicConnectionName = reader.GetString(sonicConnectionName), XapiSourcePath = reader.GetString(xapiSourcePath), TlsHost = reader.GetString(tlsHost), TlsPort = reader.IsDBNull(tlsPort) ? null : reader.GetInt32(tlsPort), TlsServerName = reader.GetString(tlsServerName), ExpectedFingerprint = reader.IsDBNull(expectedFingerprint) ? null : reader.GetString(expectedFingerprint), SortOrder = reader.GetInt32(sortOrder) }); } return targets; } }