from typing import List, Optional from pydantic import BaseModel, Field class SysAuthLoginRequest(BaseModel): username: str password: str class SysAuthMenuItem(BaseModel): menu_key: str parent_key: str = "" title: str title_en: str = "" menu_type: str = "item" route_path: str = "" icon: str = "" permission_key: str = "" sort_order: int = 100 children: List["SysAuthMenuItem"] = Field(default_factory=list) class SysAuthRolePayload(BaseModel): id: int = 0 role_key: str name: str class SysAuthUserPayload(BaseModel): id: int username: str display_name: str role: Optional[SysAuthRolePayload] = None class SysAssignedBotPayload(BaseModel): id: str name: str enabled: bool = True node_id: str = "" node_display_name: str = "" docker_status: str = "STOPPED" image_tag: str = "" class SysRoleSummaryResponse(BaseModel): id: int role_key: str name: str description: str = "" is_active: bool = True sort_order: int = 100 user_count: int = 0 menu_keys: List[str] = Field(default_factory=list) permission_keys: List[str] = Field(default_factory=list) class SysRoleListResponse(BaseModel): items: List[SysRoleSummaryResponse] = Field(default_factory=list) class SysRoleUpsertRequest(BaseModel): role_key: str name: str description: str = "" is_active: bool = True sort_order: int = 100 menu_keys: List[str] = Field(default_factory=list) permission_keys: List[str] = Field(default_factory=list) class SysRoleGrantMenuItem(BaseModel): menu_key: str parent_key: str = "" title: str title_en: str = "" menu_type: str = "item" route_path: str = "" icon: str = "" sort_order: int = 100 children: List["SysRoleGrantMenuItem"] = Field(default_factory=list) class SysPermissionSummaryResponse(BaseModel): id: int permission_key: str name: str menu_key: str = "" action: str = "view" description: str = "" sort_order: int = 100 class SysRoleGrantBootstrapResponse(BaseModel): menus: List[SysRoleGrantMenuItem] = Field(default_factory=list) permissions: List[SysPermissionSummaryResponse] = Field(default_factory=list) class SysUserSummaryResponse(BaseModel): id: int username: str display_name: str is_active: bool = True last_login_at: Optional[str] = None role: Optional[SysAuthRolePayload] = None bot_ids: List[str] = Field(default_factory=list) class SysUserListResponse(BaseModel): items: List[SysUserSummaryResponse] = Field(default_factory=list) class SysUserCreateRequest(BaseModel): username: str display_name: str password: str role_id: int is_active: bool = True bot_ids: List[str] = Field(default_factory=list) class SysUserUpdateRequest(BaseModel): display_name: str password: str = "" role_id: int is_active: bool = True bot_ids: List[str] = Field(default_factory=list) class SysProfileUpdateRequest(BaseModel): display_name: str password: str = "" class SysAuthBootstrapResponse(BaseModel): token: str = "" expires_at: Optional[str] = None user: SysAuthUserPayload menus: List[SysAuthMenuItem] = Field(default_factory=list) permissions: List[str] = Field(default_factory=list) home_path: str = "/dashboard" assigned_bots: List[SysAssignedBotPayload] = Field(default_factory=list) class SysAuthStatusResponse(BaseModel): enabled: bool = True user_count: int = 0 default_username: str = "admin" SysAuthMenuItem.model_rebuild() SysRoleGrantMenuItem.model_rebuild()