using Microsoft.EntityFrameworkCore; namespace JobTrackerApi.Data; public static class DatabaseConfiguration { public static string GetProvider(IConfiguration configuration) => (configuration["Database:Provider"] ?? "mariadb").Trim().ToLowerInvariant() switch { "mysql" or "mariadb" => "mariadb", "sqlite" => "sqlite", _ => throw new InvalidOperationException("Database:Provider must be mariadb (or mysql) or explicitly sqlite for transitional preservation."), }; public static string GetConnectionString(IConfiguration configuration, string sqlitePath) { var provider = GetProvider(configuration); var connection = configuration.GetConnectionString("JobTracker"); if (!string.IsNullOrWhiteSpace(connection)) return connection; if (provider == "sqlite") return $"Data Source={sqlitePath}"; throw new InvalidOperationException("ConnectionStrings:JobTracker is required for MariaDB. SQLite is only used when Database:Provider is explicitly sqlite."); } public static void Configure(DbContextOptionsBuilder options, IConfiguration configuration, string sqlitePath) { var provider = GetProvider(configuration); var connection = GetConnectionString(configuration, sqlitePath); if (provider == "mariadb") { var configuredVersion = configuration["Database:ServerVersion"] ?? "12.2.2"; if (!Version.TryParse(configuredVersion, out var version) || version.Major < 1 || version.Build < 0) throw new InvalidOperationException("Database:ServerVersion must be a MariaDB version in major.minor.patch form."); // AutoDetect would open a server connection while options are being registered. options.UseMySql(connection, new MariaDbServerVersion(version), mysql => mysql.MigrationsAssembly("JobTrackerApi")); } else options.UseSqlite(connection, sqlite => sqlite.MigrationsAssembly("JobTrackerApi")); } }