#!/usr/bin/env python3 # -*- coding: utf-8 -*- from typing import Any, Generic, TypeVar from fastapi import Response from pydantic import BaseModel, Field from common.response.response_code import CustomResponse, CustomResponseCode from utils.serializers import MsgSpecJSONResponse SchemaT = TypeVar('SchemaT') class ResponseModel(BaseModel): """ @router.get('/test', response_model=ResponseModel) def test(): return ResponseModel(data={'test': 'test'}) @router.get('/test') def test() -> ResponseModel: return ResponseModel(data={'test': 'test'}) @router.get('/test') def test() -> ResponseModel: res = CustomResponseCode.HTTP_200 return ResponseModel(code=res.code, msg=res.msg, data={'test': 'test'}) """ code: int = Field(CustomResponseCode.HTTP_200.code, description='Return status code') msg: str = Field(CustomResponseCode.HTTP_200.msg, description='Return message') data: Any | None = Field(None, description='Return data') class ResponseSchemaModel(ResponseModel, Generic[SchemaT]): """ @router.get('/test', response_model=ResponseSchemaModel[GetApiDetail]) def test(): return ResponseSchemaModel[GetApiDetail](data=GetApiDetail(...)) @router.get('/test') def test() -> ResponseSchemaModel[GetApiDetail]: return ResponseSchemaModel[GetApiDetail](data=GetApiDetail(...)) @router.get('/test') def test() -> ResponseSchemaModel[GetApiDetail]: res = CustomResponseCode.HTTP_200 return ResponseSchemaModel[GetApiDetail](code=res.code, msg=res.msg, data=GetApiDetail(...)) """ data: SchemaT class ResponseBase: """""" @staticmethod def __response( *, res: CustomResponseCode | CustomResponse = None, data: Any | None = None ) -> ResponseModel | ResponseSchemaModel: """" :param res: :param data: :return: """ return ResponseModel(code=res.code, msg=res.msg, data=data) def success( self, *, res: CustomResponseCode | CustomResponse = CustomResponseCode.HTTP_200, data: Any | None = None, ) -> ResponseModel | ResponseSchemaModel: """ :param res: :param data: :return: """ return self.__response(res=res, data=data) def fail( self, *, res: CustomResponseCode | CustomResponse = CustomResponseCode.HTTP_400, data: Any = None, ) -> ResponseModel | ResponseSchemaModel: """ :param res: :param data: :return: """ return self.__response(res=res, data=data) @staticmethod def fast_success( *, res: CustomResponseCode | CustomResponse = CustomResponseCode.HTTP_200, data: Any | None = None, ) -> Response: return MsgSpecJSONResponse({'code': res.code, 'msg': res.msg, 'data': data}) response_base: ResponseBase = ResponseBase()