using LANCommander.Server.Data.Enums; using LANCommander.Server.Data.Interceptors; using LANCommander.Server.Data.Models; using LANCommander.Server.Settings.Enums; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace LANCommander.Server.Data { public sealed class DatabaseContext( DbContextOptions options) : IdentityDbContext(options) { public static DatabaseProvider Provider = DatabaseProvider.Unknown; public static string ConnectionString = ""; protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { // Check if provider is already configured (e.g., by design-time factory) // We check for the presence of database provider extensions var hasSqliteExtension = optionsBuilder.Options.Extensions.Any(e => e.GetType().Name.Contains("Sqlite")); var hasMySqlExtension = optionsBuilder.Options.Extensions.Any(e => e.GetType().Name.Contains("MySql")); var hasNpgsqlExtension = optionsBuilder.Options.Extensions.Any(e => e.GetType().Name.Contains("Npgsql")); var isProviderConfigured = hasSqliteExtension || hasMySqlExtension || hasNpgsqlExtension; if (!isProviderConfigured && Provider != DatabaseProvider.Unknown && !string.IsNullOrEmpty(ConnectionString)) { optionsBuilder.AddInterceptors(new GameSaveChangesInterceptor()); optionsBuilder.EnableDetailedErrors(); optionsBuilder.EnableSensitiveDataLogging(); switch (Provider) { case DatabaseProvider.SQLite: optionsBuilder.UseSqlite(ConnectionString, options => options.MigrationsAssembly("LANCommander.Server.Data.SQLite")); break; case DatabaseProvider.MySQL: optionsBuilder.UseMySql(ConnectionString, ServerVersion.AutoDetect(ConnectionString), options => { options.MigrationsAssembly("LANCommander.Server.Data.MySQL"); options.EnableRetryOnFailure(maxRetryCount: 3, maxRetryDelay: TimeSpan.FromSeconds(5), errorNumbersToAdd: null); }); break; case DatabaseProvider.PostgreSQL: optionsBuilder.UseNpgsql(ConnectionString, options => { options.MigrationsAssembly("LANCommander.Server.Data.PostgreSQL"); options.EnableRetryOnFailure(maxRetryCount: 3, maxRetryDelay: TimeSpan.FromSeconds(5), errorCodesToAdd: null); }); break; } } else { // Provider is already configured, but we still want to add interceptors and settings if not already added optionsBuilder.AddInterceptors(new GameSaveChangesInterceptor()); optionsBuilder.EnableDetailedErrors(); optionsBuilder.EnableSensitiveDataLogging(); } base.OnConfiguring(optionsBuilder); } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships(); builder.ConfigureBaseRelationships