admin_api.users: add PATCH /api/v6/admin/users/:id

- admin_schemas: add USER_UPDATE
 - users: return a tuple with public and private user dicts on
    mass_user_update()
This commit is contained in:
Luna 2019-04-21 17:29:21 -03:00
parent 3dc2e01c28
commit 9aaac5d994
3 changed files with 29 additions and 5 deletions

View File

@ -17,7 +17,7 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
""" """
from litecord.enums import Feature from litecord.enums import Feature, UserFlags
VOICE_SERVER = { VOICE_SERVER = {
'hostname': {'type': 'string', 'maxlength': 255, 'required': True} 'hostname': {'type': 'string', 'maxlength': 255, 'required': True}
@ -54,3 +54,7 @@ INSTANCE_INVITE = {
GUILD_UPDATE = { GUILD_UPDATE = {
'unavailable': {'type': 'boolean', 'required': False} 'unavailable': {'type': 'boolean', 'required': False}
} }
USER_UPDATE = {
'flags': {'required': False, 'coerce': UserFlags}
}

View File

@ -22,10 +22,12 @@ from quart import Blueprint, jsonify, current_app as app, request
from litecord.auth import admin_check from litecord.auth import admin_check
from litecord.blueprints.auth import create_user from litecord.blueprints.auth import create_user
from litecord.schemas import validate from litecord.schemas import validate
from litecord.admin_schemas import USER_CREATE from litecord.admin_schemas import USER_CREATE, USER_UPDATE
from litecord.errors import BadRequest from litecord.errors import BadRequest
from litecord.utils import async_map from litecord.utils import async_map
from litecord.blueprints.users import delete_user, user_disconnect from litecord.blueprints.users import (
delete_user, user_disconnect, mass_user_update
)
bp = Blueprint('users_admin', __name__) bp = Blueprint('users_admin', __name__)
@ -116,3 +118,21 @@ async def _delete_single_user(user_id: int):
'old': old_user, 'old': old_user,
'new': new_user 'new': new_user
}) })
@bp.route('/<int:user_id>', methods=['PATCH'])
async def patch_user(user_id: int):
await admin_check()
j = validate(await request.get_json(), USER_UPDATE)
# TODO: finish, at least flags.
# TODO: we MUST have a check so that users don't
# privilege escalate other users to the staff badge, since
# that just grants access to the admin api.
if 'flags' in j:
pass
# TODO: decide if we return the public or private user.
_public_user, private_user = await mass_user_update(user_id, app)
return jsonify(private_user)

View File

@ -83,7 +83,7 @@ async def mass_user_update(user_id, app_=None):
'lazy_guild', guild_ids, 'update_user', user_id 'lazy_guild', guild_ids, 'update_user', user_id
) )
return private_user return public_user, private_user
@bp.route('/@me', methods=['GET']) @bp.route('/@me', methods=['GET'])
@ -257,7 +257,7 @@ async def patch_me():
user.pop('password_hash') user.pop('password_hash')
private_user = await mass_user_update(user_id, app) _, private_user = await mass_user_update(user_id, app)
return jsonify(private_user) return jsonify(private_user)