Skip to main content

openlark_security/models/
mod.rs

1//! 共享数据模型
2//!
3//! 提供所有安全服务共享的数据模型和类型定义。
4
5use serde::{Deserialize, Serialize};
6
7/// 安全服务配置
8#[derive(Debug, Clone)]
9pub struct SecurityConfig {
10    /// 应用ID
11    pub app_id: String,
12    /// 应用密钥
13    pub app_secret: String,
14    /// 基础URL
15    pub base_url: String,
16}
17
18impl SecurityConfig {
19    /// 创建新的安全配置实例
20    pub fn new(app_id: impl Into<String>, app_secret: impl Into<String>) -> Self {
21        Self {
22            app_id: app_id.into(),
23            app_secret: app_secret.into(),
24            base_url: "https://open.feishu.cn".to_string(),
25        }
26    }
27
28    /// 设置基础URL
29    pub fn with_base_url(mut self, base_url: &str) -> Self {
30        self.base_url = base_url.to_string();
31        self
32    }
33}
34
35impl Default for SecurityConfig {
36    fn default() -> Self {
37        Self {
38            app_id: "".to_string(),
39            app_secret: "".to_string(),
40            base_url: "https://open.feishu.cn".to_string(),
41        }
42    }
43}
44
45/// 分页请求基础结构
46#[derive(Debug, Clone, Serialize, Deserialize)]
47pub struct PageRequest {
48    /// 页面大小,默认 20,最大 100
49    pub page_size: Option<i32>,
50    /// 分页标记,第一页不传,后续页面传入上一页返回的 page_token
51    pub page_token: Option<String>,
52}
53
54impl Default for PageRequest {
55    fn default() -> Self {
56        Self {
57            page_size: Some(20),
58            page_token: None,
59        }
60    }
61}
62
63/// 分页响应基础结构
64#[derive(Debug, Clone, Serialize, Deserialize)]
65pub struct PageResponse<T> {
66    /// 是否有更多数据
67    pub has_more: bool,
68    /// 分页标记,用于获取下一页数据
69    pub page_token: Option<String>,
70    /// 数据列表
71    pub data: Vec<T>,
72}
73
74/// API 响应基础结构
75#[derive(Debug, Clone, Serialize, Deserialize)]
76pub struct ApiResponse<T> {
77    /// 响应码
78    pub code: i32,
79    /// 响应消息
80    pub msg: String,
81    /// 响应数据
82    pub data: Option<T>,
83}
84
85/// 时间戳类型
86pub type Timestamp = i64;
87
88/// 通用状态枚举
89#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
90#[serde(rename_all = "lowercase")]
91pub enum Status {
92    /// 激活
93    Active,
94    /// 禁用
95    Disabled,
96    /// 待处理
97    Pending,
98    /// 已删除
99    Deleted,
100    /// 已过期
101    Expired,
102}
103
104// 子模块
105pub mod acs;
106pub mod common;
107
108// 重新导出 ACS 相关模型
109// acs 模块显式导出
110pub use acs::{
111    AccessRecord, AccessResult, DeviceBindRuleRequest, DeviceInfo, DeviceStatus, DeviceType,
112    FaceImageInfo, HostInfo, PermissionRuleInfo, PermissionRuleRequest, UserInfo, UserListResponse,
113    UserRequest, VerificationMethod, VisitorInfo, VisitorRequest, VisitorStatus,
114};
115
116// Security & Compliance 相关模型
117pub mod security_and_compliance;
118// security_and_compliance 模块显式导出
119pub use security_and_compliance::{
120    ApplyStatus, ComplianceCheckResult, ComplianceResult, ComplianceRuleType, ComplianceStatus,
121    DeviceApplyRecord, DeviceApplyRecordApproveRequest, DeviceComplianceRule, DeviceRecord,
122    DeviceRecordRequest, DeviceRecordStatus, DeviceRecordUpdateRequest, OpenApiLog,
123    OpenApiLogQueryRequest,
124};
125
126// 重新导出通用模型
127// common 模块显式导出
128pub use common::{
129    BatchOperationError, BatchOperationRequest, BatchOperationResponse, DeviceBase, ExtensionMap,
130    FileUploadResponse, GeoLocation, KeyValue, OperationResponse, PermissionBase, QueryCondition,
131    SortCondition, SortDirection, TimeRange, UserBase,
132};
133
134#[cfg(test)]
135mod tests {
136
137    use serde_json;
138
139    #[test]
140    fn test_serialization_roundtrip() {
141        // 基础序列化测试
142        let json = r#"{"test": "value"}"#;
143        assert!(serde_json::from_str::<serde_json::Value>(json).is_ok());
144    }
145
146    #[test]
147    fn test_deserialization_from_json() {
148        // 基础反序列化测试
149        let json = r#"{"field": "data"}"#;
150        let value: serde_json::Value = serde_json::from_str(json).unwrap();
151        assert_eq!(value["field"], "data");
152    }
153}