""" 知识页面相关的 Pydantic Schema """ from __future__ import annotations from datetime import datetime from typing import Any, Optional from pydantic import BaseModel, Field class PageCreate(BaseModel): """创建知识页面请求""" title: str = Field(..., max_length=500, description="页面标题") content: str = Field(..., description="页面正文内容") source_file: Optional[str] = Field(None, max_length=500, description="来源文件名") course_name: Optional[str] = Field(None, max_length=200, description="课程名称") teacher_name: Optional[str] = Field(None, max_length=100, description="讲师名称") live_date: Optional[str] = Field(None, max_length=20, description="直播日期 (YYYY-MM-DD)") page_number: Optional[int] = Field(None, description="原始页码") metadata_json: Optional[str] = Field(None, description="额外元数据 (JSON)") class PageUpdate(BaseModel): """更新知识页面请求(所有字段可选)""" title: Optional[str] = Field(None, max_length=500, description="页面标题") content: Optional[str] = Field(None, description="页面正文内容") course_name: Optional[str] = Field(None, max_length=200, description="课程名称") teacher_name: Optional[str] = Field(None, max_length=100, description="讲师名称") live_date: Optional[str] = Field(None, max_length=20, description="直播日期") page_number: Optional[int] = Field(None, description="原始页码") metadata_json: Optional[str] = Field(None, description="额外元数据") class PageResponse(BaseModel): """知识页面响应""" id: int title: str content: str source_file: Optional[str] = None course_name: Optional[str] = None teacher_name: Optional[str] = None live_date: Optional[str] = None page_number: Optional[int] = None metadata_json: Optional[str] = None created_at: datetime updated_at: datetime model_config = {"from_attributes": True} class PageListResponse(BaseModel): """知识页面列表响应(带分页)""" total: int = Field(..., description="总记录数") page: int = Field(..., description="当前页码") page_size: int = Field(..., description="每页数量") items: list[PageResponse] = Field(default_factory=list, description="页面列表") class PageDetailResponse(PageResponse): """知识页面详情响应(包含分块信息)""" chunks: list[dict[str, Any]] = Field(default_factory=list, description="关联的分块列表")