use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PageResponse<T> {
pub items: Vec<T>,
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_more: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum UserType {
Employee,
Visitor,
Contractor,
Temporary,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum UserStatus {
Active,
Disabled,
Expired,
Pending,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AcsUser {
pub user_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub employee_id: Option<String>,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_type: Option<UserType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<UserStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub department: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_face_image: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum RuleStatus {
Active,
Disabled,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RuleExternal {
pub rule_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<RuleStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub device_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_ids: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum VisitorStatus {
Active,
Expired,
CheckedOut,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Visitor {
pub visitor_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub phone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub company: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub purpose: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub host_user_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub host_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<VisitorStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub start_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub end_time: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DeviceType {
AccessControl,
FaceRecognition,
Turnstile,
ElevatorController,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum DeviceStatus {
Online,
Offline,
Error,
Maintenance,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Device {
pub device_id: String,
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub device_type: Option<DeviceType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<DeviceStatus>,
#[serde(skip_serializing_if = "Option::is_none")]
pub location: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub ip_address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub mac_address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AccessType {
Entry,
Exit,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AccessMethod {
FaceRecognition,
Card,
Password,
Fingerprint,
Manual,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum AccessResult {
Success,
Failed,
Denied,
Timeout,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AccessRecord {
pub record_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_name: Option<String>,
pub device_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub device_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub access_type: Option<AccessType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub access_method: Option<AccessMethod>,
pub result: AccessResult,
#[serde(skip_serializing_if = "Option::is_none")]
pub has_face_image: Option<bool>,
pub access_time: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FaceImage {
pub image_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub image_content: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub image_format: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub file_size: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub uploaded_at: Option<i64>,
}