from datetime import datetime from typing import Optional, List from pydantic import BaseModel, ConfigDict, Field 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)$") 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)$") permissions: Optional[List[str]] = None is_active: Optional[bool] = None class InstanceGroupResponse(BaseModel): id: int name: str description: Optional[str] = None db_type: str permissions: 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)