/// <summary> /// Tries to delete this role /// </summary> public async Task <TaskResult <int> > TryDeleteAsync(ServerPlanetMember member, ValourDB db) { if (member == null) { return(new TaskResult <int>(false, "Member not found", 404)); } if (member.Planet_Id != Planet_Id) { return(new TaskResult <int>(false, "Member is of another planet", 403)); } if (!await member.HasPermissionAsync(PlanetPermissions.ManageRoles, db)) { return(new TaskResult <int>(false, "Member lacks PlanetPermissions.ManageRoles", 403)); } if (await member.GetAuthorityAsync() <= GetAuthority()) { return(new TaskResult <int>(false, "Member authority is lower than role authority", 403)); } Planet ??= await db.Planets.FindAsync(Planet_Id); if (Id == Planet.Default_Role_Id) { return(new TaskResult <int>(false, "Cannot remove default role", 400)); } // Remove all members var members = db.PlanetRoleMembers.Where(x => x.Role_Id == Id); db.PlanetRoleMembers.RemoveRange(members); // Remove role nodes var channelNodes = db.ChatChannelPermissionsNodes.Where(x => x.Role_Id == Id); var categoryNodes = db.CategoryPermissionsNodes.Where(x => x.Role_Id == Id); db.ChatChannelPermissionsNodes.RemoveRange(channelNodes); db.CategoryPermissionsNodes.RemoveRange(categoryNodes); // Remove self db.PlanetRoles.Remove(this); await db.SaveChangesAsync(); // Notify clients PlanetHub.NotifyRoleDeletion(this); return(new TaskResult <int>(true, "Removed role", 200)); }