Files
InsightRadar/backend/app/schemas/source_schema.py
2026-03-11 01:33:21 +08:00

69 lines
2.7 KiB
Python

# app/schemas/source_schema.py
from pydantic import BaseModel, ConfigDict, Field
from typing import Optional
from datetime import datetime
# 枚举
from app.models.models import SourceType
# ==========================================
# InfoSource (信息源) 相关的 Schemas
# ==========================================
class InfoSourceBase(BaseModel):
"""
信息源的基础 Schema,包含各个操作通用的字段。
使用 Field() 可以为 Swagger UI 接口文档提供明确的注释和校验规则。
"""
source_name: str = Field(..., max_length=100, description="信息源名称,例如:微博热搜、知乎热榜", examples=["微博热搜"])
source_type: SourceType = Field(default=SourceType.API, description="抓取方式枚举")
home_url: Optional[str] = Field(default=None, max_length=255, description="平台主页或接口的基础URL", examples=["weibo"])
is_enabled: bool = Field(default=True, description="是否启用该信息源的定时抓取")
class InfoSourceCreate(InfoSourceBase):
"""
创建信息源 (POST) 时接收的请求体。
目前直接继承 Base 即可,如果以后有“只有创建时才能传的字段”,可以写在这里。
"""
pass
class InfoSourceUpdate(BaseModel):
"""
更新信息源 (PATCH/PUT) 时接收的请求体。
更新时,所有的字段都应该是可选的 (Optional),因为前端可能只想改其中一个字段。
"""
source_name: Optional[str] = Field(default=None, max_length=100)
source_type: Optional[SourceType] = None
home_url: Optional[str] = Field(default=None, max_length=255)
is_enabled: Optional[bool] = None
class InfoSourceResponse(InfoSourceBase):
"""
返回给前端的响应体格式 (GET 或 POST/PATCH 成功后的返回)。
包含了数据库自动生成的 ID 和时间戳字段。
"""
id: int = Field(..., description="数据库主键ID")
created_at: datetime = Field(..., description="创建时间")
updated_at: datetime = Field(..., description="最后一次更新时间")
# 核心配置:告诉 Pydantic,允许传入 SQLAlchemy 的 ORM 类实例并自动提取属性
model_config = ConfigDict(from_attributes=True)
# ==========================================
# 分页响应包装器 (泛型设计,方便以后复用)
# ==========================================
from typing import Generic, TypeVar, List
T = TypeVar("T")
class PaginatedResponse(BaseModel, Generic[T]):
"""
通用的列表响应格式,带总数统计,方便前端分页。
"""
total: int = Field(..., description="符合条件的数据总条数")
data: List[T] = Field(..., description="当前页的数据列表")