Skip to main content

openlark_security/models/
acs.rs

1//! ACS (访问控制系统) 数据模型
2
3use serde::{Deserialize, Serialize};
4
5/// 门禁用户信息
6#[derive(Debug, Clone, Serialize, Deserialize)]
7pub struct UserInfo {
8    /// 用户ID
9    pub user_id: String,
10    /// 用户姓名
11    pub name: String,
12    /// 用户邮箱
13    pub email: Option<String>,
14    /// 用户手机号
15    pub mobile: Option<String>,
16    /// 用户部门ID列表
17    pub department_ids: Vec<String>,
18    /// 用户状态
19    pub status: crate::models::Status,
20    /// 人脸是否已录入
21    pub face_enrolled: bool,
22    /// 门禁权限组ID列表
23    pub rule_ids: Vec<String>,
24    /// 创建时间
25    pub create_time: crate::models::Timestamp,
26    /// 更新时间
27    pub update_time: crate::models::Timestamp,
28    /// 扩展信息
29    pub extension: crate::models::ExtensionMap,
30}
31
32/// 用户列表响应
33#[derive(Debug, Clone, Serialize, Deserialize)]
34pub struct UserListResponse {
35    /// 用户列表
36    pub users: Vec<UserInfo>,
37    /// 是否有更多数据
38    pub has_more: bool,
39    /// 分页标记
40    pub page_token: Option<String>,
41}
42
43/// 用户创建/更新请求
44#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct UserRequest {
46    /// 用户姓名
47    pub name: String,
48    /// 用户邮箱
49    pub email: Option<String>,
50    /// 用户手机号
51    pub mobile: Option<String>,
52    /// 用户部门ID列表
53    pub department_ids: Option<Vec<String>>,
54    /// 用户状态
55    pub status: Option<crate::models::Status>,
56    /// 门禁权限组ID列表
57    pub rule_ids: Option<Vec<String>>,
58    /// 扩展信息
59    pub extension: Option<crate::models::ExtensionMap>,
60}
61
62/// 人脸图片信息
63#[derive(Debug, Clone, Serialize, Deserialize)]
64pub struct FaceImageInfo {
65    /// 人脸图片URL
66    pub face_url: String,
67    /// 人脸特征值
68    pub face_feature: Option<String>,
69    /// 图片质量分数
70    pub quality_score: Option<f64>,
71    /// 上传时间
72    pub upload_time: crate::models::Timestamp,
73}
74
75/// 权限组信息
76#[derive(Debug, Clone, Serialize, Deserialize)]
77pub struct PermissionRuleInfo {
78    /// 权限组ID
79    pub rule_id: String,
80    /// 权限组名称
81    pub name: String,
82    /// 权限组描述
83    pub description: Option<String>,
84    /// 权限组状态
85    pub status: crate::models::Status,
86    /// 关联的设备ID列表
87    pub device_ids: Vec<String>,
88    /// 关联的用户ID列表
89    pub user_ids: Vec<String>,
90    /// 生效开始时间
91    pub valid_from: Option<crate::models::Timestamp>,
92    /// 生效结束时间
93    pub valid_until: Option<crate::models::Timestamp>,
94    /// 创建时间
95    pub create_time: crate::models::Timestamp,
96    /// 更新时间
97    pub update_time: crate::models::Timestamp,
98    /// 扩展信息
99    pub extension: crate::models::ExtensionMap,
100}
101
102/// 权限组创建/更新请求
103#[derive(Debug, Clone, Serialize, Deserialize)]
104pub struct PermissionRuleRequest {
105    /// 权限组名称
106    pub name: String,
107    /// 权限组描述
108    pub description: Option<String>,
109    /// 关联的设备ID列表
110    pub device_ids: Option<Vec<String>>,
111    /// 关联的用户ID列表
112    pub user_ids: Option<Vec<String>>,
113    /// 生效开始时间
114    pub valid_from: Option<crate::models::Timestamp>,
115    /// 生效结束时间
116    pub valid_until: Option<crate::models::Timestamp>,
117    /// 扩展信息
118    pub extension: Option<crate::models::ExtensionMap>,
119}
120
121/// 设备绑定权限组请求
122#[derive(Debug, Clone, Serialize, Deserialize)]
123pub struct DeviceBindRuleRequest {
124    /// 权限组ID
125    pub rule_id: String,
126    /// 设备ID列表
127    pub device_ids: Vec<String>,
128    /// 是否覆盖现有绑定
129    pub overwrite: Option<bool>,
130}
131
132/// 访客信息
133#[derive(Debug, Clone, Serialize, Deserialize)]
134pub struct VisitorInfo {
135    /// 访客ID
136    pub visitor_id: String,
137    /// 访客姓名
138    pub name: String,
139    /// 访客手机号
140    pub mobile: String,
141    /// 访客邮箱
142    pub email: Option<String>,
143    /// 拜访事由
144    pub visit_reason: Option<String>,
145    /// 被访人信息
146    pub host_info: Option<HostInfo>,
147    /// 访问权限开始时间
148    pub valid_from: crate::models::Timestamp,
149    /// 访问权限结束时间
150    pub valid_until: crate::models::Timestamp,
151    /// 访客状态
152    pub status: VisitorStatus,
153    /// 权限组ID列表
154    pub rule_ids: Vec<String>,
155    /// 创建时间
156    pub create_time: crate::models::Timestamp,
157    /// 更新时间
158    pub update_time: crate::models::Timestamp,
159    /// 扩展信息
160    pub extension: crate::models::ExtensionMap,
161}
162
163/// 被访人信息
164#[derive(Debug, Clone, Serialize, Deserialize)]
165pub struct HostInfo {
166    /// 被访人ID
167    pub user_id: String,
168    /// 被访人姓名
169    pub name: String,
170    /// 被访人手机号
171    pub mobile: Option<String>,
172}
173
174/// 访客状态
175#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
176#[serde(rename_all = "lowercase")]
177pub enum VisitorStatus {
178    /// 待审核
179    Pending,
180    /// 已批准
181    Approved,
182    /// 已拒绝
183    Rejected,
184    /// 已过期
185    Expired,
186    /// 已撤销
187    Revoked,
188}
189
190/// 访客创建请求
191#[derive(Debug, Clone, Serialize, Deserialize)]
192pub struct VisitorRequest {
193    /// 访客姓名
194    pub name: String,
195    /// 访客手机号
196    pub mobile: String,
197    /// 访客邮箱
198    pub email: Option<String>,
199    /// 拜访事由
200    pub visit_reason: Option<String>,
201    /// 被访人信息
202    pub host_info: Option<HostInfo>,
203    /// 访问权限开始时间
204    pub valid_from: crate::models::Timestamp,
205    /// 访问权限结束时间
206    pub valid_until: crate::models::Timestamp,
207    /// 权限组ID列表
208    pub rule_ids: Option<Vec<String>>,
209    /// 扩展信息
210    pub extension: Option<crate::models::ExtensionMap>,
211}
212
213/// 设备信息
214#[derive(Debug, Clone, Serialize, Deserialize)]
215pub struct DeviceInfo {
216    /// 设备ID
217    pub device_id: String,
218    /// 设备名称
219    pub device_name: String,
220    /// 设备类型
221    pub device_type: DeviceType,
222    /// 设备状态
223    pub status: DeviceStatus,
224    /// 设备位置
225    pub location: Option<String>,
226    /// 地理位置信息
227    pub geo_location: Option<crate::models::GeoLocation>,
228    /// 在线状态
229    pub online: bool,
230    /// 最后在线时间
231    pub last_online_time: Option<crate::models::Timestamp>,
232    /// 权限组ID列表
233    pub rule_ids: Vec<String>,
234    /// 创建时间
235    pub create_time: crate::models::Timestamp,
236    /// 更新时间
237    pub update_time: crate::models::Timestamp,
238    /// 扩展信息
239    pub extension: crate::models::ExtensionMap,
240}
241
242/// 设备类型
243#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
244#[serde(rename_all = "snake_case")]
245pub enum DeviceType {
246    /// 门禁读卡器
247    CardReader,
248    /// 人脸识别终端
249    FaceRecognition,
250    /// 指纹识别终端
251    FingerprintReader,
252    /// 门锁
253    DoorLock,
254    /// 闸机
255    Turnstile,
256    /// 其他设备
257    Other(String),
258}
259
260/// 设备状态
261#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
262#[serde(rename_all = "lowercase")]
263pub enum DeviceStatus {
264    /// 正常
265    Normal,
266    /// 离线
267    Offline,
268    /// 故障
269    Fault,
270    /// 维护中
271    Maintenance,
272    /// 已禁用
273    Disabled,
274}
275
276/// 访问记录信息
277#[derive(Debug, Clone, Serialize, Deserialize)]
278pub struct AccessRecord {
279    /// 记录ID
280    pub record_id: String,
281    /// 用户ID(如果是用户访问)
282    pub user_id: Option<String>,
283    /// 访客ID(如果是访客访问)
284    pub visitor_id: Option<String>,
285    /// 设备ID
286    pub device_id: String,
287    /// 访问时间
288    pub access_time: crate::models::Timestamp,
289    /// 访问结果
290    pub access_result: AccessResult,
291    /// 验证方式
292    pub verification_method: VerificationMethod,
293    /// 拒绝原因(如果访问被拒绝)
294    pub reject_reason: Option<String>,
295    /// 访问照片URL
296    pub photo_url: Option<String>,
297    /// 扩展信息
298    pub extension: crate::models::ExtensionMap,
299}
300
301/// 访问结果
302#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
303#[serde(rename_all = "lowercase")]
304pub enum AccessResult {
305    /// 成功
306    Success,
307    /// 失败
308    Failed,
309    /// 超时
310    Timeout,
311}
312
313/// 验证方式
314#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
315#[serde(rename_all = "snake_case")]
316pub enum VerificationMethod {
317    /// 人脸识别
318    Face,
319    /// 门禁卡
320    Card,
321    /// 指纹
322    Fingerprint,
323    /// 密码
324    Password,
325    /// 二维码
326    QrCode,
327    /// 其他方式
328    Other(String),
329}
330
331#[cfg(test)]
332mod tests {
333
334    use serde_json;
335
336    #[test]
337    fn test_serialization_roundtrip() {
338        // 基础序列化测试
339        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        // 基础反序列化测试
346        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}