using Microsoft.Data.SqlClient; using Microsoft.Extensions.Configuration; namespace Infrastructure.Sql; /// /// Helper for building SQL Server connection strings from configuration /// (backed by the DB_* environment variables). /// public static class SqlConnectionStringHelper { /// /// Builds a SQL Server connection string from configuration. /// /// Throws if DB_SERVER, DB_NAME, DB_USER, or DB_PASSWORD is unset. /// The configuration to read the DB_* values from. /// If null, falls back to the DB_NAME configuration value. public static string BuildConnectionString( IConfiguration configuration, string? databaseName = null ) { string server = Required(configuration, "DB_SERVER"); string dbName = databaseName ?? Required(configuration, "DB_NAME"); string user = Required(configuration, "DB_USER"); string password = Required(configuration, "DB_PASSWORD"); SqlConnectionStringBuilder builder = new() { DataSource = server, InitialCatalog = dbName, UserID = user, Password = password, TrustServerCertificate = ResolveTrustServerCertificate(configuration), Encrypt = true, }; return builder.ConnectionString; } /// /// Builds a connection string to the master database using configuration. /// public static string BuildMasterConnectionString(IConfiguration configuration) { return BuildConnectionString(configuration, "master"); } /// /// Resolves the DB_TRUST_SERVER_CERTIFICATE configuration value, defaulting to /// true when it is unset or not a valid boolean. /// private static bool ResolveTrustServerCertificate(IConfiguration configuration) { return !bool.TryParse( configuration["DB_TRUST_SERVER_CERTIFICATE"], out bool trustServerCertificate ) || trustServerCertificate; } private static string Required(IConfiguration configuration, string key) => configuration[key] ?? throw new InvalidOperationException($"The {key} environment variable is not set."); }