using GamificationService.Models.Database; using Microsoft.EntityFrameworkCore; namespace GamificationService.Database; public class ApplicationContext : DbContext { public ApplicationContext(DbContextOptions options) : base(options) {} public required DbSet Ranks { get; set; } public required DbSet Skills { get; set; } public required DbSet Players { get; set; } public required DbSet MissionCategories { get; set; } public required DbSet Missions { get; set; } public required DbSet MissionRankRules { get; set; } public required DbSet MissionSkillRewards { get; set; } public required DbSet MissionItemRewards { get; set; } public required DbSet RankMissionRules { get; set; } public required DbSet RankSkillRules { get; set; } public required DbSet PlayerSkills { get; set; } public required DbSet PlayerMissions { get; set; } public required DbSet Dialogues { get; set; } public required DbSet DialogueMessages { get; set; } public required DbSet DialogueMessageResponseOptions { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { base.OnModelCreating(modelBuilder); // Player configurations modelBuilder.Entity() .HasIndex(p => p.UserId) .IsUnique(); modelBuilder.Entity() .HasOne(p => p.Rank) .WithMany(r => r.Players) .HasForeignKey(p => p.RankId); // Rank configurations modelBuilder.Entity() .HasIndex(r => r.ExpNeeded) .IsUnique(); modelBuilder.Entity() .HasIndex(r => r.Title) .IsUnique(); // Skill configurations modelBuilder.Entity() .HasIndex(s => s.Title) .IsUnique(); // MissionCategory configurations modelBuilder.Entity() .HasIndex(mc => mc.Title) .IsUnique(); // Mission configurations modelBuilder.Entity() .HasOne(m => m.MissionCategory) .WithMany(mc => mc.Missions) .HasForeignKey(m => m.MissionCategoryId) .IsRequired(); modelBuilder.Entity() .HasOne(m => m.ParentMission) .WithMany(m => m.ChildMissions) .HasForeignKey(m => m.ParentMissionId) .IsRequired(false); // Dialogue relationship for Mission modelBuilder.Entity() .HasOne(m => m.Dialogue) .WithOne(d => d.Mission) .HasForeignKey(m => m.DialogueId) .IsRequired(false); // MissionRankRule configurations modelBuilder.Entity() .HasOne(mrr => mrr.Mission) .WithMany(m => m.MissionRankRules) .HasForeignKey(mrr => mrr.MissionId); modelBuilder.Entity() .HasOne(mrr => mrr.Rank) .WithMany(r => r.MissionRankRules) .HasForeignKey(mrr => mrr.RankId); // MissionSkillReward configurations modelBuilder.Entity() .HasOne(msr => msr.Mission) .WithMany(m => m.MissionSkillRewards) .HasForeignKey(msr => msr.MissionId); modelBuilder.Entity() .HasOne(msr => msr.Skill) .WithMany(s => s.MissionSkillRewards) .HasForeignKey(msr => msr.SkillId); // MissionItemReward configurations modelBuilder.Entity() .HasOne(mir => mir.Mission) .WithMany(m => m.MissionItemRewards) .HasForeignKey(mir => mir.MissionId); // RankMissionRule configurations modelBuilder.Entity() .HasOne(rmr => rmr.Rank) .WithMany(r => r.RankMissionRules) .HasForeignKey(rmr => rmr.RankId); modelBuilder.Entity() .HasOne(rmr => rmr.Mission) .WithMany(m => m.RankMissionRules) .HasForeignKey(rmr => rmr.MissionId); // RankSkillRule configurations modelBuilder.Entity() .HasOne(rsr => rsr.Rank) .WithMany(r => r.RankSkillRules) .HasForeignKey(rsr => rsr.RankId); modelBuilder.Entity() .HasOne(rsr => rsr.Skill) .WithMany(s => s.RankSkillRules) .HasForeignKey(rsr => rsr.SkillId); // PlayerSkill configurations modelBuilder.Entity() .HasOne(ps => ps.Player) .WithMany(p => p.PlayerSkills) .HasForeignKey(ps => ps.PlayerId); modelBuilder.Entity() .HasOne(ps => ps.Skill) .WithMany(s => s.PlayerSkills) .HasForeignKey(ps => ps.SkillId); // PlayerMission configurations modelBuilder.Entity() .HasOne(pm => pm.Player) .WithMany(p => p.PlayerMissions) .HasForeignKey(pm => pm.PlayerId); modelBuilder.Entity() .HasOne(pm => pm.Mission) .WithMany(m => m.PlayerMissions) .HasForeignKey(pm => pm.MissionId); // Dialogue configurations modelBuilder.Entity() .HasOne(d => d.Mission) .WithOne(m => m.Dialogue) .HasForeignKey(d => d.MissionId) .IsRequired(); // DialogueMessage configurations modelBuilder.Entity() .HasOne(dm => dm.InitialDialogue) .WithMany() .HasForeignKey(dm => dm.InitialDialogueId) .IsRequired(false) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(dm => dm.InterimDialogue) .WithMany() .HasForeignKey(dm => dm.InterimDialogueId) .IsRequired(false) .OnDelete(DeleteBehavior.Restrict); modelBuilder.Entity() .HasOne(dm => dm.EndDialogue) .WithMany() .HasForeignKey(dm => dm.EndDialogueId) .IsRequired(false) .OnDelete(DeleteBehavior.Restrict); // DialogueMessageResponseOption configurations modelBuilder.Entity() .HasOne(dmro => dmro.ParentDialogueMessage) .WithMany(dm => dm.DialogueMessageResponseOptions) .HasForeignKey(dmro => dmro.ParentDialogueMessageId) .IsRequired(); modelBuilder.Entity() .HasOne(dmro => dmro.DestinationDialogueMessage) .WithMany() .HasForeignKey(dmro => dmro.DestinationDialogueMessageId) .IsRequired(false) .OnDelete(DeleteBehavior.Restrict); } }