using System; using System.Collections.Generic; using Microsoft.EntityFrameworkCore; using TaskTrackingSystem.Shared.Enums; namespace TaskTrackingSystem.Database.AppDbContextModels; public partial class AppDbContext : DbContext { public AppDbContext() { } public AppDbContext(DbContextOptions options) : base(options) { } public virtual DbSet AuditLogs { get; set; } public virtual DbSet Comments { get; set; } public virtual DbSet Menus { get; set; } public virtual DbSet Notifications { get; set; } public virtual DbSet Permissions { get; set; } public virtual DbSet Issues { get; set; } public virtual DbSet Projects { get; set; } public virtual DbSet ProjectMembers { get; set; } public virtual DbSet Roles { get; set; } public virtual DbSet RoleMenus { get; set; } public virtual DbSet RolePermissions { get; set; } public virtual DbSet Tasks { get; set; } public virtual DbSet UserDevices { get; set; } public virtual DbSet Users { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { optionsBuilder.UseNpgsql("Host=localhost;Port=5432;Database=tts;Username=postgres;Password=postgres"); } } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity(entity => { entity.HasIndex(e => e.UserId, "IX_AuditLogs_UserId"); entity.Property(e => e.Action).HasMaxLength(100); entity.Property(e => e.CreatedAt) .HasDefaultValueSql("CURRENT_TIMESTAMP") .HasColumnType("timestamp with time zone"); entity.Property(e => e.IpAddress) .HasMaxLength(45) .IsUnicode(false); entity.Property(e => e.Module).HasMaxLength(50); entity.HasOne(d => d.User).WithMany(p => p.AuditLogs) .HasForeignKey(d => d.UserId) .HasConstraintName("FK_AuditLogs_Users"); }); modelBuilder.Entity(entity => { entity.HasIndex(e => e.TaskId, "IX_Comments_TaskId"); entity.HasIndex(e => e.UserId, "IX_Comments_UserId"); entity.Property(e => e.CreatedAt) .HasDefaultValueSql("CURRENT_TIMESTAMP") .HasColumnType("timestamp with time zone"); entity.Property(e => e.UpdatedAt).HasColumnType("timestamp with time zone"); entity.HasOne(d => d.Task).WithMany(p => p.Comments) .HasForeignKey(d => d.TaskId) .HasConstraintName("FK_Comments_Tasks"); entity.HasOne(d => d.User).WithMany(p => p.Comments) .HasForeignKey(d => d.UserId) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_Comments_Users"); }); modelBuilder.Entity(entity => { entity.HasIndex(e => e.MenuCode, "UQ_Menus_MenuCode").IsUnique(); entity.Property(e => e.CreatedAt) .HasPrecision(0) .HasDefaultValueSql("CURRENT_TIMESTAMP"); entity.Property(e => e.Icon).HasMaxLength(50); entity.Property(e => e.MenuCode).HasMaxLength(50); entity.Property(e => e.MenuName).HasMaxLength(100); entity.Property(e => e.MenuUrl).HasMaxLength(200); entity.Property(e => e.UpdatedAt).HasPrecision(0); entity.Property(e => e.Visible).HasDefaultValue(true); entity.HasOne(d => d.ParentMenu).WithMany(p => p.InverseParentMenu) .HasForeignKey(d => d.ParentMenuId) .HasConstraintName("FK_Menus_ParentMenu"); }); modelBuilder.Entity(entity => { entity.ToTable("notifications"); entity.HasIndex(e => e.CreatedAt, "IX_notifications_CreatedAt"); entity.HasIndex(e => new { e.RecipientId, e.IsRead }, "IX_notifications_Recipient_IsRead"); entity.Property(e => e.CreatedAt).HasColumnName("created_at").HasColumnType("timestamp with time zone"); entity.Property(e => e.IsRead).HasColumnName("is_read").HasDefaultValue(false); entity.Property(e => e.NotificationType).HasColumnName("notification_type"); entity.Property(e => e.Title).HasMaxLength(255); entity.Property(e => e.ReadAt).HasColumnName("read_at").HasColumnType("timestamp with time zone"); entity.Property(e => e.RecipientId).HasColumnName("recipient_id"); entity.Property(e => e.SenderId).HasColumnName("sender_id"); entity.Property(e => e.SourceId).HasColumnName("source_id"); entity.Property(e => e.SourceType).HasColumnName("source_type").HasMaxLength(20); entity.HasOne(d => d.Recipient).WithMany() .HasForeignKey(d => d.RecipientId) .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("FK_notifications_Users_Recipient"); entity.HasOne(d => d.Sender).WithMany() .HasForeignKey(d => d.SenderId) .OnDelete(DeleteBehavior.SetNull) .HasConstraintName("FK_notifications_Users_Sender"); }); modelBuilder.Entity(entity => { entity.HasIndex(e => e.MenuId, "IX_Permissions_MenuId"); entity.HasIndex(e => e.PermissionCode, "UQ_Permissions_PermissionCode").IsUnique(); entity.Property(e => e.ActionName).HasMaxLength(100); entity.Property(e => e.ApiName).HasMaxLength(100); entity.Property(e => e.CreatedAt) .HasPrecision(0) .HasDefaultValueSql("CURRENT_TIMESTAMP"); entity.Property(e => e.HttpMethod).HasMaxLength(20); entity.Property(e => e.PermissionCode).HasMaxLength(50); entity.Property(e => e.UpdatedAt).HasPrecision(0); entity.Property(e => e.Visible).HasDefaultValue(true); entity.HasOne(d => d.Menu).WithMany(p => p.Permissions) .HasForeignKey(d => d.MenuId) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_Permissions_Menu"); }); modelBuilder.Entity(entity => { entity.HasIndex(e => e.AssignedTo, "IX_Issues_AssignedTo"); entity.HasIndex(e => e.StatusId, "IX_Issues_StatusId"); entity.HasIndex(e => e.PriorityId, "IX_Issues_PriorityId"); entity.HasIndex(e => e.TaskId, "IX_Issues_TaskId"); entity.Property(e => e.ActualHours).HasColumnType("decimal(5, 2)"); entity.Property(e => e.CreatedAt) .HasDefaultValueSql("CURRENT_TIMESTAMP") .HasColumnType("timestamp with time zone"); entity.Property(e => e.Description).HasMaxLength(1000); entity.Property(e => e.DelayReason).HasMaxLength(300); entity.Property(e => e.BlockedBy).HasMaxLength(200); entity.Property(e => e.DueDate).HasColumnType("timestamp with time zone"); entity.Property(e => e.EscalationLevel).HasDefaultValue(0); entity.Property(e => e.IsBlocked).HasDefaultValue(false); entity.Property(e => e.IsDeleted).HasDefaultValue(false); entity.Property(e => e.PriorityId).HasDefaultValue(TaskPriority.Medium); entity.Property(e => e.StartDate).HasColumnType("timestamp with time zone"); entity.Property(e => e.StatusId).HasDefaultValue(AppTaskStatus.Todo); entity.Property(e => e.Title).HasMaxLength(200); entity.Property(e => e.UpdatedAt).HasColumnType("timestamp with time zone"); entity.HasOne(d => d.AssignedToNavigation).WithMany() .HasForeignKey(d => d.AssignedTo) .HasConstraintName("FK_Issues_Users_AssignedTo"); entity.HasOne(d => d.Task).WithMany() .HasForeignKey(d => d.TaskId) .HasConstraintName("FK_Issues_Tasks"); }); modelBuilder.Entity(entity => { entity.HasIndex(e => e.CreatedById, "IX_Projects_CreatedById"); entity.Property(e => e.CreatedAt) .HasDefaultValueSql("CURRENT_TIMESTAMP") .HasColumnType("timestamp with time zone"); entity.Property(e => e.CreatedDate) .HasDefaultValueSql("CURRENT_TIMESTAMP") .HasColumnType("timestamp with time zone"); entity.Property(e => e.EndDate).HasColumnType("timestamp with time zone"); entity.Property(e => e.Name).HasMaxLength(150); entity.Property(e => e.StartDate).HasColumnType("timestamp with time zone"); entity.Property(e => e.UpdatedAt).HasColumnType("timestamp with time zone"); entity.HasOne(d => d.CreatedByNavigation).WithMany(p => p.Projects) .HasForeignKey(d => d.CreatedById) .OnDelete(DeleteBehavior.ClientSetNull); }); modelBuilder.Entity(entity => { entity.HasKey(e => new { e.ProjectId, e.UserId }); entity.HasIndex(e => e.UserId, "IX_ProjectMembers_UserId"); entity.Property(e => e.CreatedAt) .HasDefaultValueSql("CURRENT_TIMESTAMP") .HasColumnType("timestamp with time zone"); entity.HasOne(d => d.Project).WithMany(p => p.ProjectMembers) .HasForeignKey(d => d.ProjectId) .HasConstraintName("FK_ProjectMembers_Projects"); entity.HasOne(d => d.User).WithMany(p => p.ProjectMembers) .HasForeignKey(d => d.UserId) .HasConstraintName("FK_ProjectMembers_Users"); }); modelBuilder.Entity(entity => { entity.HasIndex(e => e.Name, "UQ_Roles_Name").IsUnique(); entity.Property(e => e.CreatedAt) .HasDefaultValueSql("CURRENT_TIMESTAMP") .HasColumnType("timestamp with time zone"); entity.Property(e => e.Description).HasMaxLength(200); entity.Property(e => e.Name).HasMaxLength(50); entity.Property(e => e.UpdatedAt).HasColumnType("timestamp with time zone"); }); modelBuilder.Entity(entity => { entity.HasKey(e => e.RoleMenuId).HasName("PK_RoleMenus_New"); entity.HasIndex(e => new { e.RoleId, e.MenuId }, "UQ_RoleMenus_Role_Menu").IsUnique(); entity.Property(e => e.CreatedAt) .HasPrecision(0) .HasDefaultValueSql("CURRENT_TIMESTAMP"); entity.Property(e => e.UpdatedAt).HasPrecision(0); entity.HasOne(d => d.Menu).WithMany(p => p.RoleMenus) .HasForeignKey(d => d.MenuId) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_RoleMenus_Menus"); entity.HasOne(d => d.Role).WithMany(p => p.RoleMenus) .HasForeignKey(d => d.RoleId) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_RoleMenus_Roles"); }); modelBuilder.Entity(entity => { entity.HasIndex(e => e.PermissionId, "IX_RolePermissions_PermissionId"); entity.HasIndex(e => e.RoleId, "IX_RolePermissions_RoleId"); entity.HasIndex(e => new { e.RoleId, e.PermissionId }, "UQ_RolePermissions_Role_Permission").IsUnique(); entity.Property(e => e.CreatedAt) .HasPrecision(0) .HasDefaultValueSql("CURRENT_TIMESTAMP"); entity.Property(e => e.UpdatedAt).HasPrecision(0); entity.HasOne(d => d.Permission).WithMany(p => p.RolePermissions) .HasForeignKey(d => d.PermissionId) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_RolePermissions_Permissions"); entity.HasOne(d => d.Role).WithMany(p => p.RolePermissions) .HasForeignKey(d => d.RoleId) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_RolePermissions_Roles"); }); modelBuilder.Entity(entity => { entity.HasIndex(e => e.AssignedBy, "IX_Tasks_AssignedBy"); entity.HasIndex(e => e.AssignedTo, "IX_Tasks_AssignedTo"); entity.HasIndex(e => e.ProjectId, "IX_Tasks_ProjectId"); entity.Property(e => e.CreatedAt) .HasDefaultValueSql("CURRENT_TIMESTAMP") .HasColumnType("timestamp with time zone"); entity.Property(e => e.DueDate).HasColumnType("timestamp with time zone"); entity.Property(e => e.IsArchived).HasDefaultValue(false); entity.Property(e => e.PriorityId).HasDefaultValue(TaskPriority.Medium); entity.Property(e => e.StatusId).HasDefaultValue(AppTaskStatus.Todo); entity.Property(e => e.Title).HasMaxLength(200); entity.Property(e => e.UpdatedAt).HasColumnType("timestamp with time zone"); entity.HasOne(d => d.AssignedByNavigation).WithMany(p => p.TaskAssignedByNavigations).HasForeignKey(d => d.AssignedBy); entity.HasOne(d => d.AssignedToNavigation).WithMany(p => p.TaskAssignedToNavigations).HasForeignKey(d => d.AssignedTo); entity.HasOne(d => d.Project).WithMany(p => p.Tasks) .HasForeignKey(d => d.ProjectId) .HasConstraintName("FK_Tasks_Projects"); }); modelBuilder.Entity(entity => { entity.HasIndex(e => e.RoleId, "IX_Users_RoleId"); entity.HasIndex(e => e.Email, "UQ_Users_Email").IsUnique(); entity.HasIndex(e => e.Username, "UQ_Users_Username").IsUnique(); entity.Property(e => e.CreatedAt) .HasDefaultValueSql("CURRENT_TIMESTAMP") .HasColumnType("timestamp with time zone"); entity.Property(e => e.Email).HasMaxLength(256); entity.Property(e => e.FirstName).HasMaxLength(50); entity.Property(e => e.IsActive).HasDefaultValue(true); entity.Property(e => e.LastName).HasMaxLength(50); entity.Property(e => e.Phone).HasMaxLength(20); entity.Property(e => e.UpdatedAt).HasColumnType("timestamp with time zone"); entity.Property(e => e.Username).HasMaxLength(50); entity.HasOne(d => d.Role).WithMany(p => p.Users) .HasForeignKey(d => d.RoleId) .OnDelete(DeleteBehavior.ClientSetNull) .HasConstraintName("FK_Users_Roles"); }); modelBuilder.Entity(entity => { entity.ToTable("user_devices"); entity.HasIndex(e => e.UserId, "IX_user_devices_UserId"); entity.HasIndex(e => e.FcmToken, "UQ_user_devices_FcmToken").IsUnique(); entity.Property(e => e.UserId).HasColumnName("user_id"); entity.Property(e => e.FcmToken).HasColumnName("fcm_token").HasMaxLength(255); entity.Property(e => e.CreatedAt).HasColumnName("created_at").HasColumnType("timestamp with time zone"); entity.Property(e => e.UpdatedAt).HasColumnName("updated_at").HasColumnType("timestamp with time zone"); entity.HasOne(d => d.User).WithMany() .HasForeignKey(d => d.UserId) .OnDelete(DeleteBehavior.Cascade) .HasConstraintName("FK_user_devices_Users"); }); OnModelCreatingPartial(modelBuilder); } partial void OnModelCreatingPartial(ModelBuilder modelBuilder); }