From 87c68fbcf77c0f1d46c3c097f5a3e7486de038a6 Mon Sep 17 00:00:00 2001 From: "t.ruspekhofer" Date: Fri, 25 Feb 2022 00:24:08 +0100 Subject: [PATCH] reworked sign up allowed check --- Lieb/Data/RaidService.cs | 61 +++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 26 deletions(-) diff --git a/Lieb/Data/RaidService.cs b/Lieb/Data/RaidService.cs index 48f5aaa..0933ede 100644 --- a/Lieb/Data/RaidService.cs +++ b/Lieb/Data/RaidService.cs @@ -96,19 +96,20 @@ namespace Lieb.Data public async Task SignUp(int raidId, int liebUserId, int guildWars2AccountId, int plannedRoleId, SignUpType signUpType) { - if ((await GetFreeRoles(raidId)).Where(r => r.PlannedRaidRoleId == plannedRoleId).Any() || signUpType == SignUpType.Backup || signUpType == SignUpType.Flex) + if (!IsSignUpAllowed(liebUserId, plannedRoleId, signUpType)) { - using var context = _contextFactory.CreateDbContext(); - context.RaidSignUps.Add(new RaidSignUp() - { - GuildWars2AccountId = guildWars2AccountId, - RaidId = raidId, - LiebUserId = liebUserId, - PlannedRaidRoleId = plannedRoleId, - SignUpType = signUpType - }); - await context.SaveChangesAsync(); + return; } + using var context = _contextFactory.CreateDbContext(); + context.RaidSignUps.Add(new RaidSignUp() + { + GuildWars2AccountId = guildWars2AccountId, + RaidId = raidId, + LiebUserId = liebUserId, + PlannedRaidRoleId = plannedRoleId, + SignUpType = signUpType + }); + await context.SaveChangesAsync(); } public async Task SignOff(int raidId, int liebUserId) @@ -132,32 +133,40 @@ namespace Lieb.Data public async Task ChangeSignUpType(int raidId, int liebUserId, int plannedRoleId, SignUpType signUpType) { - bool roleIsAvailable = (await GetFreeRoles(raidId)).Where(r => r.PlannedRaidRoleId == plannedRoleId).Any(); - if (!roleIsAvailable && signUpType == SignUpType.SignedUp) + if (!IsSignUpAllowed(liebUserId, plannedRoleId, signUpType)) { return; } using var context = _contextFactory.CreateDbContext(); - //allow changing to Maybe if already signed up - if (!roleIsAvailable && signUpType == SignUpType.Maybe) - { - Raid raid = await context.Raids - .Include(r => r.SignUps) - .FirstOrDefaultAsync(r => r.RaidId != raidId); - RaidSignUp sign = raid.SignUps.FirstOrDefault(s => s.LiebUserId == liebUserId && s.SignUpType != SignUpType.Flex && s.SignUpType != SignUpType.SignedOff); - if(!(sign.SignUpType == SignUpType.SignedUp && sign.PlannedRaidRoleId == plannedRoleId)) - { - return; - } - } - RaidSignUp signUp = await context.RaidSignUps.FirstOrDefaultAsync(x => x.RaidId == raidId && x.LiebUserId == liebUserId && x.SignUpType != SignUpType.SignedOff && x.SignUpType != SignUpType.Flex); signUp.PlannedRaidRoleId = plannedRoleId; signUp.SignUpType = signUpType; await context.SaveChangesAsync(); } + public bool IsSignUpAllowed(int liebUserId, int plannedRoleId, SignUpType signUpType) + { + if(signUpType == SignUpType.Backup || signUpType == SignUpType.Flex || signUpType == SignUpType.SignedOff) + { + return true; + } + + using var context = _contextFactory.CreateDbContext(); + + List signUps = context.RaidSignUps.Where(s => s.PlannedRaidRoleId == plannedRoleId).ToList(); + + PlannedRaidRole role = context.PlannedRaidRoles + .FirstOrDefault(r => r.PlannedRaidRoleId == plannedRoleId); + + if (role == null) + return false; + + if(signUps.Count(s => s.SignUpType == SignUpType.SignedUp) < role.Spots) + return true; + + return signUps.Where(s => s.LiebUserId == liebUserId && s.SignUpType == SignUpType.SignedUp).Any(); + } } }