reworked role management to work with flex roles

This commit is contained in:
t.ruspekhofer 2022-02-25 19:10:43 +01:00
parent 73441d920f
commit f86451268d
2 changed files with 80 additions and 57 deletions

View file

@ -54,46 +54,6 @@ namespace Lieb.Data
} }
} }
public async Task<List<PlannedRaidRole>> GetFreeRoles(int raidId)
{
using var context = _contextFactory.CreateDbContext();
Raid? raid = await context.Raids
.Include(r => r.Roles)
.Include(r => r.SignUps)
.FirstOrDefaultAsync(r => r.RaidId == raidId);
List<PlannedRaidRole> freeRoles = new List<PlannedRaidRole>();
if (raid != null)
{
List<int> plannedRolesIds = raid.SignUps.Select(s => s.PlannedRaidRoleId).ToList();
Dictionary<int, int> addedIds = new Dictionary<int, int>();
foreach (RaidSignUp signUp in raid.SignUps)
{
if (signUp.SignUpType == SignUpType.SignedUp)
{
int id = signUp.PlannedRaidRoleId;
if (addedIds.ContainsKey(id))
{
addedIds[id] += 1;
}
else
{
addedIds.Add(id, 1);
}
}
}
foreach(PlannedRaidRole role in raid.Roles)
{
if(!addedIds.ContainsKey(role.PlannedRaidRoleId) || role.Spots > addedIds[role.PlannedRaidRoleId])
{
freeRoles.Add(role);
}
}
}
return freeRoles;
}
public async Task SignUp(int raidId, int liebUserId, int guildWars2AccountId, int plannedRoleId, SignUpType signUpType) public async Task SignUp(int raidId, int liebUserId, int guildWars2AccountId, int plannedRoleId, SignUpType signUpType)
{ {
if (!IsSignUpAllowed(liebUserId, plannedRoleId, signUpType)) if (!IsSignUpAllowed(liebUserId, plannedRoleId, signUpType))
@ -101,6 +61,14 @@ namespace Lieb.Data
return; return;
} }
using var context = _contextFactory.CreateDbContext(); using var context = _contextFactory.CreateDbContext();
List<RaidSignUp> signUps = context.RaidSignUps.Where(r => r.RaidId == raidId && r.LiebUserId == liebUserId).ToList();
if (signUpType != SignUpType.Flex && signUps.Where(r => r.SignUpType != SignUpType.Flex).Any())
{
await ChangeSignUpType(raidId, liebUserId, plannedRoleId, signUpType);
}
else if (!signUps.Where(r => r.PlannedRaidRoleId == plannedRoleId).Any())
{
context.RaidSignUps.Add(new RaidSignUp() context.RaidSignUps.Add(new RaidSignUp()
{ {
GuildWars2AccountId = guildWars2AccountId, GuildWars2AccountId = guildWars2AccountId,
@ -111,11 +79,13 @@ namespace Lieb.Data
}); });
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
}
public async Task SignOff(int raidId, int liebUserId) public async Task SignOff(int raidId, int liebUserId, int plannedRoleId)
{ {
await ChangeSignUpType(raidId, liebUserId, plannedRoleId, SignUpType.SignedOff);
using var context = _contextFactory.CreateDbContext(); using var context = _contextFactory.CreateDbContext();
List<RaidSignUp> signUps = context.RaidSignUps.Where(x => x.RaidId == raidId && x.LiebUserId == liebUserId).ToList(); List<RaidSignUp> signUps = context.RaidSignUps.Where(x => x.RaidId == raidId && x.LiebUserId == liebUserId && x.SignUpType == SignUpType.Flex).ToList();
context.RaidSignUps.RemoveRange(signUps); context.RaidSignUps.RemoveRange(signUps);
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
@ -140,11 +110,26 @@ namespace Lieb.Data
using var context = _contextFactory.CreateDbContext(); using var context = _contextFactory.CreateDbContext();
RaidSignUp signUp = await context.RaidSignUps.FirstOrDefaultAsync(x => x.RaidId == raidId && x.LiebUserId == liebUserId && x.SignUpType != SignUpType.SignedOff && x.SignUpType != SignUpType.Flex); List<RaidSignUp> signUps = context.RaidSignUps.Where(x => x.RaidId == raidId && x.LiebUserId == liebUserId).ToList();
RaidSignUp? signUp = signUps.FirstOrDefault(x => x.SignUpType != SignUpType.Flex);
RaidSignUp? flexSignUp = signUps.FirstOrDefault(x => x.SignUpType == SignUpType.Flex && x.PlannedRaidRoleId == plannedRoleId);
//change Flex to current role
if (flexSignUp != null && signUp != null)
{
flexSignUp.PlannedRaidRoleId = signUp.PlannedRaidRoleId;
await context.SaveChangesAsync();
}
//change to new role
if (signUp != null)
{
signUp.PlannedRaidRoleId = plannedRoleId; signUp.PlannedRaidRoleId = plannedRoleId;
signUp.SignUpType = signUpType; signUp.SignUpType = signUpType;
await context.SaveChangesAsync(); await context.SaveChangesAsync();
} }
}
public bool IsSignUpAllowed(int liebUserId, int plannedRoleId, SignUpType signUpType) public bool IsSignUpAllowed(int liebUserId, int plannedRoleId, SignUpType signUpType)
{ {
@ -157,7 +142,7 @@ namespace Lieb.Data
List<RaidSignUp> signUps = context.RaidSignUps.Where(s => s.PlannedRaidRoleId == plannedRoleId).ToList(); List<RaidSignUp> signUps = context.RaidSignUps.Where(s => s.PlannedRaidRoleId == plannedRoleId).ToList();
PlannedRaidRole role = context.PlannedRaidRoles PlannedRaidRole? role = context.PlannedRaidRoles
.FirstOrDefault(r => r.PlannedRaidRoleId == plannedRoleId); .FirstOrDefault(r => r.PlannedRaidRoleId == plannedRoleId);
if (role == null) if (role == null)
@ -168,5 +153,43 @@ namespace Lieb.Data
return signUps.Where(s => s.LiebUserId == liebUserId && s.SignUpType == SignUpType.SignedUp).Any(); return signUps.Where(s => s.LiebUserId == liebUserId && s.SignUpType == SignUpType.SignedUp).Any();
} }
public async Task<bool> IsSignUpAllowed(int raidId, int liebUserId, int plannedRoleId, SignUpType signUpType, bool moveFlexUser, List<int> checkedRoleIds)
{
if (IsSignUpAllowed(liebUserId, plannedRoleId, signUpType))
return true;
if (checkedRoleIds == null)
checkedRoleIds = new List<int>();
checkedRoleIds.Add(plannedRoleId);
using var context = _contextFactory.CreateDbContext();
Raid? raid = context.Raids
.Include(r => r.Roles)
.Include(r => r.SignUps)
.FirstOrDefault(r => r.RaidId == raidId);
if (raid == null)
{
return false;
}
foreach (int userId in raid.SignUps.Where(s => s.PlannedRaidRoleId == plannedRoleId && s.SignUpType == SignUpType.SignedUp).Select(s => s.LiebUserId))
{
foreach (RaidSignUp signUp in raid.SignUps.Where(s => s.LiebUserId == userId && s.SignUpType == SignUpType.Flex))
{
if (!checkedRoleIds.Contains(signUp.PlannedRaidRoleId)
&& await IsSignUpAllowed(raidId, userId, signUp.PlannedRaidRoleId, SignUpType.SignedUp, moveFlexUser, checkedRoleIds))
{
if (moveFlexUser)
{
await ChangeSignUpType(raidId, userId, signUp.PlannedRaidRoleId, SignUpType.SignedUp);
}
return true;
}
}
}
return false;
}
} }
} }

View file

@ -175,7 +175,7 @@
async Task SignOffClicked(PlannedRaidRole role, LiebUser liebUser) async Task SignOffClicked(PlannedRaidRole role, LiebUser liebUser)
{ {
await RaidService.SignOff(Raid.RaidId, liebUser.LiebUserId); await RaidService.SignOff(Raid.RaidId, liebUser.LiebUserId, role.PlannedRaidRoleId);
Raid = RaidService.GetRaid(Raid.RaidId); Raid = RaidService.GetRaid(Raid.RaidId);
} }