diff --git a/litecord/blueprints/guilds.py b/litecord/blueprints/guilds.py index 8c4bbb6..295167d 100644 --- a/litecord/blueprints/guilds.py +++ b/litecord/blueprints/guilds.py @@ -4,7 +4,7 @@ from ..auth import token_check from ..snowflake import get_snowflake from ..enums import ChannelType from ..errors import Forbidden, GuildNotFound, BadRequest -from ..schemas import validate, GUILD_UPDATE +from ..schemas import validate, GUILD_CREATE, GUILD_UPDATE from .channels import channel_ack from .checks import guild_check @@ -160,7 +160,7 @@ async def create_guild(): the user creating it as the owner and making them join.""" user_id = await token_check() - j = await request.get_json() + j = validate(await request.get_json(), GUILD_CREATE) guild_id = get_snowflake() diff --git a/litecord/schemas.py b/litecord/schemas.py index 98f9134..342c87d 100644 --- a/litecord/schemas.py +++ b/litecord/schemas.py @@ -32,7 +32,7 @@ class LitecordValidator(Validator): return bool(USERNAME_REGEX.match(value)) def _validate_type_email(self, value: str) -> bool: - """Validate against the username regex.""" + """Validate against the email regex.""" return bool(EMAIL_REGEX.match(value)) def _validate_type_b64_icon(self, value: str) -> bool: @@ -114,7 +114,13 @@ def validate(reqjson: Union[Dict, List], schema: Dict, """ validator = LitecordValidator(schema) - if not validator.validate(reqjson): + try: + valid = validator.validate(reqjson) + except Exception: + log.exception('Error while validating') + raise Exception(f'Error while validating: {reqjson}') + + if not valid: errs = validator.errors log.warning('Error validating doc {!r}: {!r}', reqjson, errs) @@ -163,19 +169,25 @@ USER_UPDATE = { } PARTIAL_ROLE_GUILD_CREATE = { - 'name': {'type': 'role_name'}, - 'color': {'type': 'number', 'default': 0}, - 'hoist': {'type': 'boolean', 'default': False}, + 'type': 'dict', + 'schema': { + 'name': {'type': 'role_name'}, + 'color': {'type': 'number', 'default': 0}, + 'hoist': {'type': 'boolean', 'default': False}, - # NOTE: no position on partial role (on guild create) + # NOTE: no position on partial role (on guild create) - 'permissions': {'coerce': Permissions, 'required': False}, - 'mentionable': {'type': 'boolean', 'default': False}, + 'permissions': {'coerce': Permissions, 'required': False}, + 'mentionable': {'type': 'boolean', 'default': False}, + } } PARTIAL_CHANNEL_GUILD_CREATE = { - 'name': {'type': 'channel_name'}, - 'type': {'type': 'channel_type'} + 'type': 'dict', + 'schema': { + 'name': {'type': 'channel_name'}, + 'type': {'type': 'channel_type'}, + } } GUILD_CREATE = { @@ -244,57 +256,60 @@ MESSAGE_CREATE = { GW_ACTIVITY = { - 'name': {'type': 'string', 'required': True}, - 'type': {'type': 'activity_type', 'required': True}, + 'type': 'dict', + 'schema': { + 'name': {'type': 'string', 'required': True}, + 'type': {'type': 'activity_type', 'required': True}, - 'url': {'type': 'string', 'required': False, 'nullable': True}, + 'url': {'type': 'string', 'required': False, 'nullable': True}, - 'timestamps': { - 'type': 'dict', - 'required': False, - 'schema': { - 'start': {'type': 'number', 'required': True}, - 'end': {'type': 'number', 'required': True}, + 'timestamps': { + 'type': 'dict', + 'required': False, + 'schema': { + 'start': {'type': 'number', 'required': True}, + 'end': {'type': 'number', 'required': False}, + }, }, - }, - 'application_id': {'type': 'snowflake', 'required': False, - 'nullable': False}, - 'details': {'type': 'string', 'required': False, 'nullable': True}, - 'state': {'type': 'string', 'required': False, 'nullable': True}, + 'application_id': {'type': 'snowflake', 'required': False, + 'nullable': False}, + 'details': {'type': 'string', 'required': False, 'nullable': True}, + 'state': {'type': 'string', 'required': False, 'nullable': True}, - 'party': { - 'type': 'dict', - 'required': False, - 'schema': { - 'id': {'type': 'snowflake', 'required': False}, - 'size': {'type': 'list', 'required': False}, - } - }, + 'party': { + 'type': 'dict', + 'required': False, + 'schema': { + 'id': {'type': 'snowflake', 'required': False}, + 'size': {'type': 'list', 'required': False}, + } + }, - 'assets': { - 'type': 'dict', - 'required': False, - 'schema': { - 'large_image': {'type': 'snowflake', 'required': False}, - 'large_text': {'type': 'string', 'required': False}, - 'small_image': {'type': 'snowflake', 'required': False}, - 'small_text': {'type': 'string', 'required': False}, - } - }, + 'assets': { + 'type': 'dict', + 'required': False, + 'schema': { + 'large_image': {'type': 'snowflake', 'required': False}, + 'large_text': {'type': 'string', 'required': False}, + 'small_image': {'type': 'snowflake', 'required': False}, + 'small_text': {'type': 'string', 'required': False}, + } + }, - 'secrets': { - 'type': 'dict', - 'required': False, - 'schema': { - 'join': {'type': 'string', 'required': False}, - 'spectate': {'type': 'string', 'required': False}, - 'match': {'type': 'string', 'required': False}, - } - }, + 'secrets': { + 'type': 'dict', + 'required': False, + 'schema': { + 'join': {'type': 'string', 'required': False}, + 'spectate': {'type': 'string', 'required': False}, + 'match': {'type': 'string', 'required': False}, + } + }, - 'instance': {'type': 'boolean', 'required': False}, - 'flags': {'type': 'number', 'required': False}, + 'instance': {'type': 'boolean', 'required': False}, + 'flags': {'type': 'number', 'required': False}, + } } GW_STATUS_UPDATE = {