1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct UserInfo {
8 pub user_id: String,
10 pub name: String,
12 pub email: Option<String>,
14 pub mobile: Option<String>,
16 pub department_ids: Vec<String>,
18 pub status: crate::models::Status,
20 pub face_enrolled: bool,
22 pub rule_ids: Vec<String>,
24 pub create_time: crate::models::Timestamp,
26 pub update_time: crate::models::Timestamp,
28 pub extension: crate::models::ExtensionMap,
30}
31
32#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct UserListResponse {
35 pub users: Vec<UserInfo>,
37 pub has_more: bool,
39 pub page_token: Option<String>,
41}
42
43#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct UserRequest {
46 pub name: String,
48 pub email: Option<String>,
50 pub mobile: Option<String>,
52 pub department_ids: Option<Vec<String>>,
54 pub status: Option<crate::models::Status>,
56 pub rule_ids: Option<Vec<String>>,
58 pub extension: Option<crate::models::ExtensionMap>,
60}
61
62#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct FaceImageInfo {
65 pub face_url: String,
67 pub face_feature: Option<String>,
69 pub quality_score: Option<f64>,
71 pub upload_time: crate::models::Timestamp,
73}
74
75#[derive(Debug, Clone, Serialize, Deserialize)]
77pub struct PermissionRuleInfo {
78 pub rule_id: String,
80 pub name: String,
82 pub description: Option<String>,
84 pub status: crate::models::Status,
86 pub device_ids: Vec<String>,
88 pub user_ids: Vec<String>,
90 pub valid_from: Option<crate::models::Timestamp>,
92 pub valid_until: Option<crate::models::Timestamp>,
94 pub create_time: crate::models::Timestamp,
96 pub update_time: crate::models::Timestamp,
98 pub extension: crate::models::ExtensionMap,
100}
101
102#[derive(Debug, Clone, Serialize, Deserialize)]
104pub struct PermissionRuleRequest {
105 pub name: String,
107 pub description: Option<String>,
109 pub device_ids: Option<Vec<String>>,
111 pub user_ids: Option<Vec<String>>,
113 pub valid_from: Option<crate::models::Timestamp>,
115 pub valid_until: Option<crate::models::Timestamp>,
117 pub extension: Option<crate::models::ExtensionMap>,
119}
120
121#[derive(Debug, Clone, Serialize, Deserialize)]
123pub struct DeviceBindRuleRequest {
124 pub rule_id: String,
126 pub device_ids: Vec<String>,
128 pub overwrite: Option<bool>,
130}
131
132#[derive(Debug, Clone, Serialize, Deserialize)]
134pub struct VisitorInfo {
135 pub visitor_id: String,
137 pub name: String,
139 pub mobile: String,
141 pub email: Option<String>,
143 pub visit_reason: Option<String>,
145 pub host_info: Option<HostInfo>,
147 pub valid_from: crate::models::Timestamp,
149 pub valid_until: crate::models::Timestamp,
151 pub status: VisitorStatus,
153 pub rule_ids: Vec<String>,
155 pub create_time: crate::models::Timestamp,
157 pub update_time: crate::models::Timestamp,
159 pub extension: crate::models::ExtensionMap,
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
165pub struct HostInfo {
166 pub user_id: String,
168 pub name: String,
170 pub mobile: Option<String>,
172}
173
174#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
176#[serde(rename_all = "lowercase")]
177pub enum VisitorStatus {
178 Pending,
180 Approved,
182 Rejected,
184 Expired,
186 Revoked,
188}
189
190#[derive(Debug, Clone, Serialize, Deserialize)]
192pub struct VisitorRequest {
193 pub name: String,
195 pub mobile: String,
197 pub email: Option<String>,
199 pub visit_reason: Option<String>,
201 pub host_info: Option<HostInfo>,
203 pub valid_from: crate::models::Timestamp,
205 pub valid_until: crate::models::Timestamp,
207 pub rule_ids: Option<Vec<String>>,
209 pub extension: Option<crate::models::ExtensionMap>,
211}
212
213#[derive(Debug, Clone, Serialize, Deserialize)]
215pub struct DeviceInfo {
216 pub device_id: String,
218 pub device_name: String,
220 pub device_type: DeviceType,
222 pub status: DeviceStatus,
224 pub location: Option<String>,
226 pub geo_location: Option<crate::models::GeoLocation>,
228 pub online: bool,
230 pub last_online_time: Option<crate::models::Timestamp>,
232 pub rule_ids: Vec<String>,
234 pub create_time: crate::models::Timestamp,
236 pub update_time: crate::models::Timestamp,
238 pub extension: crate::models::ExtensionMap,
240}
241
242#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
244#[serde(rename_all = "snake_case")]
245pub enum DeviceType {
246 CardReader,
248 FaceRecognition,
250 FingerprintReader,
252 DoorLock,
254 Turnstile,
256 Other(String),
258}
259
260#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
262#[serde(rename_all = "lowercase")]
263pub enum DeviceStatus {
264 Normal,
266 Offline,
268 Fault,
270 Maintenance,
272 Disabled,
274}
275
276#[derive(Debug, Clone, Serialize, Deserialize)]
278pub struct AccessRecord {
279 pub record_id: String,
281 pub user_id: Option<String>,
283 pub visitor_id: Option<String>,
285 pub device_id: String,
287 pub access_time: crate::models::Timestamp,
289 pub access_result: AccessResult,
291 pub verification_method: VerificationMethod,
293 pub reject_reason: Option<String>,
295 pub photo_url: Option<String>,
297 pub extension: crate::models::ExtensionMap,
299}
300
301#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
303#[serde(rename_all = "lowercase")]
304pub enum AccessResult {
305 Success,
307 Failed,
309 Timeout,
311}
312
313#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
315#[serde(rename_all = "snake_case")]
316pub enum VerificationMethod {
317 Face,
319 Card,
321 Fingerprint,
323 Password,
325 QrCode,
327 Other(String),
329}
330
331#[cfg(test)]
332mod tests {
333
334 use serde_json;
335
336 #[test]
337 fn test_serialization_roundtrip() {
338 let json = r#"{"test": "value"}"#;
340 assert!(serde_json::from_str::<serde_json::Value>(json).is_ok());
341 }
342
343 #[test]
344 fn test_deserialization_from_json() {
345 let json = r#"{"field": "data"}"#;
347 let value: serde_json::Value = serde_json::from_str(json).expect("JSON 反序列化失败");
348 assert_eq!(value["field"], "data");
349 }
350}