using DramaLing.Core.Entities; using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; namespace DramaLing.Infrastructure.Data; public class ApplicationDbContext : IdentityDbContext, Guid> { public ApplicationDbContext(DbContextOptions options) : base(options) { } // Learning Content public DbSet LearningStages { get; set; } public DbSet Scenarios { get; set; } public DbSet Vocabularies { get; set; } // User Progress public DbSet UserProgresses { get; set; } public DbSet VocabularyProgresses { get; set; } // Gamification public DbSet Achievements { get; set; } public DbSet UserAchievements { get; set; } public DbSet DailyMissions { get; set; } public DbSet UserDailyMissions { get; set; } protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); // Configure Identity tables to use Guid builder.Entity(entity => { entity.ToTable("Users"); entity.HasKey(e => e.Id); // Configure indexes entity.HasIndex(e => e.Email).IsUnique(); entity.HasIndex(e => e.UserName).IsUnique(); // Configure properties entity.Property(e => e.DisplayName).HasMaxLength(100).IsRequired(); entity.Property(e => e.CurrentLanguage).HasMaxLength(5).IsRequired(); entity.Property(e => e.NativeLanguage).HasMaxLength(5).IsRequired(); entity.Property(e => e.CurrentLevel).HasMaxLength(5).IsRequired(); }); builder.Entity>(entity => { entity.ToTable("Roles"); }); builder.Entity>(entity => { entity.ToTable("UserRoles"); }); builder.Entity>(entity => { entity.ToTable("UserClaims"); }); builder.Entity>(entity => { entity.ToTable("UserLogins"); }); builder.Entity>(entity => { entity.ToTable("RoleClaims"); }); builder.Entity>(entity => { entity.ToTable("UserTokens"); }); // Configure soft delete builder.Entity() .HasQueryFilter(e => !e.IsDeleted); } public override async Task SaveChangesAsync(CancellationToken cancellationToken = default) { foreach (var entry in ChangeTracker.Entries()) { switch (entry.State) { case EntityState.Modified: entry.Entity.UpdatedAt = DateTime.UtcNow; break; } } return await base.SaveChangesAsync(cancellationToken); } }