reworked role management to work with flex roles
This commit is contained in:
parent
73441d920f
commit
f86451268d
2 changed files with 80 additions and 57 deletions
|
@ -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)
|
||||
{
|
||||
if (!IsSignUpAllowed(liebUserId, plannedRoleId, signUpType))
|
||||
|
@ -101,21 +61,31 @@ namespace Lieb.Data
|
|||
return;
|
||||
}
|
||||
using var context = _contextFactory.CreateDbContext();
|
||||
context.RaidSignUps.Add(new RaidSignUp()
|
||||
|
||||
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())
|
||||
{
|
||||
GuildWars2AccountId = guildWars2AccountId,
|
||||
RaidId = raidId,
|
||||
LiebUserId = liebUserId,
|
||||
PlannedRaidRoleId = plannedRoleId,
|
||||
SignUpType = signUpType
|
||||
});
|
||||
await context.SaveChangesAsync();
|
||||
await ChangeSignUpType(raidId, liebUserId, plannedRoleId, signUpType);
|
||||
}
|
||||
else if (!signUps.Where(r => r.PlannedRaidRoleId == plannedRoleId).Any())
|
||||
{
|
||||
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)
|
||||
public async Task SignOff(int raidId, int liebUserId, int plannedRoleId)
|
||||
{
|
||||
await ChangeSignUpType(raidId, liebUserId, plannedRoleId, SignUpType.SignedOff);
|
||||
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);
|
||||
await context.SaveChangesAsync();
|
||||
}
|
||||
|
@ -140,10 +110,25 @@ namespace Lieb.Data
|
|||
|
||||
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);
|
||||
signUp.PlannedRaidRoleId = plannedRoleId;
|
||||
signUp.SignUpType = signUpType;
|
||||
await context.SaveChangesAsync();
|
||||
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.SignUpType = signUpType;
|
||||
await context.SaveChangesAsync();
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
|
||||
PlannedRaidRole role = context.PlannedRaidRoles
|
||||
PlannedRaidRole? role = context.PlannedRaidRoles
|
||||
.FirstOrDefault(r => r.PlannedRaidRoleId == plannedRoleId);
|
||||
|
||||
if (role == null)
|
||||
|
@ -168,5 +153,43 @@ namespace Lieb.Data
|
|||
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue