Skip to main content

unifly_api/model/
client.rs

1// ── Client domain types ──
2
3use chrono::{DateTime, Utc};
4use serde::{Deserialize, Serialize};
5use std::net::IpAddr;
6
7use super::common::{Bandwidth, DataSource};
8use super::entity_id::{EntityId, MacAddress};
9
10/// Client connection type.
11#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
12#[non_exhaustive]
13pub enum ClientType {
14    Wired,
15    Wireless,
16    Vpn,
17    Teleport,
18    Unknown,
19}
20
21/// Guest authorization details.
22#[derive(Debug, Clone, Serialize, Deserialize)]
23pub struct GuestAuth {
24    pub authorized: bool,
25    pub method: Option<String>,
26    pub expires_at: Option<DateTime<Utc>>,
27    pub tx_bytes: Option<u64>,
28    pub rx_bytes: Option<u64>,
29    pub elapsed_minutes: Option<u64>,
30}
31
32/// Wireless connection details (only present for wireless clients).
33#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct WirelessInfo {
35    pub ssid: Option<String>,
36    pub bssid: Option<MacAddress>,
37    pub channel: Option<u32>,
38    pub frequency_ghz: Option<f32>,
39    pub signal_dbm: Option<i32>,
40    pub noise_dbm: Option<i32>,
41    pub satisfaction: Option<u8>,
42    pub tx_rate_kbps: Option<u64>,
43    pub rx_rate_kbps: Option<u64>,
44}
45
46/// The canonical Client type.
47#[derive(Debug, Clone, Serialize, Deserialize)]
48pub struct Client {
49    pub id: EntityId,
50    pub mac: MacAddress,
51    pub ip: Option<IpAddr>,
52    pub name: Option<String>,
53    pub hostname: Option<String>,
54    pub client_type: ClientType,
55
56    // Connection
57    pub connected_at: Option<DateTime<Utc>>,
58    pub uplink_device_id: Option<EntityId>,
59    pub uplink_device_mac: Option<MacAddress>,
60    pub network_id: Option<EntityId>,
61    pub vlan: Option<u16>,
62
63    // Wireless-specific
64    pub wireless: Option<WirelessInfo>,
65
66    // Guest
67    pub guest_auth: Option<GuestAuth>,
68    pub is_guest: bool,
69
70    // Traffic
71    pub tx_bytes: Option<u64>,
72    pub rx_bytes: Option<u64>,
73    pub bandwidth: Option<Bandwidth>,
74
75    // Fingerprint (legacy API)
76    pub os_name: Option<String>,
77    pub device_class: Option<String>,
78
79    // Blocking state (legacy API)
80    pub blocked: bool,
81
82    #[serde(skip)]
83    #[allow(dead_code)]
84    pub(crate) source: DataSource,
85    #[serde(skip)]
86    #[allow(dead_code)]
87    pub(crate) updated_at: DateTime<Utc>,
88}