CoolBotDataSys/api/middleware/response.py

56 lines
1.6 KiB
Python
Raw Permalink Normal View History

"""统一响应格式封装"""
from typing import Any, Optional, Generic, TypeVar
from pydantic import BaseModel
from datetime import datetime
T = TypeVar("T")
class ApiResponse(BaseModel, Generic[T]):
"""统一 API 响应格式"""
code: int = 0
message: str = "success"
data: Optional[T] = None
timestamp: str = ""
def __init__(self, code: int = 0, message: str = "success", data: T = None, **kwargs):
super().__init__(
code=code,
message=message,
data=data,
timestamp=datetime.now().isoformat() + "Z"
)
@classmethod
def success(cls, data: T = None, message: str = "success"):
return cls(code=0, message=message, data=data)
@classmethod
def error(cls, code: int = 50000, message: str = "Internal error"):
return cls(code=code, message=message, data=None)
class PaginatedData(BaseModel, Generic[T]):
"""分页数据封装"""
items: list[T]
total: int
page: int
page_size: int
total_pages: int
pagination: dict
@classmethod
def create(cls, items: list, page: int = 1, page_size: int = 20, total: int = 0):
total_pages = (total + page_size - 1) // page_size if page_size > 0 else 0
return cls(
items=items,
total=total,
page=page,
page_size=page_size,
total_pages=total_pages,
pagination={
"page": page,
"page_size": page_size,
"total": total,
"total_pages": total_pages
}
)