use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserInfo {
pub user_id: String,
pub name: String,
pub email: Option<String>,
pub mobile: Option<String>,
pub department_ids: Vec<String>,
pub status: crate::models::Status,
pub face_enrolled: bool,
pub rule_ids: Vec<String>,
pub create_time: crate::models::Timestamp,
pub update_time: crate::models::Timestamp,
pub extension: crate::models::ExtensionMap,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserListResponse {
pub users: Vec<UserInfo>,
pub has_more: bool,
pub page_token: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UserRequest {
pub name: String,
pub email: Option<String>,
pub mobile: Option<String>,
pub department_ids: Option<Vec<String>>,
pub status: Option<crate::models::Status>,
pub rule_ids: Option<Vec<String>>,
pub extension: Option<crate::models::ExtensionMap>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FaceImageInfo {
pub face_url: String,
pub face_feature: Option<String>,
pub quality_score: Option<f64>,
pub upload_time: crate::models::Timestamp,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PermissionRuleInfo {
pub rule_id: String,
pub name: String,
pub description: Option<String>,
pub status: crate::models::Status,
pub device_ids: Vec<String>,
pub user_ids: Vec<String>,
pub valid_from: Option<crate::models::Timestamp>,
pub valid_until: Option<crate::models::Timestamp>,
pub create_time: crate::models::Timestamp,
pub update_time: crate::models::Timestamp,
pub extension: crate::models::ExtensionMap,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PermissionRuleRequest {
pub name: String,
pub description: Option<String>,
pub device_ids: Option<Vec<String>>,
pub user_ids: Option<Vec<String>>,
pub valid_from: Option<crate::models::Timestamp>,
pub valid_until: Option<crate::models::Timestamp>,
pub extension: Option<crate::models::ExtensionMap>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceBindRuleRequest {
pub rule_id: String,
pub device_ids: Vec<String>,
pub overwrite: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VisitorInfo {
pub visitor_id: String,
pub name: String,
pub mobile: String,
pub email: Option<String>,
pub visit_reason: Option<String>,
pub host_info: Option<HostInfo>,
pub valid_from: crate::models::Timestamp,
pub valid_until: crate::models::Timestamp,
pub status: VisitorStatus,
pub rule_ids: Vec<String>,
pub create_time: crate::models::Timestamp,
pub update_time: crate::models::Timestamp,
pub extension: crate::models::ExtensionMap,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct HostInfo {
pub user_id: String,
pub name: String,
pub mobile: Option<String>,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum VisitorStatus {
Pending,
Approved,
Rejected,
Expired,
Revoked,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VisitorRequest {
pub name: String,
pub mobile: String,
pub email: Option<String>,
pub visit_reason: Option<String>,
pub host_info: Option<HostInfo>,
pub valid_from: crate::models::Timestamp,
pub valid_until: crate::models::Timestamp,
pub rule_ids: Option<Vec<String>>,
pub extension: Option<crate::models::ExtensionMap>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DeviceInfo {
pub device_id: String,
pub device_name: String,
pub device_type: DeviceType,
pub status: DeviceStatus,
pub location: Option<String>,
pub geo_location: Option<crate::models::GeoLocation>,
pub online: bool,
pub last_online_time: Option<crate::models::Timestamp>,
pub rule_ids: Vec<String>,
pub create_time: crate::models::Timestamp,
pub update_time: crate::models::Timestamp,
pub extension: crate::models::ExtensionMap,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum DeviceType {
CardReader,
FaceRecognition,
FingerprintReader,
DoorLock,
Turnstile,
Other(String),
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum DeviceStatus {
Normal,
Offline,
Fault,
Maintenance,
Disabled,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccessRecord {
pub record_id: String,
pub user_id: Option<String>,
pub visitor_id: Option<String>,
pub device_id: String,
pub access_time: crate::models::Timestamp,
pub access_result: AccessResult,
pub verification_method: VerificationMethod,
pub reject_reason: Option<String>,
pub photo_url: Option<String>,
pub extension: crate::models::ExtensionMap,
}
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum AccessResult {
Success,
Failed,
Timeout,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "snake_case")]
pub enum VerificationMethod {
Face,
Card,
Fingerprint,
Password,
QrCode,
Other(String),
}
#[cfg(test)]
mod tests {
use serde_json;
#[test]
fn test_serialization_roundtrip() {
let json = r#"{"test": "value"}"#;
assert!(serde_json::from_str::<serde_json::Value>(json).is_ok());
}
#[test]
fn test_deserialization_from_json() {
let json = r#"{"field": "data"}"#;
let value: serde_json::Value = serde_json::from_str(json).expect("JSON 反序列化失败");
assert_eq!(value["field"], "data");
}
}