Un-nested some ifs and made the initializing of the RolePermissions data hopefully more readable.

This commit is contained in:
Hipposgrumm 2025-10-19 11:26:12 -06:00
parent 890b62c10a
commit 67732b63e9

View File

@ -9,54 +9,79 @@ using GroupMember = sodoff.Model.GroupMember;
namespace sodoff.Controllers.Common; namespace sodoff.Controllers.Common;
public class GroupController : Controller { public class GroupController : Controller {
private static readonly List<RolePermission> RolePermissions; // Any permission that is commented out is not implemented.
private static readonly List<string> PermissionsMember = [
static GroupController() { //"Delete Own Msg",
RolePermissions = new List<RolePermission>(); //"Post Message"
for (GroupType type = GroupType.Public; type <= GroupType.Private; type++) { ];
// Anything commented out is not implemented. private static readonly List<string> PermissionsElder = [
RolePermissions.Add(new RolePermission { //"Invite",
GroupType = type, "Approve Join Request",
Role = UserRole.Member, //"Post News",
Permissions = [ //"Delete Own Msg",
"Delete Own Msg", //"Delete Any Msg",
//"Post Message" //"Delete News",
] //"Post Message",
}); "Remove Member"
RolePermissions.Add(new RolePermission { ];
GroupType = type, private static readonly List<string> PermissionsLeader = [
Role = UserRole.Elder, //"Invite",
Permissions = [ "Approve Join Request",
//"Invite", "Assign Leader",
"Approve Join Request", "Assign Elder",
//"Post News", "Demote Elder",
//"Delete Own Msg", "Edit Group",
//"Delete Any Msg", //"Post News",
//"Delete News", //"Delete Own Msg",
//"Post Message", //"Delete Any Msg",
"Remove Member" //"Delete News",
] //"Post Message",
}); "Remove Member"
RolePermissions.Add(new RolePermission { ];
GroupType = type,
Role = UserRole.Leader, private static readonly List<RolePermission> RolePermissions = [
Permissions = [ new RolePermission {
//"Invite", GroupType = GroupType.Public,
"Approve Join Request", Role = UserRole.Member,
"Assign Leader", Permissions = PermissionsMember
"Assign Elder", }, new RolePermission {
"Demote Elder", GroupType = GroupType.Public,
"Edit Group", Role = UserRole.Elder,
//"Post News", Permissions = PermissionsElder
//"Delete Own Msg", }, new RolePermission {
//"Delete Any Msg", GroupType = GroupType.Public,
//"Delete News", Role = UserRole.Leader,
//"Post Message", Permissions = PermissionsLeader
"Remove Member" },
]
}); new RolePermission {
GroupType = GroupType.MembersOnly,
Role = UserRole.Member,
Permissions = PermissionsMember
}, new RolePermission {
GroupType = GroupType.MembersOnly,
Role = UserRole.Elder,
Permissions = PermissionsElder
}, new RolePermission {
GroupType = GroupType.MembersOnly,
Role = UserRole.Leader,
Permissions = PermissionsLeader
},
new RolePermission {
GroupType = GroupType.Private,
Role = UserRole.Member,
Permissions = PermissionsMember
}, new RolePermission {
GroupType = GroupType.Private,
Role = UserRole.Elder,
Permissions = PermissionsElder
}, new RolePermission {
GroupType = GroupType.Private,
Role = UserRole.Leader,
Permissions = PermissionsLeader
} }
} ];
public static readonly Schema.Group EMD_Dragons = new Schema.Group { public static readonly Schema.Group EMD_Dragons = new Schema.Group {
GroupID = "8e68214a-c801-4759-8461-d01f28484134", GroupID = "8e68214a-c801-4759-8461-d01f28484134",
@ -215,44 +240,44 @@ public class GroupController : Controller {
JoinGroupRequest request = XmlUtil.DeserializeXml<JoinGroupRequest>(groupJoinRequest); JoinGroupRequest request = XmlUtil.DeserializeXml<JoinGroupRequest>(groupJoinRequest);
Model.Group? group = ctx.Groups.FirstOrDefault(g => g.GroupID.ToString() == request.GroupID.ToUpper()); Model.Group? group = ctx.Groups.FirstOrDefault(g => g.GroupID.ToString() == request.GroupID.ToUpper());
if (group != null) { if (group == null) return Ok(new GroupJoinResult { Success = false, Status = JoinGroupStatus.Error });
if (group.Type >= GroupType.Private) { if (group.Type >= GroupType.Private) {
return Ok(new GroupJoinResult { Success = false, Status = JoinGroupStatus.GroupTypeIsNotPublic }); return Ok(new GroupJoinResult { Success = false, Status = JoinGroupStatus.GroupTypeIsNotPublic });
}
GroupMember? existing = viking.GroupRoles.FirstOrDefault(g => g.Group.GameID == gameId);
if (existing != null) {
if (existing.Group == group)
return Ok(new GroupJoinResult { Success = false, Status = JoinGroupStatus.UserAlreadyMemberOfTheGroup });
existing.Group.Vikings.Remove(existing);
if (!existing.Group.Vikings.Any()) ctx.Groups.Remove(existing.Group);
}
if (group.Type == GroupType.MembersOnly) {
if (!group.JoinRequests.Any(r => r.Viking == viking))
group.JoinRequests.Add(new GroupJoinRequest {
Group = group,
Viking = viking,
//Message = request.Message // For future implemention, once moderation is possible.
});
ctx.SaveChanges();
return Ok(new GroupJoinResult { Success = false, Status = JoinGroupStatus.JoinRequestPending });
}
if (group.Vikings.Count < group.MaxMemberLimit) {
GroupMember joinee = new GroupMember {
Viking = viking,
Group = group,
UserRole = UserRole.Member,
JoinDate = DateTime.Now
};
group.Vikings.Add(joinee);
group.LastActiveTime = joinee.JoinDate;
ctx.SaveChanges();
return Ok(new GroupJoinResult { Success = true, Status = JoinGroupStatus.Success });
} else {
return Ok(new GroupJoinResult { Success = false, Status = JoinGroupStatus.GroupIsFull });
}
} }
return Ok(new GroupJoinResult { Success = false, Status = JoinGroupStatus.Error });
GroupMember? existing = viking.GroupRoles.FirstOrDefault(g => g.Group.GameID == gameId);
if (existing != null) {
if (existing.Group == group)
return Ok(new GroupJoinResult { Success = false, Status = JoinGroupStatus.UserAlreadyMemberOfTheGroup });
existing.Group.Vikings.Remove(existing);
if (!existing.Group.Vikings.Any()) ctx.Groups.Remove(existing.Group);
}
if (group.Type == GroupType.MembersOnly) {
if (!group.JoinRequests.Any(r => r.Viking == viking))
group.JoinRequests.Add(new GroupJoinRequest {
Group = group,
Viking = viking,
//Message = request.Message // For future implemention, once moderation is possible.
});
ctx.SaveChanges();
return Ok(new GroupJoinResult { Success = false, Status = JoinGroupStatus.JoinRequestPending });
}
if (group.Vikings.Count >= group.MaxMemberLimit)
return Ok(new GroupJoinResult { Success = false, Status = JoinGroupStatus.GroupIsFull });
GroupMember joinee = new GroupMember {
Viking = viking,
Group = group,
UserRole = UserRole.Member,
JoinDate = DateTime.Now
};
group.Vikings.Add(joinee);
group.LastActiveTime = joinee.JoinDate;
ctx.SaveChanges();
return Ok(new GroupJoinResult { Success = true, Status = JoinGroupStatus.Success });
} }
[HttpPost] [HttpPost]
@ -262,24 +287,20 @@ public class GroupController : Controller {
public IActionResult LeaveGroup(Viking viking, [FromForm] string groupLeaveRequest) { public IActionResult LeaveGroup(Viking viking, [FromForm] string groupLeaveRequest) {
LeaveGroupRequest request = XmlUtil.DeserializeXml<LeaveGroupRequest>(groupLeaveRequest); LeaveGroupRequest request = XmlUtil.DeserializeXml<LeaveGroupRequest>(groupLeaveRequest);
GroupMember? vikingRole = viking.GroupRoles.FirstOrDefault(g => g.Group.GroupID.ToString() == request.GroupID); GroupMember? vikingRole = viking.GroupRoles.FirstOrDefault(g => g.Group.GroupID.ToString() == request.GroupID);
if (vikingRole != null) { if (vikingRole == null) return Ok(new LeaveGroupResult { Success = false, Status = LeaveGroupStatus.Error });
GroupMember? targetRole = null; GroupMember? targetRole;
if (viking.Uid.ToString().Equals(request.UserID, StringComparison.CurrentCultureIgnoreCase)) { if (viking.Uid.ToString().Equals(request.UserID, StringComparison.CurrentCultureIgnoreCase)) {
targetRole = vikingRole.Group.Vikings.FirstOrDefault(gv => gv.Viking == viking); targetRole = vikingRole.Group.Vikings.FirstOrDefault(gv => gv.Viking == viking);
} else if (vikingRole.UserRole >= UserRole.Elder) { } else if (vikingRole.UserRole >= UserRole.Elder) {
targetRole = vikingRole.Group.Vikings.FirstOrDefault(gv => gv.Viking.Uid.ToString() == request.UserID); targetRole = vikingRole.Group.Vikings.FirstOrDefault(gv => gv.Viking.Uid.ToString() == request.UserID);
} else { } else return Ok(new LeaveGroupResult { Success = false, Status = LeaveGroupStatus.Error });
return Ok(new LeaveGroupResult { Success = false, Status = LeaveGroupStatus.Error });
} if (targetRole == null)
if (targetRole != null) {
vikingRole.Group.Vikings.Remove(targetRole);
if (!vikingRole.Group.Vikings.Any()) ctx.Groups.Remove(vikingRole.Group);
ctx.SaveChanges();
return Ok(new LeaveGroupResult { Success = true, Status = LeaveGroupStatus.Success });
}
return Ok(new LeaveGroupResult { Success = false, Status = LeaveGroupStatus.UserNotAMemberOfTheGroup }); return Ok(new LeaveGroupResult { Success = false, Status = LeaveGroupStatus.UserNotAMemberOfTheGroup });
} vikingRole.Group.Vikings.Remove(targetRole);
return Ok(new LeaveGroupResult { Success = false, Status = LeaveGroupStatus.Error }); if (!vikingRole.Group.Vikings.Any()) ctx.Groups.Remove(vikingRole.Group);
ctx.SaveChanges();
return Ok(new LeaveGroupResult { Success = true, Status = LeaveGroupStatus.Success });
} }
[HttpPost] [HttpPost]
@ -336,20 +357,20 @@ public class GroupController : Controller {
public IActionResult RemoveMember(Viking viking, [FromForm] string removeMemberRequest) { public IActionResult RemoveMember(Viking viking, [FromForm] string removeMemberRequest) {
RemoveMemberRequest request = XmlUtil.DeserializeXml<RemoveMemberRequest>(removeMemberRequest); RemoveMemberRequest request = XmlUtil.DeserializeXml<RemoveMemberRequest>(removeMemberRequest);
GroupMember? vikingRole = viking.GroupRoles.FirstOrDefault(g => g.Group.GroupID.ToString() == request.GroupID); GroupMember? vikingRole = viking.GroupRoles.FirstOrDefault(g => g.Group.GroupID.ToString() == request.GroupID);
if (vikingRole != null) { if (vikingRole == null)
if (vikingRole.UserRole < UserRole.Elder) { return Ok(new RemoveMemberResult { Success = false, Status = RemoveMemberStatus.Error });
return Ok(new RemoveMemberResult { Success = false, Status = RemoveMemberStatus.UserHasNoPermission });
} if (vikingRole.UserRole < UserRole.Elder)
GroupMember? targetRole = vikingRole.Group.Vikings.FirstOrDefault(gv => gv.Viking.Uid.ToString() == request.RemoveUserID); return Ok(new RemoveMemberResult { Success = false, Status = RemoveMemberStatus.UserHasNoPermission });
if (targetRole != null) {
vikingRole.Group.Vikings.Remove(targetRole); GroupMember? targetRole = vikingRole.Group.Vikings.FirstOrDefault(gv => gv.Viking.Uid.ToString() == request.RemoveUserID);
if (!vikingRole.Group.Vikings.Any()) ctx.Groups.Remove(vikingRole.Group); if (targetRole == null)
ctx.SaveChanges();
return Ok(new RemoveMemberResult { Success = true, Status = RemoveMemberStatus.Success });
}
return Ok(new RemoveMemberResult { Success = false, Status = RemoveMemberStatus.UserNotAMemberOfTheGroup }); return Ok(new RemoveMemberResult { Success = false, Status = RemoveMemberStatus.UserNotAMemberOfTheGroup });
}
return Ok(new RemoveMemberResult { Success = false, Status = RemoveMemberStatus.Error }); vikingRole.Group.Vikings.Remove(targetRole);
if (!vikingRole.Group.Vikings.Any()) ctx.Groups.Remove(vikingRole.Group);
ctx.SaveChanges();
return Ok(new RemoveMemberResult { Success = true, Status = RemoveMemberStatus.Success });
} }
[HttpPost] [HttpPost]
@ -361,43 +382,46 @@ public class GroupController : Controller {
AuthorizeJoinRequest request = XmlUtil.DeserializeXml<AuthorizeJoinRequest>(authorizeJoinRequest); AuthorizeJoinRequest request = XmlUtil.DeserializeXml<AuthorizeJoinRequest>(authorizeJoinRequest);
GroupMember? vikingRole = viking.GroupRoles.FirstOrDefault(g => g.Group.GroupID.ToString() == request.GroupID); GroupMember? vikingRole = viking.GroupRoles.FirstOrDefault(g => g.Group.GroupID.ToString() == request.GroupID);
if (vikingRole != null) { if (vikingRole == null)
if (vikingRole.UserRole < UserRole.Elder) { return Ok(new AuthorizeJoinResult { Success = false, Status = AuthorizeJoinStatus.ApproverNotInThisGroup });
return Ok(new AuthorizeJoinResult { Success = false, Status = AuthorizeJoinStatus.ApproverHasNoPermission });
} if (vikingRole.UserRole < UserRole.Elder)
Viking? target = ctx.Vikings.FirstOrDefault(v => v.Uid.ToString() == request.UserID); return Ok(new AuthorizeJoinResult { Success = false, Status = AuthorizeJoinStatus.ApproverHasNoPermission });
if (target != null) {
GroupMember? existing = target.GroupRoles.FirstOrDefault(gm => gm.Group.GameID == gameId); Viking? target = ctx.Vikings.FirstOrDefault(v => v.Uid.ToString() == request.UserID);
if (existing != null) { if (target == null) {
if (existing.Group == vikingRole.Group) { return Ok(new AuthorizeJoinResult { Success = false, Status = AuthorizeJoinStatus.Error });
return Ok(new AuthorizeJoinResult { Success = false, Status = AuthorizeJoinStatus.UserAlreadyMemberOfTheGroup });
} else {
return Ok(new AuthorizeJoinResult { Success = false, Status = AuthorizeJoinStatus.UserHasNoJoinRequest });
}
}
if (vikingRole.Group.Vikings.Count < vikingRole.Group.MaxMemberLimit) {
if (request.Approved) {
GroupMember joinee = new GroupMember {
Viking = target,
Group = vikingRole.Group,
UserRole = UserRole.Member,
JoinDate = DateTime.Now
};
vikingRole.Group.Vikings.Add(joinee);
vikingRole.Group.LastActiveTime = joinee.JoinDate;
}
GroupJoinRequest? joinRequest = ctx.GroupJoinRequests.Find(target.Id, vikingRole.GroupID);
if (joinRequest != null) ctx.GroupJoinRequests.Remove(joinRequest);
ctx.SaveChanges();
return Ok(new AuthorizeJoinResult { Success = true, Status = AuthorizeJoinStatus.Success });
} else {
return Ok(new AuthorizeJoinResult { Success = false, Status = AuthorizeJoinStatus.GroupIsFull });
}
} else {
return Ok(new AuthorizeJoinResult { Success = false, Status = AuthorizeJoinStatus.Error });
}
} }
return Ok(new AuthorizeJoinResult { Success = false, Status = AuthorizeJoinStatus.ApproverNotInThisGroup });
GroupMember? existing = target.GroupRoles.FirstOrDefault(gm => gm.Group.GameID == gameId);
if (existing != null) {
return Ok(new AuthorizeJoinResult {
Success = false,
Status = existing.Group == vikingRole.Group
? AuthorizeJoinStatus.UserAlreadyMemberOfTheGroup
: AuthorizeJoinStatus.UserHasNoJoinRequest
});
}
if (vikingRole.Group.Vikings.Count >= vikingRole.Group.MaxMemberLimit)
return Ok(new AuthorizeJoinResult { Success = false, Status = AuthorizeJoinStatus.GroupIsFull });
if (request.Approved) {
GroupMember joinee = new GroupMember {
Viking = target,
Group = vikingRole.Group,
UserRole = UserRole.Member,
JoinDate = DateTime.Now
};
vikingRole.Group.Vikings.Add(joinee);
vikingRole.Group.LastActiveTime = joinee.JoinDate;
}
GroupJoinRequest? joinRequest = ctx.GroupJoinRequests.Find(target.Id, vikingRole.GroupID);
if (joinRequest != null) ctx.GroupJoinRequests.Remove(joinRequest);
ctx.SaveChanges();
return Ok(new AuthorizeJoinResult { Success = true, Status = AuthorizeJoinStatus.Success });
} }
[HttpPost] [HttpPost]
@ -407,29 +431,35 @@ public class GroupController : Controller {
public IActionResult AssignRole(Viking viking, [FromForm] string assignRoleRequest) { public IActionResult AssignRole(Viking viking, [FromForm] string assignRoleRequest) {
AssignRoleRequest request = XmlUtil.DeserializeXml<AssignRoleRequest>(assignRoleRequest); AssignRoleRequest request = XmlUtil.DeserializeXml<AssignRoleRequest>(assignRoleRequest);
GroupMember? vikingRole = viking.GroupRoles.FirstOrDefault(g => g.Group.GroupID.ToString() == request.GroupID); GroupMember? vikingRole = viking.GroupRoles.FirstOrDefault(g => g.Group.GroupID.ToString() == request.GroupID);
if (vikingRole != null) { if (vikingRole == null)
if (vikingRole.UserRole < UserRole.Elder) { return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.ApproverNotMemberOfTheGroup });
if (vikingRole.UserRole < UserRole.Elder)
return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.ApproverHasNoPermission });
GroupMember? targetRole = vikingRole.Group.Vikings.FirstOrDefault(gv => gv.Viking.Uid.ToString() == request.MemberID);
if (targetRole == null)
return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.MemberNotPartOfTheGroup });
if (targetRole.UserRole == request.NewRole)
return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.MemberAlreadyInTheRole });
if (vikingRole.UserRole == UserRole.Leader) {
// Disallow leader from simply demoting themself.
if (viking == targetRole.Viking)
return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.ApproverHasNoPermission }); return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.ApproverHasNoPermission });
} } else if (viking != targetRole.Viking || request.NewRole > vikingRole.UserRole) {
GroupMember? targetRole = vikingRole.Group.Vikings.FirstOrDefault(gv => gv.Viking.Uid.ToString() == request.MemberID); // Disallow Elders from promoting themselves to leader, or promoting anyone else to elder, but allow them to demote themselves.
if (targetRole != null) { return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.ApproverHasNoPermission });
if (targetRole.UserRole == request.NewRole)
return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.MemberAlreadyInTheRole });
if (vikingRole.UserRole == UserRole.Leader) { // Disallow leader from simply demoting themself.
if (viking == targetRole.Viking)
return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.ApproverHasNoPermission });
} else if (viking != targetRole.Viking || request.NewRole > vikingRole.UserRole) { // Disallow Elders from promoting themselves to leader, or promoting anyone else to elder, but allow them to demote themselves.
return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.ApproverHasNoPermission });
}
targetRole.UserRole = request.NewRole;
if (request.NewRole == UserRole.Leader) vikingRole.UserRole = UserRole.Elder; // This is the only way a leader can demote themself.
ctx.SaveChanges();
return Ok(new AssignRoleResult { Success = true, Status = AssignRoleStatus.Success });
} else {
return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.MemberNotPartOfTheGroup });
}
} }
return Ok(new AssignRoleResult { Success = false, Status = AssignRoleStatus.ApproverNotMemberOfTheGroup });
targetRole.UserRole = request.NewRole;
if (request.NewRole == UserRole.Leader)
vikingRole.UserRole = UserRole.Elder; // This is the only way a leader can demote themself.
ctx.SaveChanges();
return Ok(new AssignRoleResult { Success = true, Status = AssignRoleStatus.Success });
} }
[HttpPost] [HttpPost]