Files
opsxsql/backend/app/schemas/instance.py
T
logan 128de64592 feat: 数据源编辑加排除数据库+脱敏字段+审批流关联; 权限组Transfer改为选择实例
- EditInstanceDialog: 新增排除数据库(逗号分隔)、脱敏字段(动态表单+表/字段/规则)、审批流程关联
- Instance: workflow JSON字段改为workflow_id FK关联workflow_definitions表
- InstanceGroupPage: Transfer穿梭框从选数据库改为选实例(数据源)
- 后端instance API返回workflow_name, _get_workflow_names批量查询
- DB迁移: instances表添加workflow_id列
- 37个测试全部通过
2026-05-24 19:36:39 +08:00

75 lines
2.7 KiB
Python

from datetime import datetime
from pydantic import BaseModel, ConfigDict, 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_id: Optional[int] = Field(None, description="关联的审批流程ID")
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_id: Optional[int] = Field(default=None, description="关联的审批流程ID,设为0清除关联")
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_id: Optional[int] = None
workflow_name: Optional[str] = None
excluded_databases: Optional[List[str]] = None
mask_fields: Optional[List[dict]] = None
created_at: datetime
model_config = ConfigDict(from_attributes=True)
class ConnectionTestResult(BaseModel):
success: bool
message: str
version: Optional[str] = None