use serde::{Deserialize, Serialize, Serializer}; fn serialize_sqlite_bool(value: &i64, serializer: S) -> Result where S: Serializer, { serializer.serialize_bool(*value != 0) } #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] pub struct LoginRequest { pub username: String, pub password: String, pub password_derived: String, pub turnstile_token: String, } #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] pub struct TurnstileVerifyRequest { pub token: String, } #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] pub struct ServerInput { pub name: String, pub region: String, pub group_name: String, pub tags: String, pub hidden: bool, pub expires_at: Option, pub traffic_limit: i64, pub traffic_limit_type: String, pub price: f64, pub billing_cycle: i64, pub currency: String, pub auto_renewal: bool, pub network_interface: String, pub reset_day: i64, pub report_interval: i64, pub collect_interval: i64, pub rx_correction: i64, pub tx_correction: i64, pub agent_mirror: String, pub offline_notify_disabled: bool, pub auto_update: bool, } #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] pub struct SettingsInput { pub site_name: Option, pub site_description: Option, pub site_announcement: Option, pub favicon_url: Option, pub locale: Option, pub public_dashboard: Option, pub offline_threshold_seconds: Option, pub history_retention_days: Option, pub default_theme: Option, pub active_theme_id: Option, pub background_url: Option, pub theme_options: Option, pub show_search: Option, pub show_groups: Option, pub show_stats: Option, pub show_assets: Option, pub show_traffic: Option, pub show_speed: Option, pub show_price: Option, pub show_expiry: Option, pub show_latency: Option, pub show_uptime: Option, pub admin_username: Option, pub new_password: Option, pub new_password_derived: Option, pub turnstile_enabled: Option, pub turnstile_login_enabled: Option, pub turnstile_site_key: Option, pub turnstile_secret_key: Option, pub notification_enabled: Option, pub notification_endpoint: Option, pub notification_target: Option, pub offline_alert_minutes: Option, pub expiry_alert_days: Option, pub cloudflare_account_id: Option, pub cloudflare_api_token: Option, } #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] pub struct ThemeInput { pub name: String, pub description: String, pub url: String, } #[derive(Debug, Clone, Serialize)] pub struct ThemeView { pub id: String, pub name: String, pub description: String, pub url: String, pub version: String, pub builtin: bool, pub active: bool, } #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] pub struct ServerOrderInput { pub ids: Vec, } #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] pub struct ServerBatchInput { pub ids: Vec, } #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] pub struct LatencyTaskInput { pub name: String, pub task_type: String, pub target: String, pub port: Option, pub interval_seconds: i64, pub default_enabled: bool, pub server_ids: Vec, } #[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)] pub struct AgentLatencyTask { pub id: String, pub name: String, pub task_type: String, pub target: String, pub port: Option, pub interval_seconds: i64, } #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(deny_unknown_fields)] pub struct AgentLatencyResult { pub task_id: String, pub timestamp: i64, pub latency_ms: f64, pub packet_loss: f64, } #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(deny_unknown_fields)] pub struct AgentDiskMetric { pub name: String, pub mount_point: String, pub used: i64, pub total: i64, pub read_bps: f64, pub write_bps: f64, pub read_iops: f64, pub write_iops: f64, pub await_ms: f64, pub utilization: f64, } #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(deny_unknown_fields)] pub struct AgentGpuMetric { pub model: String, pub usage: Option, pub memory_used: i64, pub memory_total: i64, } #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] pub struct AgentReportBatch { pub samples: Vec, } #[derive(Debug, Clone, Deserialize, Serialize)] #[serde(deny_unknown_fields)] pub struct AgentReport { pub timestamp: i64, pub cpu: f64, pub load1: f64, pub load5: f64, pub load15: f64, pub mem_used: i64, pub mem_total: i64, pub swap_used: i64, pub swap_total: i64, pub disk_used: i64, pub disk_total: i64, pub net_in: f64, pub net_out: f64, pub net_rx_total: i64, pub net_tx_total: i64, pub uptime: i64, pub processes: i64, pub tcp_connections: i64, pub udp_connections: i64, pub cpu_cores: i64, pub cpu_model: String, pub os: String, pub kernel: String, pub arch: String, pub virtualization: String, pub gpu_usage: f64, pub gpu_model: String, pub agent_version: String, pub disk_read_bps: f64, pub disk_write_bps: f64, pub disk_read_iops: f64, pub disk_write_iops: f64, pub disk_await_ms: f64, pub disk_utilization: f64, pub disks: Vec, pub gpus: Vec, pub latency_results: Vec, } #[derive(Debug, Deserialize, Serialize)] pub struct ServerView { pub id: String, pub name: String, pub region: String, pub group_name: String, pub tags: String, #[serde(serialize_with = "serialize_sqlite_bool")] pub hidden: i64, pub expires_at: Option, pub traffic_limit: i64, pub traffic_limit_type: String, pub price: f64, pub billing_cycle: i64, pub currency: String, #[serde(serialize_with = "serialize_sqlite_bool")] pub auto_renewal: i64, pub last_ip: String, pub network_interface: String, pub reset_day: i64, pub report_interval: i64, pub collect_interval: i64, pub rx_correction: i64, pub tx_correction: i64, pub agent_mirror: String, #[serde(serialize_with = "serialize_sqlite_bool")] pub offline_notify_disabled: i64, #[serde(serialize_with = "serialize_sqlite_bool")] pub auto_update: i64, #[serde(skip_serializing)] pub created_at: i64, pub timestamp: Option, pub cpu: Option, pub load1: Option, pub load5: Option, pub load15: Option, pub mem_used: Option, pub mem_total: Option, pub swap_used: Option, pub swap_total: Option, pub disk_used: Option, pub disk_total: Option, pub net_in: Option, pub net_out: Option, pub net_rx_total: Option, pub net_tx_total: Option, pub uptime: Option, pub processes: Option, pub tcp_connections: Option, pub udp_connections: Option, pub cpu_cores: Option, pub cpu_model: Option, pub os: Option, pub kernel: Option, pub arch: Option, pub virtualization: Option, pub gpu_usage: Option, pub gpu_model: Option, pub agent_version: Option, pub disk_read_bps: Option, pub disk_write_bps: Option, pub disk_read_iops: Option, pub disk_write_iops: Option, pub disk_await_ms: Option, pub disk_utilization: Option, #[serde(skip_serializing)] pub disk_info: Option, #[serde(skip_serializing)] pub gpu_info: Option, } #[derive(Debug, Deserialize, Serialize)] pub struct HistoryPoint { pub timestamp: i64, pub cpu: f64, pub load1: f64, pub load5: f64, pub load15: f64, pub mem_used: i64, pub mem_total: i64, pub swap_used: i64, pub swap_total: i64, pub disk_used: i64, pub disk_total: i64, pub net_in: f64, pub net_out: f64, pub net_rx_total: i64, pub net_tx_total: i64, pub processes: i64, pub tcp_connections: i64, pub udp_connections: i64, pub gpu_usage: f64, pub disk_read_bps: f64, pub disk_write_bps: f64, pub disk_read_iops: f64, pub disk_write_iops: f64, pub disk_await_ms: f64, pub disk_utilization: f64, } #[derive(Debug, Deserialize)] pub struct AgentIdentityRow { pub id: String, pub hidden: i64, } #[derive(Debug, Serialize)] pub struct AgentConfigView { pub report_interval: i64, pub collect_interval: i64, pub network_interface: String, pub agent_mirror: String, pub auto_update: bool, pub latency_tasks: Vec, } #[derive(Debug, Deserialize)] #[serde(deny_unknown_fields)] pub struct AlertRuleInput { pub name: String, pub metric: String, pub threshold: f64, pub duration_minutes: i64, pub aggregation: String, pub enabled: bool, pub server_ids: Vec, } #[derive(Debug, Clone, Serialize)] pub struct AlertRuleView { pub id: String, pub name: String, pub metric: String, pub threshold: f64, pub duration_minutes: i64, pub aggregation: String, pub enabled: bool, pub server_ids: Vec, } #[derive(Debug, Serialize)] pub struct ApiError<'a> { pub error: &'a str, }