from datetime import datetime from typing import Optional, List from pydantic import BaseModel, ConfigDict, Field, field_validator class InstanceGroupCreate(BaseModel): name: str = Field(..., min_length=1, max_length=100) description: Optional[str] = None db_type: str = Field(default="all", pattern=r"^(mysql|redis|pg|mongo|all)$") access_type: str = Field( default="readonly", pattern=r"^(readonly|write)$", description="权限组类型: readonly(只读查看) / write(写入变更)", ) allowed_databases: Optional[List[str]] = Field( default=None, description="允许访问的数据库名列表,为空表示关联实例的所有库", ) # Legacy field kept for backward compatibility permissions: Optional[List[str]] = None is_active: bool = True class InstanceGroupUpdate(BaseModel): name: Optional[str] = Field(default=None, min_length=1, max_length=100) description: Optional[str] = None db_type: Optional[str] = Field(default=None, pattern=r"^(mysql|redis|pg|mongo|all)$") access_type: Optional[str] = Field( default=None, pattern=r"^(readonly|write)$", description="权限组类型: readonly(只读查看) / write(写入变更)", ) allowed_databases: Optional[List[str]] = Field( default=None, description="允许访问的数据库名列表,为空表示关联实例的所有库", ) # Legacy field kept for backward compatibility permissions: Optional[List[str]] = None is_active: Optional[bool] = None class InstanceGroupResponse(BaseModel): id: int name: str description: Optional[str] = None db_type: str # Legacy field permissions: Optional[List[str]] = None # New fields access_type: Optional[str] = None allowed_databases: Optional[List[str]] = None is_active: bool created_at: Optional[datetime] = None updated_at: Optional[datetime] = None instance_count: int = 0 user_count: int = 0 model_config = ConfigDict(from_attributes=True) class InstanceGroupDetailResponse(InstanceGroupResponse): instances: List[dict] = [] users: List[dict] = [] class InstanceAssignRequest(BaseModel): instance_ids: List[int] = Field(..., min_length=1) class UserAssignRequest(BaseModel): user_ids: List[int] = Field(..., min_length=1) permissions: Optional[List[str]] = None class UserGroupUpdateRequest(BaseModel): group_ids: List[int] = Field(default_factory=list)