146 lines
3.5 KiB
Python
146 lines
3.5 KiB
Python
"""
|
|
Data models for the USDA Vision Camera System API.
|
|
|
|
This module defines Pydantic models for API requests and responses.
|
|
"""
|
|
|
|
from typing import Dict, List, Optional, Any
|
|
from datetime import datetime
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class SystemStatusResponse(BaseModel):
|
|
"""System status response model"""
|
|
system_started: bool
|
|
mqtt_connected: bool
|
|
last_mqtt_message: Optional[str] = None
|
|
machines: Dict[str, Dict[str, Any]]
|
|
cameras: Dict[str, Dict[str, Any]]
|
|
active_recordings: int
|
|
total_recordings: int
|
|
uptime_seconds: Optional[float] = None
|
|
|
|
|
|
class MachineStatusResponse(BaseModel):
|
|
"""Machine status response model"""
|
|
name: str
|
|
state: str
|
|
last_updated: str
|
|
last_message: Optional[str] = None
|
|
mqtt_topic: Optional[str] = None
|
|
|
|
|
|
class CameraStatusResponse(BaseModel):
|
|
"""Camera status response model"""
|
|
name: str
|
|
status: str
|
|
is_recording: bool
|
|
last_checked: str
|
|
last_error: Optional[str] = None
|
|
device_info: Optional[Dict[str, Any]] = None
|
|
current_recording_file: Optional[str] = None
|
|
recording_start_time: Optional[str] = None
|
|
|
|
|
|
class RecordingInfoResponse(BaseModel):
|
|
"""Recording information response model"""
|
|
camera_name: str
|
|
filename: str
|
|
start_time: str
|
|
state: str
|
|
end_time: Optional[str] = None
|
|
file_size_bytes: Optional[int] = None
|
|
frame_count: Optional[int] = None
|
|
duration_seconds: Optional[float] = None
|
|
error_message: Optional[str] = None
|
|
|
|
|
|
class StartRecordingRequest(BaseModel):
|
|
"""Start recording request model"""
|
|
camera_name: str
|
|
filename: Optional[str] = None
|
|
|
|
|
|
class StartRecordingResponse(BaseModel):
|
|
"""Start recording response model"""
|
|
success: bool
|
|
message: str
|
|
filename: Optional[str] = None
|
|
|
|
|
|
class StopRecordingRequest(BaseModel):
|
|
"""Stop recording request model"""
|
|
camera_name: str
|
|
|
|
|
|
class StopRecordingResponse(BaseModel):
|
|
"""Stop recording response model"""
|
|
success: bool
|
|
message: str
|
|
duration_seconds: Optional[float] = None
|
|
|
|
|
|
class StorageStatsResponse(BaseModel):
|
|
"""Storage statistics response model"""
|
|
base_path: str
|
|
total_files: int
|
|
total_size_bytes: int
|
|
cameras: Dict[str, Dict[str, Any]]
|
|
disk_usage: Dict[str, Any]
|
|
|
|
|
|
class FileListRequest(BaseModel):
|
|
"""File list request model"""
|
|
camera_name: Optional[str] = None
|
|
start_date: Optional[str] = None
|
|
end_date: Optional[str] = None
|
|
limit: Optional[int] = Field(default=100, le=1000)
|
|
|
|
|
|
class FileListResponse(BaseModel):
|
|
"""File list response model"""
|
|
files: List[Dict[str, Any]]
|
|
total_count: int
|
|
|
|
|
|
class CleanupRequest(BaseModel):
|
|
"""Cleanup request model"""
|
|
max_age_days: Optional[int] = None
|
|
|
|
|
|
class CleanupResponse(BaseModel):
|
|
"""Cleanup response model"""
|
|
files_removed: int
|
|
bytes_freed: int
|
|
errors: List[str]
|
|
|
|
|
|
class EventResponse(BaseModel):
|
|
"""Event response model"""
|
|
event_type: str
|
|
source: str
|
|
data: Dict[str, Any]
|
|
timestamp: str
|
|
|
|
|
|
class WebSocketMessage(BaseModel):
|
|
"""WebSocket message model"""
|
|
type: str
|
|
data: Dict[str, Any]
|
|
timestamp: Optional[str] = None
|
|
|
|
|
|
class ErrorResponse(BaseModel):
|
|
"""Error response model"""
|
|
error: str
|
|
details: Optional[str] = None
|
|
timestamp: str = Field(default_factory=lambda: datetime.now().isoformat())
|
|
|
|
|
|
class SuccessResponse(BaseModel):
|
|
"""Success response model"""
|
|
success: bool = True
|
|
message: str
|
|
data: Optional[Dict[str, Any]] = None
|
|
timestamp: str = Field(default_factory=lambda: datetime.now().isoformat())
|