Exemplo n.º 1
0
        /// <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));
        }