from __future__ import annotations from typing import Any, Dict, Literal, Optional from pydantic import BaseModel, ConfigDict, Field class BaseRequest(BaseModel): """所有请求模型基类:默认允许额外字段,避免破坏兼容性。""" model_config = ConfigDict(extra="allow") class RunTaskRequest(BaseRequest): task_name: str = Field(..., min_length=1) date_string: Optional[str] = None class TaskListRequest(BaseRequest): page: int = Field(default=1, ge=1) size: int = Field(default=50, ge=1, le=200) sort_by: str = Field(default="id", min_length=1) sort_dir: str = Field(default="desc", min_length=1) id: Optional[int] = None date_string: Optional[str] = None trace_id: Optional[str] = None task_status: Optional[int] = None class GetCoverRequest(BaseRequest): """GetCoverService 的请求体字段不固定,先保持兼容。""" # 用一个可选字段占位,避免空模型在某些场景不好读 payload: Optional[Dict[str, Any]] = None class SaveTokenRequest(BaseRequest): """GzhCookieManager 的请求体字段不固定,先保持兼容。""" token: Optional[str] = None class LongArticlesMcpRequest(BaseRequest): """MCP 交互接口的请求体,按 task_name 可传不同参数。""" page: int = Field(default=1, ge=1, description="页码,从 1 开始") page_size: int = Field(default=20, ge=1, le=100, description="每页条数") sort_by: Optional[str] = Field(default=None, description="排序字段") sort_order: Optional[Literal["asc", "desc"]] = Field( default=None, description="排序方向: asc / desc" ) class DailyRankQueryRequest(BaseRequest): """日榜数据查询请求""" rank_date: Optional[str] = Field(default=None, description="榜单日期 YYYY-MM-DD") gh_id: Optional[str] = Field(default=None, description="公众号ID") account_name: Optional[str] = Field(default=None, description="账号名称") content_pool_type: Optional[str] = Field(default=None, description="内容池类型") strategy: Optional[str] = Field(default=None, description="排序策略") # 权重配置(前端可调整) weights: Optional[Dict[str, float]] = Field( default=None, description="分数权重配置,key为字段名,value为权重值", ) sort_by: str = Field(default="new_score", description="排序字段") sort_dir: str = Field(default="desc", description="排序方向") class ElasticSearchRequest(BaseRequest): """ES 搜索请求""" keywords: str = Field(..., min_length=1, description="搜索关键词") size: int = Field(default=10, ge=1, le=100, description="返回结果数量")