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;
}
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.");
}