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)$") allowed_databases: Optional[List[str]] = Field( default=None, description="允许访问的数据库名列表,为空表示关联实例的所有库", ) # Legacy field kept for backward compatibility permissions: Optional[List[str]] = None is_active: bool = True # New: instance ids by access_type readonly_instance_ids: List[int] = Field(default_factory=list) write_instance_ids: List[int] = Field(default_factory=list) 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)$") 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 # New: instance ids by access_type readonly_instance_ids: Optional[List[int]] = None write_instance_ids: Optional[List[int]] = None class InstanceGroupResponse(BaseModel): id: int name: str description: Optional[str] = None db_type: str # Legacy field permissions: Optional[List[str]] = None # New fields allowed_databases: Optional[List[str]] = None is_active: bool created_at: Optional[datetime] = None updated_at: Optional[datetime] = None readonly_instance_count: int = 0 write_instance_count: int = 0 user_count: int = 0 model_config = ConfigDict(from_attributes=True) class InstanceGroupDetailResponse(InstanceGroupResponse): readonly_instances: List[dict] = [] write_instances: List[dict] = [] users: List[dict] = [] class InstanceAssignRequest(BaseModel): instance_ids: List[int] = Field(..., min_length=1) access_type: str = Field(default="readonly", pattern=r"^(readonly|write)$") class InstanceRemoveRequest(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)