72 lines
2.5 KiB
C#
72 lines
2.5 KiB
C#
|
|
using Microsoft.EntityFrameworkCore;
|
||
|
|
using LingAdmin.Shared.Models;
|
||
|
|
|
||
|
|
namespace LingAdmin.IdentityService.Data;
|
||
|
|
|
||
|
|
public class IdentityDbContext : DbContext
|
||
|
|
{
|
||
|
|
public IdentityDbContext(DbContextOptions<IdentityDbContext> options) : base(options)
|
||
|
|
{
|
||
|
|
}
|
||
|
|
|
||
|
|
public DbSet<User> Users { get; set; }
|
||
|
|
public DbSet<RefreshToken> RefreshTokens { get; set; }
|
||
|
|
|
||
|
|
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||
|
|
{
|
||
|
|
base.OnModelCreating(modelBuilder);
|
||
|
|
|
||
|
|
// User configuration
|
||
|
|
modelBuilder.Entity<User>(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<RefreshToken>(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<User>().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)
|
||
|
|
}
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|