using Microsoft.EntityFrameworkCore; using Npgsql; using UniVerse.Domain.Entities; using UniVerse.Domain.Enums; namespace UniVerse.Infrastructure.Data; public class AppDbContext : DbContext { public AppDbContext(DbContextOptions options) : base(options) { } public DbSet Users { get; set; } = null!; public DbSet UserRoles { get; set; } = null!; public DbSet StudentProfiles { get; set; } = null!; public DbSet TeacherProfiles { get; set; } = null!; public DbSet Courses { get; set; } = null!; public DbSet Lectures { get; set; } = null!; public DbSet Locations { get; set; } = null!; public DbSet Tags { get; set; } = null!; public DbSet CourseTags { get; set; } = null!; public DbSet LectureEnrollments { get; set; } = null!; public DbSet Reviews { get; set; } = null!; public DbSet Achievements { get; set; } = null!; public DbSet UserAchievements { get; set; } = null!; public DbSet CoinTransactions { get; set; } = null!; public DbSet LevelThresholds { get; set; } = null!; public DbSet UserNotifications { get; set; } = null!; public DbSet RefreshTokens { get; set; } = null!; static AppDbContext() { NpgsqlConnection.GlobalTypeMapper.MapEnum("user_role"); NpgsqlConnection.GlobalTypeMapper.MapEnum("tag_type"); NpgsqlConnection.GlobalTypeMapper.MapEnum("review_llm_status"); NpgsqlConnection.GlobalTypeMapper.MapEnum("review_sentiment"); NpgsqlConnection.GlobalTypeMapper.MapEnum("coin_transaction_type"); } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); modelBuilder.HasPostgresEnum("user_role"); modelBuilder.HasPostgresEnum("tag_type"); modelBuilder.HasPostgresEnum("review_llm_status"); modelBuilder.HasPostgresEnum("review_sentiment"); modelBuilder.HasPostgresEnum("coin_transaction_type"); modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly); // Basic PK setups if they weren't fully in assembly modelBuilder.Entity().HasKey(ct => new { ct.CourseId, ct.TagId }); modelBuilder.Entity().HasKey(le => new { le.LectureId, le.UserId }); modelBuilder.Entity().HasKey(ua => new { ua.UserId, ua.AchievementId }); foreach (var entity in modelBuilder.Model.GetEntityTypes()) { entity.SetTableName(entity.GetTableName()?.ToLowerInvariant()); foreach (var property in entity.GetProperties()) { property.SetColumnName(string.Concat(property.Name.Select((x, i) => i > 0 && char.IsUpper(x) ? "_" + x.ToString() : x.ToString())).ToLowerInvariant()); } } } }