from datetime import datetime from pydantic import BaseModel, Field from typing import Optional, Literal, List, Any class WorkflowStage(BaseModel): stage: str = Field(..., description="阶段名称,如:提交阶段、审核阶段、执行阶段") role: str = Field(..., description="角色,如:提交人、开发负责人、执行人") assignee: Optional[str] = Field(None, description="负责人用户名") class MaskFieldRule(BaseModel): table: str = Field(..., description="表名") field: str = Field(..., description="字段名") rule: str = Field(default="mask", description="脱敏规则:mask/hide/hash") class InstanceCreate(BaseModel): name: str = Field(..., min_length=1, max_length=100) db_type: Literal["mysql", "postgres", "redis", "mongo"] host: str = Field(..., min_length=1) port: int = Field(..., ge=1, le=65535) username: str = Field(..., min_length=1) password: str = Field(..., min_length=1) database: Optional[str] = None env: Literal["production", "staging", "development"] = "development" description: Optional[str] = None access_mode: Literal["readwrite", "read", "write"] = "readwrite" workflow: Optional[List[WorkflowStage]] = None excluded_databases: Optional[List[str]] = None mask_fields: Optional[List[MaskFieldRule]] = None class InstanceUpdate(BaseModel): name: Optional[str] = None host: Optional[str] = None port: Optional[int] = Field(default=None, ge=1, le=65535) username: Optional[str] = None password: Optional[str] = None database: Optional[str] = None env: Optional[Literal["production", "staging", "development"]] = None description: Optional[str] = None access_mode: Optional[Literal["readwrite", "read", "write"]] = None workflow: Optional[List[WorkflowStage]] = None excluded_databases: Optional[List[str]] = None mask_fields: Optional[List[MaskFieldRule]] = None class InstanceResponse(BaseModel): id: int name: str db_type: str host: str port: int username: str database: Optional[str] = None env: str description: Optional[str] = None status: str version: Optional[str] = None access_mode: str = "readwrite" workflow: Optional[List[dict]] = None excluded_databases: Optional[List[str]] = None mask_fields: Optional[List[dict]] = None created_at: datetime class Config: from_attributes = True class ConnectionTestResult(BaseModel): success: bool message: str version: Optional[str] = None