diff --git a/Lieb/Data/DbInitializer.cs b/Lieb/Data/DbInitializer.cs index 19003ab..ce0471b 100644 --- a/Lieb/Data/DbInitializer.cs +++ b/Lieb/Data/DbInitializer.cs @@ -12,24 +12,49 @@ namespace Lieb.Data return; // DB has been seeded } - UserRole admin = new UserRole(); - admin.RoleName = Constants.Roles.Admin; - UserRole guildLead = new UserRole(); - guildLead.RoleName = Constants.Roles.GuildLead; - UserRole member = new UserRole(); - member.RoleName = Constants.Roles.User; + List roles = new List(); + foreach (string roleName in Constants.Roles.GetAllRoles()) + { + LiebRole role = new LiebRole() + { + RoleName = roleName + }; + roles.Add(role); + } + + context.LiebRoles.AddRange(roles); + context.SaveChanges(); var users = new LiebUser[] { - new LiebUser{DiscordUserId=0, Name="Sarah",Birthday=DateTime.Parse("1992-01-15"), Roles=new List(){admin}}, - new LiebUser{DiscordUserId=1, Name="Lisa",Birthday=DateTime.Parse("1991-02-15"), Roles=new List(){guildLead} }, - new LiebUser{DiscordUserId=2, Name="Simon",Birthday=DateTime.Parse("2019-09-01"), Roles=new List(){member}} + new LiebUser{DiscordUserId=194863625477816321, Name="Sarah", Birthday=DateTime.Parse("1992-01-15")}, + new LiebUser{DiscordUserId=1, Name="Lisa"}, + new LiebUser{DiscordUserId=2, Name="Simon"} }; context.LiebUsers.AddRange(users); context.SaveChanges(); + + var assignments = new RoleAssignment[] + { + new RoleAssignment{LiebUserId = users[0].LiebUserId, LiebRoleId = roles.FirstOrDefault(x => x.RoleName == Constants.Roles.Admin).LiebRoleId }, + new RoleAssignment{LiebUserId = users[0].LiebUserId, LiebRoleId = roles.FirstOrDefault(x => x.RoleName == Constants.Roles.GuildLead).LiebRoleId }, + new RoleAssignment{LiebUserId = users[0].LiebUserId, LiebRoleId = roles.FirstOrDefault(x => x.RoleName == Constants.Roles.RaidLead).LiebRoleId }, + new RoleAssignment{LiebUserId = users[0].LiebUserId, LiebRoleId = roles.FirstOrDefault(x => x.RoleName == Constants.Roles.User).LiebRoleId }, + new RoleAssignment{LiebUserId = users[1].LiebUserId, LiebRoleId = roles.FirstOrDefault(x => x.RoleName == Constants.Roles.Admin).LiebRoleId }, + new RoleAssignment{LiebUserId = users[1].LiebUserId, LiebRoleId = roles.FirstOrDefault(x => x.RoleName == Constants.Roles.GuildLead).LiebRoleId }, + new RoleAssignment{LiebUserId = users[1].LiebUserId, LiebRoleId = roles.FirstOrDefault(x => x.RoleName == Constants.Roles.RaidLead).LiebRoleId }, + new RoleAssignment{LiebUserId = users[1].LiebUserId, LiebRoleId = roles.FirstOrDefault(x => x.RoleName == Constants.Roles.User).LiebRoleId }, + new RoleAssignment{LiebUserId = users[2].LiebUserId, LiebRoleId = roles.FirstOrDefault(x => x.RoleName == Constants.Roles.GuildLead).LiebRoleId }, + new RoleAssignment{LiebUserId = users[2].LiebUserId, LiebRoleId = roles.FirstOrDefault(x => x.RoleName == Constants.Roles.RaidLead).LiebRoleId }, + new RoleAssignment{LiebUserId = users[2].LiebUserId, LiebRoleId = roles.FirstOrDefault(x => x.RoleName == Constants.Roles.User).LiebRoleId } + }; + + context.RoleAssignments.AddRange(assignments); + context.SaveChanges(); + } } } diff --git a/Lieb/Data/LiebContext.cs b/Lieb/Data/LiebContext.cs index bd99fb8..6324c42 100644 --- a/Lieb/Data/LiebContext.cs +++ b/Lieb/Data/LiebContext.cs @@ -14,7 +14,8 @@ namespace Lieb.Data } public DbSet LiebUsers { get; set; } - public DbSet UserRoles { get; set; } + public DbSet RoleAssignments { get; set; } + public DbSet LiebRoles { get; set; } public DbSet GuildWars2Account { get; set; } public DbSet Equipped { get; set; } public DbSet RaidRoles { get; set; } @@ -28,7 +29,8 @@ namespace Lieb.Data protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity().ToTable("LiebUser"); - modelBuilder.Entity().ToTable("UserRole"); + modelBuilder.Entity().ToTable("RoleAssignment"); + modelBuilder.Entity().ToTable("LiebRole"); modelBuilder.Entity().ToTable("GuildWars2Account"); modelBuilder.Entity().ToTable("Equipped"); modelBuilder.Entity().ToTable("GuildWars2Build"); diff --git a/Lieb/DiscordOAuth2/DiscordHandler.cs b/Lieb/DiscordOAuth2/DiscordHandler.cs index 4a87e01..9e33314 100644 --- a/Lieb/DiscordOAuth2/DiscordHandler.cs +++ b/Lieb/DiscordOAuth2/DiscordHandler.cs @@ -37,16 +37,46 @@ namespace Discord.OAuth2 await Events.CreatingTicket(context); - LiebUser? user = await _LiebDbcontext.LiebUsers.Include(u => u.Roles).FirstOrDefaultAsync(m => m.DiscordUserId == 1); - if (user != null) - { - foreach (UserRole role in user.Roles) - { - context.Identity.AddClaim(new Claim(Constants.ClaimType, role.RoleName)); - } - } + //debug + //context.Identity.AddClaim(new Claim(Constants.ClaimType, Constants.Roles.User)); + + context = await ManageUserRights(context); return new AuthenticationTicket(context.Principal, context.Properties, Scheme.Name); } + + private async Task ManageUserRights(OAuthCreatingTicketContext context) + { + ulong discordId = ulong.Parse(context.Identity.Claims.Where(x => x.Type == ClaimTypes.NameIdentifier).FirstOrDefault().Value); + LiebUser? user = await _LiebDbcontext.LiebUsers.Include(u => u.RoleAssignments).ThenInclude(r => r.LiebRole).FirstOrDefaultAsync(m => m.DiscordUserId == discordId); + if (user != null) + { + if (user.BannedUntil == null || user.BannedUntil < DateTime.UtcNow) + { + foreach (RoleAssignment role in user.RoleAssignments) + { + context.Identity.AddClaim(new Claim(Constants.ClaimType, role.LiebRole.RoleName)); + } + } + } + else + { + LiebRole standardRole = await _LiebDbcontext.LiebRoles.FirstOrDefaultAsync(m => m.RoleName == Constants.Roles.User); + LiebUser newUser = new LiebUser(); + newUser.DiscordUserId = discordId; + _LiebDbcontext.LiebUsers.Add(newUser); + await _LiebDbcontext.SaveChangesAsync(); + RoleAssignment roleAssignment = new RoleAssignment() + { + LiebRoleId = standardRole.LiebRoleId, + LiebUserId = newUser.LiebUserId + }; + _LiebDbcontext.RoleAssignments.Add(roleAssignment); + await _LiebDbcontext.SaveChangesAsync(); + + context.Identity.AddClaim(new Claim(Constants.ClaimType, Constants.Roles.User)); + } + return context; + } } } diff --git a/Lieb/Models/GuildWars2/Equipped.cs b/Lieb/Models/GuildWars2/Equipped.cs index dfb73e9..97e0581 100644 --- a/Lieb/Models/GuildWars2/Equipped.cs +++ b/Lieb/Models/GuildWars2/Equipped.cs @@ -7,8 +7,8 @@ public bool CanTank { get; set; } public int GuildWars2AccountId { get; set; } - public int RaidRoleId { get; set; } - public GuildWars2Account GuildWars2Account { get; set; } = new GuildWars2Account(); - public GuildWars2Build RaidRole { get; set; } = new GuildWars2Build(); + public int GuildWars2BuildId { get; set; } + public GuildWars2Account GuildWars2Account { get; set; } + public GuildWars2Build GuildWars2Build { get; set; } } } diff --git a/Lieb/Models/GuildWars2/Raid/RaidSignUp.cs b/Lieb/Models/GuildWars2/Raid/RaidSignUp.cs index f15d8b2..b67901c 100644 --- a/Lieb/Models/GuildWars2/Raid/RaidSignUp.cs +++ b/Lieb/Models/GuildWars2/Raid/RaidSignUp.cs @@ -14,15 +14,15 @@ public int RaidSignUpId { get; set; } public int RaidId { get; set; } - public int UserId { get; set; } + public int LiebUserId { get; set; } public int GuildWars2AccountId { get; set; } public int PlannedRaidRoleId { get; set; } public SignUpType SignUpType { get; set; } public Raid Raid { get; set; } - public LiebUser User { get; set; } = new LiebUser(); - public GuildWars2Account GuildWars2Account { get; set; } = new GuildWars2Account(); - public PlannedRaidRole PlannedRaidRole { get; set; } = new PlannedRaidRole(); + public LiebUser LiebUser { get; set; } + public GuildWars2Account GuildWars2Account { get; set; } + public PlannedRaidRole PlannedRaidRole { get; set; } } } diff --git a/Lieb/Models/LiebRole.cs b/Lieb/Models/LiebRole.cs new file mode 100644 index 0000000..aafdda2 --- /dev/null +++ b/Lieb/Models/LiebRole.cs @@ -0,0 +1,11 @@ +namespace Lieb.Models +{ + public class LiebRole + { + public int LiebRoleId { get; set; } + + public string RoleName { get; set; } = string.Empty; + + public ICollection RoleAssignments { get; set; } = new List(); + } +} diff --git a/Lieb/Models/LiebUser.cs b/Lieb/Models/LiebUser.cs index 60c9111..4ae1358 100644 --- a/Lieb/Models/LiebUser.cs +++ b/Lieb/Models/LiebUser.cs @@ -9,7 +9,8 @@ namespace Lieb.Models public string Name { get; set; } = string.Empty; public string Pronouns { get; set; } = string.Empty; public DateTime? Birthday { get; set; } + public DateTime? BannedUntil { get; set; } public ICollection GuildWars2Accounts { get; set; } = new List(); - public ICollection Roles { get; set; } = new List(); + public ICollection RoleAssignments { get; set; } = new List(); } } diff --git a/Lieb/Models/RoleAssignment.cs b/Lieb/Models/RoleAssignment.cs new file mode 100644 index 0000000..a5ca62c --- /dev/null +++ b/Lieb/Models/RoleAssignment.cs @@ -0,0 +1,13 @@ +namespace Lieb.Models +{ + public class RoleAssignment + { + public int RoleAssignmentId { get; set; } + + + public int LiebRoleId { get; set; } + public int LiebUserId { get; set; } + public LiebRole LiebRole { get; set; } + public LiebUser LiebUser { get; set; } + } +} diff --git a/Lieb/Models/UserRole.cs b/Lieb/Models/UserRole.cs deleted file mode 100644 index 49f48ef..0000000 --- a/Lieb/Models/UserRole.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Lieb.Models -{ - public class UserRole - { - public int UserRoleId { get; set; } - - public string RoleName { get; set; } = string.Empty; - } -}