Files
2024-02-15 00:17:51 +03:30

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