use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
use sqlx::types::Json;
use sqlx::FromRow;
#[derive(Debug, Clone, Serialize, FromRow)]
pub struct Event {
pub id: String,
pub camera_id: Option<String>,
pub site_id: Option<String>,
pub event_type: String,
pub severity: String,
pub timestamp: DateTime<Utc>,
pub payload: Json<Value>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Serialize, FromRow)]
pub struct AiTask {
pub id: String,
pub camera_id: String,
pub task_type: String,
pub enabled: bool,
pub stream_profile: String,
pub fps: f64,
pub width: i64,
pub config: Json<Value>,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Deserialize)]
pub struct AiTaskCreate {
pub task_type: String,
pub stream_profile: Option<String>,
pub fps: Option<f64>,
pub width: Option<i64>,
pub config: Option<Value>,
pub enabled: Option<bool>,
}
#[derive(Debug, Deserialize, Default)]
pub struct AiTaskUpdate {
pub task_type: Option<String>,
pub stream_profile: Option<String>,
pub fps: Option<f64>,
pub width: Option<i64>,
pub config: Option<Value>,
pub enabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, FromRow)]
pub struct Detection {
pub id: String,
pub camera_id: String,
pub task_type: String,
pub timestamp: DateTime<Utc>,
pub label: Option<String>,
pub confidence: Option<f64>,
pub bbox: Option<Json<Value>>,
pub track_id: Option<String>,
pub attributes: Json<Value>,
pub frame_id: Option<String>,
pub created_at: DateTime<Utc>,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct DetectionIngest {
pub label: Option<String>,
pub confidence: Option<f64>,
pub bbox: Option<Value>,
pub track_id: Option<String>,
pub attributes: Option<Value>,
}
#[derive(Debug, Deserialize)]
pub struct IngestEvent {
pub event_type: String,
pub severity: Option<String>,
pub payload: Option<Value>,
}
#[derive(Debug, Deserialize)]
pub struct AiIngest {
pub camera_id: String,
pub task_type: String,
pub timestamp: Option<String>,
pub frame_id: Option<String>,
#[serde(default)]
pub detections: Vec<DetectionIngest>,
pub event: Option<IngestEvent>,
}
#[derive(Debug, Clone, Serialize, FromRow)]
pub struct Zone {
pub id: String,
pub camera_id: String,
pub name: String,
pub kind: String,
pub polygon: Json<Value>,
pub dwell_seconds: f64,
pub labels: Json<Value>,
pub severity: String,
pub config: Json<Value>,
pub enabled: bool,
pub created_at: DateTime<Utc>,
pub updated_at: DateTime<Utc>,
}
#[derive(Debug, Deserialize)]
pub struct ZoneCreate {
pub name: String,
pub kind: Option<String>,
pub polygon: Value,
pub dwell_seconds: Option<f64>,
pub labels: Option<Value>,
pub severity: Option<String>,
pub config: Option<Value>,
pub enabled: Option<bool>,
}
#[derive(Debug, Deserialize, Default)]
pub struct ZoneUpdate {
pub name: Option<String>,
pub kind: Option<String>,
pub polygon: Option<Value>,
pub dwell_seconds: Option<f64>,
pub labels: Option<Value>,
pub severity: Option<String>,
pub config: Option<Value>,
pub enabled: Option<bool>,
}
#[derive(Debug, Clone, Serialize, FromRow)]
pub struct ZoneEvent {
pub id: String,
pub camera_id: String,
pub zone_id: String,
pub zone_name: String,
pub track_id: Option<String>,
pub event_type: String,
pub label: Option<String>,
pub timestamp: DateTime<Utc>,
pub dwell_seconds: Option<f64>,
pub evidence_path: Option<String>,
pub created_at: DateTime<Utc>,
}