47 lines
1.1 KiB
Python
47 lines
1.1 KiB
Python
from http.client import HTTPException
|
|
|
|
from starlette.responses import JSONResponse
|
|
from starlette.types import Scope, Receive, Send
|
|
|
|
|
|
class APIError(HTTPException):
|
|
status_code = 500
|
|
|
|
def __init__(self, message: str = ""):
|
|
super().__init__(self.status_code, message)
|
|
self._message = message
|
|
|
|
@property
|
|
def error_message(self) -> str:
|
|
if self._message:
|
|
return f"{type(self).__name__}: {self._message}"
|
|
|
|
return f"{type(self).__name__}"
|
|
|
|
async def asgi_response(self, scope: Scope, receive: Receive, send: Send):
|
|
r = JSONResponse({"error": self.error_message}, status_code=self.status_code)
|
|
return await r(scope, receive, send)
|
|
|
|
def response(self):
|
|
return JSONResponse({"error": self.error_message}, status_code=self.status_code)
|
|
|
|
|
|
class Unauthorized(APIError):
|
|
status_code = 401
|
|
|
|
|
|
class Forbidden(APIError):
|
|
status_code = 403
|
|
|
|
|
|
class NotFound(APIError):
|
|
status_code = 404
|
|
|
|
|
|
class AlreadyExists(APIError):
|
|
status_code = 409
|
|
|
|
|
|
class EndpointNotImplemented(APIError):
|
|
status_code = 501
|