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, Ipv4Addr};
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    /// 1-based switch port index for wired clients, matching `devices ports`
61    /// indexing. `None` for wireless clients and any wired client where the
62    /// controller didn't report `sw_port`.
63    pub switch_port: Option<u32>,
64    pub network_id: Option<EntityId>,
65    pub vlan: Option<u16>,
66
67    // Wireless-specific
68    pub wireless: Option<WirelessInfo>,
69
70    // Guest
71    pub guest_auth: Option<GuestAuth>,
72    pub is_guest: bool,
73
74    // Traffic
75    pub tx_bytes: Option<u64>,
76    pub rx_bytes: Option<u64>,
77    pub bandwidth: Option<Bandwidth>,
78
79    // Fingerprint (session API)
80    pub os_name: Option<String>,
81    pub device_class: Option<String>,
82
83    // DHCP reservation (session API)
84    pub use_fixedip: bool,
85    pub fixed_ip: Option<Ipv4Addr>,
86
87    // Blocking state (session API)
88    pub blocked: bool,
89
90    #[serde(skip)]
91    #[allow(dead_code)]
92    pub(crate) source: DataSource,
93    #[serde(skip)]
94    #[allow(dead_code)]
95    pub(crate) updated_at: DateTime<Utc>,
96}