using Microsoft.EntityFrameworkCore; namespace Nexus.Api.Data; public sealed class NexusDbContext(DbContextOptions options) : DbContext(options) { public DbSet Projects => Set(); public DbSet Tasks => Set(); public DbSet Notifications => Set(); public DbSet Activity => Set(); public DbSet Users => Set(); public DbSet RefreshTokens => Set(); public DbSet SeedAudits => Set(); protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().Property(x => x.Name).HasMaxLength(160); modelBuilder.Entity(entity => { entity.Property(x => x.Title).HasMaxLength(240); entity.Property(x => x.Detail).HasMaxLength(2000); entity.Property(x => x.Source).HasMaxLength(60); entity.Property(x => x.AssignedTo).HasMaxLength(60); entity.Property(x => x.ExpectedFrom).HasMaxLength(60); entity.HasIndex(x => x.Source); entity.HasIndex(x => x.AssignedTo); entity.HasIndex(x => x.IsAgentTask); entity.HasIndex(x => x.ExpectedFrom); entity.HasOne(x => x.ParentTask) .WithMany(x => x.ChildTasks) .HasForeignKey(x => x.ParentTaskId) .OnDelete(DeleteBehavior.SetNull); }); modelBuilder.Entity(entity => { entity.Property(x => x.Title).HasMaxLength(240); entity.Property(x => x.Message).HasMaxLength(1000); entity.Property(x => x.Type).HasMaxLength(60); entity.Property(x => x.ForUser).HasMaxLength(60); entity.HasIndex(x => new { x.ForUser, x.IsRead, x.CreatedAt }); }); modelBuilder.Entity(entity => { entity.Property(x => x.Message).HasMaxLength(1000); entity.HasIndex(x => x.TaskId); }); modelBuilder.Entity().HasIndex(u => u.NormalizedEmail).IsUnique(); modelBuilder.Entity().HasIndex(r => r.TokenHash).IsUnique(); modelBuilder.Entity().HasIndex(r => new { r.UserId, r.FamilyId }); modelBuilder.Entity().Property(r => r.ConcurrencyStamp).IsConcurrencyToken(); modelBuilder.Entity() .HasOne(r => r.User) .WithMany(u => u.RefreshTokens) .HasForeignKey(r => r.UserId) .OnDelete(DeleteBehavior.Cascade); modelBuilder.Entity().HasIndex(x => x.CreatedAt); } }