diff --git a/Database/ApplicationContext.cs b/Database/ApplicationContext.cs index 9573b05..e4294e1 100755 --- a/Database/ApplicationContext.cs +++ b/Database/ApplicationContext.cs @@ -1,16 +1,133 @@ +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; } + 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); + + // 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); } } diff --git a/Enums/Database/MissionRankRuleType.cs b/Enums/Database/MissionRankRuleType.cs new file mode 100644 index 0000000..323b717 --- /dev/null +++ b/Enums/Database/MissionRankRuleType.cs @@ -0,0 +1,8 @@ +namespace GamificationService.Enums.Database; + +public enum MissionRankRuleType +{ + EqualOrLower = 0, + Equal = 1, + EqualOrHigher = 3 +} diff --git a/Models/Database/Mission.cs b/Models/Database/Mission.cs new file mode 100644 index 0000000..0915321 --- /dev/null +++ b/Models/Database/Mission.cs @@ -0,0 +1,21 @@ +namespace GamificationService.Models.Database; + +public class Mission +{ + public long Id { get; set; } + public string Title { get; set; } = string.Empty; + public string Description { get; set; } = string.Empty; + public MissionCategory? MissionCategory { get; set; } + public long MissionCategoryId { get; set; } + public Mission? ParentMission { get; set; } + public long ParentMissionId { get; set; } + public int ExpReward { get; set; } + public int ManaReward { get; set; } + + public ICollection ChildMissions { get; set; } = new List(); + public ICollection PlayerMissions { get; set; } = new List(); + public ICollection MissionItemRewards { get; set; } = new List(); + public ICollection MissionSkillRewards { get; set; } = new List(); + public ICollection MissionRankRules { get; set; } = new List(); + public ICollection RankMissionRules { get; set; } = new List(); +} diff --git a/Models/Database/MissionCategory.cs b/Models/Database/MissionCategory.cs new file mode 100644 index 0000000..30cb3dd --- /dev/null +++ b/Models/Database/MissionCategory.cs @@ -0,0 +1,9 @@ +namespace GamificationService.Models.Database; + +public class MissionCategory +{ + public long Id { get; set; } + public string Title { get; set; } = string.Empty; + + public ICollection Missions { get; set; } = new List(); +} diff --git a/Models/Database/MissionItemReward.cs b/Models/Database/MissionItemReward.cs new file mode 100644 index 0000000..480f43e --- /dev/null +++ b/Models/Database/MissionItemReward.cs @@ -0,0 +1,9 @@ +namespace GamificationService.Models.Database; + +public class MissionItemReward +{ + public long Id { get; set; } + public long ItemId { get; set; } + public long MissionId { get; set; } + public required Mission Mission { get; set; } +} diff --git a/Models/Database/MissionRankRule.cs b/Models/Database/MissionRankRule.cs new file mode 100644 index 0000000..f3eb840 --- /dev/null +++ b/Models/Database/MissionRankRule.cs @@ -0,0 +1,13 @@ +using GamificationService.Enums.Database; + +namespace GamificationService.Models.Database; + +public class MissionRankRule +{ + public long Id { get; set; } + public long MissionId { get; set; } + public Mission Mission { get; set; } = null!; + public long RankId { get; set; } + public Rank Rank { get; set; } = null!; + public MissionRankRuleType Type { get; set; } +} diff --git a/Models/Database/MissionSkillReward.cs b/Models/Database/MissionSkillReward.cs new file mode 100644 index 0000000..1b903ba --- /dev/null +++ b/Models/Database/MissionSkillReward.cs @@ -0,0 +1,11 @@ +namespace GamificationService.Models.Database; + +public class MissionSkillReward +{ + public long Id { get; set; } + public long MissionId { get; set; } + public Mission Mission { get; set; } = null!; + public long SkillId { get; set; } + public Skill Skill { get; set; } = null!; + public int Value { get; set; } +} diff --git a/Models/Database/Player.cs b/Models/Database/Player.cs new file mode 100644 index 0000000..473bc1f --- /dev/null +++ b/Models/Database/Player.cs @@ -0,0 +1,13 @@ +namespace GamificationService.Models.Database; + +public class Player +{ + public long Id { get; set; } + public long UserId { get; set; } + public Rank? Rank { get; set; } + public long RankId {get; set; } + public int Experience { get; set; } + + public ICollection PlayerMissions { get; set; } = new List(); + public ICollection PlayerSkills { get; set; } = new List(); +} diff --git a/Models/Database/PlayerMission.cs b/Models/Database/PlayerMission.cs new file mode 100644 index 0000000..0b7462d --- /dev/null +++ b/Models/Database/PlayerMission.cs @@ -0,0 +1,12 @@ +namespace GamificationService.Models.Database; + +public class PlayerMission +{ + public long Id { get; set; } + public long PlayerId { get; set; } + public required Player Player { get; set; } + public long MissionId { get; set; } + public required Mission Mission { get; set; } + public DateTime? Completed { get; set; } + public DateTime? RewardsRedeemed { get; set; } +} diff --git a/Models/Database/PlayerSkill.cs b/Models/Database/PlayerSkill.cs new file mode 100644 index 0000000..ff944f9 --- /dev/null +++ b/Models/Database/PlayerSkill.cs @@ -0,0 +1,11 @@ +namespace GamificationService.Models.Database; + +public class PlayerSkill +{ + public long Id { get; set; } + public long PlayerId { get; set; } + public Player Player { get; set; } = null!; + public long SkillId { get; set; } + public Skill Skill { get; set; } = null!; + public int Score { get; set; } +} diff --git a/Models/Database/Rank.cs b/Models/Database/Rank.cs new file mode 100644 index 0000000..7a1338b --- /dev/null +++ b/Models/Database/Rank.cs @@ -0,0 +1,13 @@ +namespace GamificationService.Models.Database; + +public class Rank +{ + public long Id { get; set; } + public string Title { get; set; } = string.Empty; + public int ExpNeeded { get; set; } + + public ICollection Players { get; set; } = new List(); + public ICollection MissionRankRules { get; set; } = new List(); + public ICollection RankMissionRules { get; set; } = new List(); + public ICollection RankSkillRules { get; set; } = new List(); +} diff --git a/Models/Database/RankMissionRule.cs b/Models/Database/RankMissionRule.cs new file mode 100644 index 0000000..2ac2432 --- /dev/null +++ b/Models/Database/RankMissionRule.cs @@ -0,0 +1,10 @@ +namespace GamificationService.Models.Database; + +public class RankMissionRule +{ + public long Id { get; set; } + public long RankId { get; set; } + public Rank Rank { get; set; } = null!; + public long MissionId { get; set; } + public Mission Mission { get; set; } = null!; +} diff --git a/Models/Database/RankSkillRule.cs b/Models/Database/RankSkillRule.cs new file mode 100644 index 0000000..19cd4b9 --- /dev/null +++ b/Models/Database/RankSkillRule.cs @@ -0,0 +1,11 @@ +namespace GamificationService.Models.Database; + +public class RankSkillRule +{ + public long Id { get; set; } + public long RankId { get; set; } + public Rank Rank { get; set; } = null!; + public long SkillId { get; set; } + public Skill Skill { get; set; } = null!; + public int Min { get; set; } +} diff --git a/Models/Database/Skill.cs b/Models/Database/Skill.cs new file mode 100644 index 0000000..1f4f43b --- /dev/null +++ b/Models/Database/Skill.cs @@ -0,0 +1,10 @@ +namespace GamificationService.Models.Database; + +public class Skill +{ + public long Id { get; set; } + public string Title { get; set; } = string.Empty; + public ICollection MissionSkillRewards { get; set; } = new List(); + public ICollection RankSkillRules { get; set; } = new List(); + public ICollection PlayerSkills { get; set; } = new List(); +}