164 lines
5.4 KiB
Python
164 lines
5.4 KiB
Python
from fastapi import HTTPException
|
|
from fastapi.encoders import jsonable_encoder
|
|
from pydantic import ValidationError
|
|
from starlette.responses import JSONResponse
|
|
|
|
from core.exceptions import SoftDeletedException, RecordNotFoundException, ModifiedCountException, ValidationException
|
|
|
|
|
|
class ResponseModel:
|
|
def __init__(self, data, code=200, message="ok"):
|
|
self.data = data
|
|
self.code = code
|
|
self.message = message
|
|
|
|
def __str__(self):
|
|
return str(self.data)
|
|
|
|
def __iter__(self):
|
|
return {
|
|
"data": self.data,
|
|
"code": self.code,
|
|
"message": self.message,
|
|
}
|
|
|
|
|
|
class ResponseBadRequest(ResponseModel):
|
|
def __init__(self, data, message="Bad Request"):
|
|
super().__init__(data, 400, message)
|
|
|
|
|
|
class ResponseValidationRequest(ResponseModel):
|
|
def __init__(self, data, message="Bad Request"):
|
|
super().__init__(data, 422, message)
|
|
|
|
|
|
class ResponseWriteErrorRequest(ResponseModel):
|
|
def __init__(self, data, message="Request write error"):
|
|
super().__init__(data, 400, message)
|
|
|
|
|
|
class ResponseNotFound(ResponseModel):
|
|
def __init__(self, data, message="Not Found"):
|
|
super().__init__(data, 404, message)
|
|
|
|
|
|
class ResponseUnauthorized(ResponseModel):
|
|
def __init__(self, data, message="Unauthorized"):
|
|
super().__init__(data, 401, message)
|
|
|
|
|
|
class ResponseInternalServerError(ResponseModel):
|
|
def __init__(self, data, message="Internal Server Error"):
|
|
super().__init__(data, 500, message)
|
|
|
|
|
|
class ResponseOk(ResponseModel):
|
|
def __init__(self, data, code=200, message="ok"):
|
|
super().__init__(data, code, message)
|
|
|
|
|
|
class ResponseOkUpdate(ResponseOk):
|
|
def __init__(self, data, message="update was successful"):
|
|
super().__init__(data, 200, message)
|
|
|
|
|
|
class ResponseOkCreate(ResponseOk):
|
|
def __init__(self, data, message="create was successful"):
|
|
super().__init__(data, 201, message)
|
|
|
|
|
|
class Res:
|
|
|
|
@staticmethod
|
|
def json(object, status_code):
|
|
return JSONResponse(content=jsonable_encoder(object), status_code=status_code)
|
|
|
|
@staticmethod
|
|
def create(data, message="create was successful"):
|
|
return Res.json(ResponseOkCreate(data, message), 201)
|
|
|
|
@staticmethod
|
|
def fetch(data, message="fetch was successful"):
|
|
return Res.json(ResponseOk(data, 200, message), 200)
|
|
|
|
@staticmethod
|
|
def update(data, message="update was successful"):
|
|
return Res.json(ResponseOkUpdate(data, message), 200)
|
|
|
|
@staticmethod
|
|
def not_found(data, message="Not Found"):
|
|
return Res.json(ResponseNotFound(data, message), 404)
|
|
|
|
@staticmethod
|
|
def unauthorized(data, message="Unauthorized"):
|
|
return Res.json(ResponseUnauthorized(data, message), 401)
|
|
|
|
@staticmethod
|
|
def server_error(data, message="Internal Server Error"):
|
|
return Res.json(ResponseInternalServerError(data, message), 500)
|
|
|
|
@staticmethod
|
|
def bad_request(data, message="Bad Request"):
|
|
return Res.json(ResponseBadRequest(data, message), 400)
|
|
|
|
@staticmethod
|
|
def validation_error(data, message="data validation error"):
|
|
return Res.json(ResponseValidationRequest(data, message), 422)
|
|
|
|
@staticmethod
|
|
def write_error(data, message="Request write error"):
|
|
return Res.json(ResponseWriteErrorRequest(data, message), 400)
|
|
|
|
@staticmethod
|
|
def delete_error(data, message="Request delete error"):
|
|
return Res.json(ResponseWriteErrorRequest(data, message), 400)
|
|
|
|
|
|
def to_http_res(res, _type, message=None):
|
|
if _type == "create":
|
|
return Res.create(res, "create was successful")
|
|
elif _type == "fetch":
|
|
return Res.fetch(res, "fetch was successful")
|
|
elif _type == "update":
|
|
return Res.update(res, "update was successful")
|
|
elif _type == "delete":
|
|
return Res.update(res, "delete was successful")
|
|
elif _type == "get":
|
|
return Res.fetch(res, "get was successful")
|
|
elif _type == "upload":
|
|
return Res.fetch(res, "upload complete")
|
|
elif _type == "token":
|
|
return Res.fetch(res, "token was generated")
|
|
else:
|
|
return Res.fetch(res, "response ok")
|
|
|
|
|
|
def http_exception(res):
|
|
_return = None
|
|
# if isinstance(res, ResponseBadRequest):
|
|
# _return = HTTPException(status_code=res.code, detail=res.message)
|
|
# elif isinstance(res, ResponseNotFound):
|
|
# _return = HTTPException(status_code=res.code, detail=res.message)
|
|
# elif isinstance(res, ResponseUnauthorized):
|
|
# _return = HTTPException(status_code=res.code, detail=res.message)
|
|
# elif isinstance(res, ResponseInternalServerError):
|
|
# _return = HTTPException(status_code=res.code, detail=res.message)
|
|
if isinstance(res, SoftDeletedException):
|
|
_return = Res.delete_error(res, res.message)
|
|
elif isinstance(res, RecordNotFoundException):
|
|
_return = Res.not_found(res, res.message)
|
|
elif isinstance(res, ModifiedCountException):
|
|
_return = Res.write_error(res, res.message)
|
|
elif isinstance(res, ValidationError):
|
|
_return = Res.validation_error(res.errors())
|
|
elif isinstance(res, AssertionError):
|
|
_return = Res.validation_error(res, message=res)
|
|
elif isinstance(res, ValidationException):
|
|
_return = Res.validation_error(res.message, message=res.message)
|
|
elif isinstance(res, HTTPException):
|
|
_return = Res.bad_request(res.status_code, message=res.detail)
|
|
else:
|
|
_return = Res.server_error(res, f'unknown error: {str(res)} {type(res)}')
|
|
return _return
|