239 lines
9.5 KiB
Python
239 lines
9.5 KiB
Python
#!/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-Type,raw模式时使用")
|
||
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="推荐的参数定义")
|