from typing import Optional, List from pydantic import BaseModel, ConfigDict from datetime import datetime class UserCreate(BaseModel): username: str password: str class UserOut(BaseModel): id: int username: str role: str created_at: Optional[datetime] model_config = ConfigDict(from_attributes=True) class Token(BaseModel): access_token: str refresh_token: str token_type: str = "bearer" class TokenRefresh(BaseModel): refresh_token: str class LoginPayload(BaseModel): username: str password: str class HeartbeatPayload(BaseModel): hostname: str username: str os_info: Optional[str] = None local_ip: Optional[str] = None public_ip: Optional[str] = None uptime_sec: int cpu_percent: float ram_percent: float ram_total_gb: Optional[float] = None disk_info: Optional[List[dict]] = None cpu_temp: Optional[float] = None load_avg: Optional[str] = None processes: Optional[List[dict]] = None class HeartbeatOut(BaseModel): id: int timestamp: datetime username: Optional[str] local_ip: Optional[str] cpu_percent: Optional[float] ram_percent: Optional[float] cpu_temp: Optional[float] model_config = ConfigDict(from_attributes=True) class ComputerOut(BaseModel): id: int hostname: str os_info: Optional[str] first_seen: Optional[datetime] last_seen: Optional[datetime] status: str current_user: Optional[str] current_ip: Optional[str] current_cpu_percent: Optional[float] current_ram_percent: Optional[float] model_config = ConfigDict(from_attributes=True) class ComputerDetailOut(ComputerOut): heartbeats: List[HeartbeatOut] = [] class NotificationOut(BaseModel): id: int computer_id: Optional[int] type: str title: str message: str is_read: bool sent_at: Optional[datetime] read_at: Optional[datetime] model_config = ConfigDict(from_attributes=True)