Files
2026-06-08 18:14:59 +08:00

239 lines
9.5 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Data Source Schema - 数据源数据验证模式
"""
from datetime import datetime
from typing import Optional, List, Any, Dict
from pydantic import BaseModel, ConfigDict, Field
from app.base_schema import CSTDatetime
class DataSourceBase(BaseModel):
"""数据源基础Schema"""
application_id: Optional[str] = Field(None, description="所属应用ID")
name: str = Field(..., description="数据源名称")
code: str = Field(..., pattern=r"^[a-zA-Z][a-zA-Z0-9_]*$", description="数据源编码(字母开头,只能包含字母、数字和下划线)")
source_type: str = Field(default='static', description="数据源类型: api/sql/static")
description: str = Field(default='', description="描述说明")
status: bool = Field(default=True, description="是否启用")
# API 配置
api_url: str = Field(default='', description="API地址")
api_method: str = Field(default='GET', description="请求方法: GET/POST/PUT/DELETE/PATCH")
api_headers: Dict[str, str] = Field(default_factory=dict, description="请求头")
api_query_params: List[Dict[str, Any]] = Field(default_factory=list, description="Query参数列表")
api_body_type: str = Field(default='none', description="请求体类型: none/json/form-data/x-www-form-urlencoded/raw")
api_body: Dict[str, Any] = Field(default_factory=dict, description="请求体模板")
api_content_type: str = Field(default='', description="Content-Typeraw模式时使用")
api_timeout: int = Field(default=30, description="超时时间")
api_data_path: str = Field(default='', description="响应数据路径")
# API 认证配置
api_auth_type: str = Field(default='none', description="认证类型: none/bearer_token/basic_auth/api_key")
api_auth_config: Dict[str, Any] = Field(default_factory=dict, description="认证配置")
# API 高级配置
api_retry_count: int = Field(default=0, description="重试次数")
api_retry_interval: int = Field(default=1, description="重试间隔(秒)")
api_success_condition: Dict[str, Any] = Field(default_factory=dict, description="成功条件")
api_proxy: str = Field(default='', description="代理地址")
api_follow_redirects: bool = Field(default=True, description="是否跟随重定向")
api_verify_ssl: bool = Field(default=True, description="是否验证SSL证书")
# SQL 配置
sql_content: str = Field(default='', description="SQL语句")
db_connection: str = Field(default='default', description="数据库连接")
# 静态数据
static_data: List[Any] = Field(default_factory=list, description="静态数据")
# 参数定义
params: List[Dict[str, Any]] = Field(default_factory=list, description="参数定义")
# 结果处理
result_type: str = Field(default='list', description="结果类型")
tree_config: Dict[str, Any] = Field(default_factory=dict, description="树形配置")
field_mapping: Dict[str, str] = Field(default_factory=dict, description="字段映射")
chart_config: Dict[str, Any] = Field(default_factory=dict, description="图表配置")
# 缓存配置
cache_enabled: bool = Field(default=False, description="是否启用缓存")
cache_ttl: int = Field(default=300, description="缓存时间")
class DataSourceCreate(DataSourceBase):
"""数据源创建Schema"""
pass
class DataSourceUpdate(BaseModel):
"""数据源更新Schema"""
application_id: Optional[str] = None
name: Optional[str] = None
code: Optional[str] = Field(None, pattern=r"^[a-zA-Z][a-zA-Z0-9_]*$", description="数据源编码(字母开头,只能包含字母、数字和下划线)")
source_type: Optional[str] = None
description: Optional[str] = None
status: Optional[bool] = None
api_url: Optional[str] = None
api_method: Optional[str] = None
api_headers: Optional[Dict[str, str]] = None
api_query_params: Optional[List[Dict[str, Any]]] = None
api_body_type: Optional[str] = None
api_body: Optional[Dict[str, Any]] = None
api_content_type: Optional[str] = None
api_timeout: Optional[int] = None
api_data_path: Optional[str] = None
api_auth_type: Optional[str] = None
api_auth_config: Optional[Dict[str, Any]] = None
api_retry_count: Optional[int] = None
api_retry_interval: Optional[int] = None
api_success_condition: Optional[Dict[str, Any]] = None
api_proxy: Optional[str] = None
api_follow_redirects: Optional[bool] = None
api_verify_ssl: Optional[bool] = None
sql_content: Optional[str] = None
db_connection: Optional[str] = None
static_data: Optional[List[Any]] = None
params: Optional[List[Dict[str, Any]]] = None
result_type: Optional[str] = None
tree_config: Optional[Dict[str, Any]] = None
field_mapping: Optional[Dict[str, str]] = None
chart_config: Optional[Dict[str, Any]] = None
cache_enabled: Optional[bool] = None
cache_ttl: Optional[int] = None
class DataSourceResponse(DataSourceBase):
"""数据源响应Schema"""
id: str
sort: int = 0
is_deleted: bool = False
sys_create_datetime: Optional[CSTDatetime] = None
sys_update_datetime: Optional[CSTDatetime] = None
model_config = ConfigDict(from_attributes=True)
class DataSourceSimpleOut(BaseModel):
"""数据源简单输出(用于下拉选择)"""
id: str
application_id: Optional[str] = None
name: str
code: str
source_type: str
result_type: str = "list"
description: str = ""
model_config = ConfigDict(from_attributes=True)
class DataSourcePreviewRequest(BaseModel):
"""数据源预览请求"""
params: Dict[str, Any] = Field(default_factory=dict)
limit: int = Field(default=100, ge=1, le=1000)
class DataSourceExecuteRequest(BaseModel):
"""数据源执行请求"""
params: Dict[str, Any] = Field(default_factory=dict)
class DataSourceTestRequest(BaseModel):
"""数据源测试请求(临时配置)"""
source_type: str
# API 配置
api_url: str = ""
api_method: str = "GET"
api_headers: Dict[str, str] = Field(default_factory=dict)
api_query_params: List[Dict[str, Any]] = Field(default_factory=list)
api_body_type: str = "none"
api_body: Dict[str, Any] = Field(default_factory=dict)
api_content_type: str = ""
api_timeout: int = 30
api_data_path: str = ""
# API 认证
api_auth_type: str = "none"
api_auth_config: Dict[str, Any] = Field(default_factory=dict)
# API 高级
api_retry_count: int = 0
api_retry_interval: int = 1
api_success_condition: Dict[str, Any] = Field(default_factory=dict)
api_proxy: str = ""
api_follow_redirects: bool = True
api_verify_ssl: bool = True
# SQL 配置
sql_content: str = ""
db_connection: str = "default"
# 静态数据
static_data: List[Any] = Field(default_factory=list)
# 参数
params_def: List[Dict[str, Any]] = Field(default_factory=list)
params: Dict[str, Any] = Field(default_factory=dict)
# 结果处理
result_type: str = "list"
tree_config: Dict[str, Any] = Field(default_factory=dict)
field_mapping: Dict[str, str] = Field(default_factory=dict)
chart_config: Dict[str, Any] = Field(default_factory=dict)
class DataSourceCopyRequest(BaseModel):
"""数据源复制请求"""
new_code: str = Field(..., description="新编码")
new_name: str = Field(default="", description="新名称")
class DataSourceImportCheckIn(BaseModel):
"""数据源导入预检查请求"""
code: str = Field(..., description="数据源编码")
class DataSourceImportCheckOut(BaseModel):
"""数据源导入预检查结果"""
code_exists: bool = Field(..., description="数据源编码是否已存在")
can_import: bool = Field(..., description="是否可以直接导入(编码不冲突)")
class DataSourceImportIn(DataSourceBase):
"""数据源配置导入"""
pass
class TableRelation(BaseModel):
"""表关系定义"""
id: str = Field(default="", description="关系ID")
sourceTable: str = Field(..., description="源表名")
sourceField: str = Field(..., description="源字段名")
targetTable: str = Field(..., description="目标表名")
targetField: str = Field(..., description="目标字段名")
relationType: str = Field(default="many-to-one", description="关系类型")
class AIGenerateSqlRequest(BaseModel):
"""AI 生成 SQL 请求"""
model_config = ConfigDict(protected_namespaces=())
user_question: str = Field(..., description="用户问题(自然语言描述)")
db_connection: str = Field(default="default", description="数据库连接名称")
database: str = Field(default="", description="数据库名")
schema_name: str = Field(default="", description="Schema 名称")
selected_tables: List[str] = Field(default_factory=list, description="选中的表名列表")
table_fields: Dict[str, List[Dict[str, Any]]] = Field(default_factory=dict, description="表字段信息")
table_relations: List[TableRelation] = Field(default_factory=list, description="表关系列表")
include_table_relations: bool = Field(default=True, description="是否包含表关系信息")
model_id: str = Field(..., description="LLM 模型 ID")
class AIGenerateSqlResponse(BaseModel):
"""AI 生成 SQL 响应"""
sql: str = Field(..., description="生成的 SQL 语句")
thought: str = Field(default="", description="生成思路")
params: List[Dict[str, Any]] = Field(default_factory=list, description="推荐的参数定义")