using Microsoft.EntityFrameworkCore; using LingAdmin.Shared.Models; namespace LingAdmin.IdentityService.Data; public class IdentityDbContext : DbContext { public IdentityDbContext(DbContextOptions options) : base(options) { } public DbSet Users { get; set; } public DbSet RefreshTokens { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // User configuration modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => e.Email).IsUnique(); entity.Property(e => e.Name).HasMaxLength(100).IsRequired(); entity.Property(e => e.Email).HasMaxLength(255).IsRequired(); entity.Property(e => e.PasswordHash).HasMaxLength(255).IsRequired(); entity.Property(e => e.Status).HasMaxLength(50).IsRequired(); // Ignore navigation property for this service entity.Ignore(e => e.UserRoles); }); // RefreshToken configuration modelBuilder.Entity(entity => { entity.HasKey(e => e.Id); entity.HasIndex(e => e.Token).IsUnique(); entity.Property(e => e.Token).HasMaxLength(500).IsRequired(); entity.Property(e => e.CreatedByIp).HasMaxLength(50); entity.Property(e => e.RevokedByIp).HasMaxLength(50); entity.Property(e => e.ReplacedByToken).HasMaxLength(500); entity.HasOne(e => e.User) .WithMany() .HasForeignKey(e => e.UserId) .OnDelete(DeleteBehavior.Cascade); }); // Seed default admin user SeedData(modelBuilder); } private void SeedData(ModelBuilder modelBuilder) { // Default password: Admin@123456 // Using a fixed hash to avoid migration issues (generated from BCrypt.HashPassword("Admin@123456", 12)) const string adminPasswordHash = "$2a$12$07r7dSRHvi6NptOwfwTylOl8DTavEvazlQgqE67v/Ux1zAINGoEhe"; modelBuilder.Entity().HasData( new User { Id = 1, Name = "System Admin", Email = "admin@lingadmin.com", PasswordHash = adminPasswordHash, Status = "Active", CreatedAt = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc) } ); } }