99 lines
3.1 KiB
C#
99 lines
3.1 KiB
C#
using DramaLing.Core.Entities;
|
|
using Microsoft.AspNetCore.Identity;
|
|
using Microsoft.AspNetCore.Identity.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace DramaLing.Infrastructure.Data;
|
|
|
|
public class ApplicationDbContext : IdentityDbContext<User, IdentityRole<Guid>, Guid>
|
|
{
|
|
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options)
|
|
{
|
|
}
|
|
|
|
// Learning Content
|
|
public DbSet<LearningStage> LearningStages { get; set; }
|
|
public DbSet<Scenario> Scenarios { get; set; }
|
|
public DbSet<Vocabulary> Vocabularies { get; set; }
|
|
|
|
// User Progress
|
|
public DbSet<UserProgress> UserProgresses { get; set; }
|
|
public DbSet<VocabularyProgress> VocabularyProgresses { get; set; }
|
|
|
|
// Gamification
|
|
public DbSet<Achievement> Achievements { get; set; }
|
|
public DbSet<UserAchievement> UserAchievements { get; set; }
|
|
public DbSet<DailyMission> DailyMissions { get; set; }
|
|
public DbSet<UserDailyMission> UserDailyMissions { get; set; }
|
|
|
|
protected override void OnModelCreating(ModelBuilder builder)
|
|
{
|
|
base.OnModelCreating(builder);
|
|
|
|
// Configure Identity tables to use Guid
|
|
builder.Entity<User>(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<IdentityRole<Guid>>(entity =>
|
|
{
|
|
entity.ToTable("Roles");
|
|
});
|
|
|
|
builder.Entity<IdentityUserRole<Guid>>(entity =>
|
|
{
|
|
entity.ToTable("UserRoles");
|
|
});
|
|
|
|
builder.Entity<IdentityUserClaim<Guid>>(entity =>
|
|
{
|
|
entity.ToTable("UserClaims");
|
|
});
|
|
|
|
builder.Entity<IdentityUserLogin<Guid>>(entity =>
|
|
{
|
|
entity.ToTable("UserLogins");
|
|
});
|
|
|
|
builder.Entity<IdentityRoleClaim<Guid>>(entity =>
|
|
{
|
|
entity.ToTable("RoleClaims");
|
|
});
|
|
|
|
builder.Entity<IdentityUserToken<Guid>>(entity =>
|
|
{
|
|
entity.ToTable("UserTokens");
|
|
});
|
|
|
|
// Configure soft delete
|
|
builder.Entity<User>()
|
|
.HasQueryFilter(e => !e.IsDeleted);
|
|
}
|
|
|
|
public override async Task<int> SaveChangesAsync(CancellationToken cancellationToken = default)
|
|
{
|
|
foreach (var entry in ChangeTracker.Entries<BaseEntity>())
|
|
{
|
|
switch (entry.State)
|
|
{
|
|
case EntityState.Modified:
|
|
entry.Entity.UpdatedAt = DateTime.UtcNow;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return await base.SaveChangesAsync(cancellationToken);
|
|
}
|
|
} |