Files
power-math/server/exceptions.py

91 lines
2.6 KiB
Python

"""
exceptions.py
Stores all API exceptions neatly for importing and usage elsewhere.
"""
from typing import Tuple
# TODO: Improve exception management to cut down needless class definitions.
# TODO: Add 'extra' message parameter to base APIException kwargs.
class APIException(Exception):
"""Exception from which all API-related exceptions are derived and formatted with"""
MESSAGE = "A generic unhandled API Exception has occurred."
def __init__(self, status_code: int = 500):
self.status_code = status_code
def json(self):
return {
'error': {
'code': self.status_code,
'message': self.MESSAGE
}
}
class UnspecifiedParam(APIException):
MESSAGE = 'This API Route requires a parameter that was not satisfied in the latest request.'
def __init__(self, status_code: int):
super().__init__(status_code)
def json(self):
return {
'error': {
'code': self.status_code,
'message': self.MESSAGE
}
}
class UnspecifiedQueryParam(APIException):
MESSAGE = 'This API Route requires a query parameter that was not satisfied in the latest request.'
def __init__(self, status_code: int):
super().__init__(status_code)
class UnspecifiedURIParam(APIException):
MESSAGE = 'This API Route requires a URI parameter that was not satisfied in the latest request.'
def __init__(self, status_code: int):
super().__init__(status_code)
class InvalidQueryParam(APIException):
def __init__(self, status_code: int, query_item: Tuple[str, str]):
super().__init__(status_code)
self.query_item = query_item
def json(self):
error = super().json()
error['error']['query'] = {'key': self.query_item[0], 'value': self.query_item[1]}
return error
class InvalidURIParam(APIException):
def __init__(self, status_code: int, route_param: str):
super().__init__(status_code)
self.route_param = route_param
def json(self):
error = super().json()
error['error']['param'] = self.route_param
return error
class InvalidQuestion(InvalidURIParam):
MESSAGE = "A invalid question was specified in the request URI and could not be resolved."
def __init__(self, *args, question):
super().__init__(*args, route_param=question)
class InvalidCategory(InvalidURIParam):
MESSAGE = "A invalid category was specified in the request URI and could not be resolved."
def __init__(self, status_code, category: str):
super().__init__(status_code, route_param=category)