Skip to main content

openlark_security/models/
common.rs

1//! 通用数据模型
2//!
3//! 提供跨项目使用的通用数据结构。
4
5use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7
8/// 通用键值对结构
9#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct KeyValue {
11    /// 键
12    pub key: String,
13    /// 值
14    pub value: String,
15}
16
17/// 通用扩展信息
18pub type ExtensionMap = HashMap<String, serde_json::Value>;
19
20/// 设备基础信息
21#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct DeviceBase {
23    /// 设备ID
24    pub device_id: String,
25    /// 设备名称
26    pub device_name: String,
27    /// 设备类型
28    pub device_type: String,
29    /// 设备状态
30    pub status: String,
31    /// 创建时间
32    pub create_time: crate::models::Timestamp,
33    /// 更新时间
34    pub update_time: crate::models::Timestamp,
35}
36
37/// 用户基础信息
38#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct UserBase {
40    /// 用户ID
41    pub user_id: String,
42    /// 用户姓名
43    pub name: String,
44    /// 用户状态
45    pub status: crate::models::Status,
46    /// 部门ID列表
47    pub department_ids: Vec<String>,
48    /// 创建时间
49    pub create_time: crate::models::Timestamp,
50    /// 更新时间
51    pub update_time: crate::models::Timestamp,
52}
53
54/// 权限基础信息
55#[derive(Debug, Clone, Serialize, Deserialize)]
56pub struct PermissionBase {
57    /// 权限ID
58    pub permission_id: String,
59    /// 权限名称
60    pub name: String,
61    /// 权限描述
62    pub description: Option<String>,
63    /// 权限状态
64    pub status: crate::models::Status,
65    /// 创建时间
66    pub create_time: crate::models::Timestamp,
67    /// 更新时间
68    pub update_time: crate::models::Timestamp,
69}
70
71/// 操作结果响应
72#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct OperationResponse {
74    /// 是否成功
75    pub success: bool,
76    /// 操作ID
77    pub operation_id: Option<String>,
78    /// 响应消息
79    pub message: Option<String>,
80}
81
82/// 批量操作请求
83#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct BatchOperationRequest<T> {
85    /// 操作项列表
86    pub items: Vec<T>,
87    /// 是否跳过错误
88    pub skip_error: Option<bool>,
89}
90
91/// 批量操作响应
92#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct BatchOperationResponse<T> {
94    /// 成功项目列表
95    pub success_items: Vec<T>,
96    /// 失败项目列表
97    pub failed_items: Vec<BatchOperationError<T>>,
98}
99
100/// 批量操作错误
101#[derive(Debug, Clone, Serialize, Deserialize)]
102pub struct BatchOperationError<T> {
103    /// 错误项目
104    pub item: T,
105    /// 错误码
106    pub error_code: i32,
107    /// 错误消息
108    pub error_message: String,
109}
110
111/// 查询条件枚举
112#[derive(Debug, Clone, Serialize, Deserialize)]
113#[serde(rename_all = "snake_case")]
114pub enum QueryCondition {
115    /// 等于
116    Eq(String, serde_json::Value),
117    /// 不等于
118    Ne(String, serde_json::Value),
119    /// 大于
120    Gt(String, serde_json::Value),
121    /// 大于等于
122    Gte(String, serde_json::Value),
123    /// 小于
124    Lt(String, serde_json::Value),
125    /// 小于等于
126    Lte(String, serde_json::Value),
127    /// 包含
128    Contains(String, serde_json::Value),
129    /// 在范围内
130    In(String, Vec<serde_json::Value>),
131    /// 不在范围内
132    NotIn(String, Vec<serde_json::Value>),
133}
134
135/// 排序条件
136#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct SortCondition {
138    /// 排序字段
139    pub field: String,
140    /// 排序方向
141    pub direction: SortDirection,
142}
143
144/// 排序方向
145#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
146#[serde(rename_all = "lowercase")]
147pub enum SortDirection {
148    /// 升序
149    Asc,
150    /// 降序
151    Desc,
152}
153
154/// 时间范围查询
155#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
156pub struct TimeRange {
157    /// 开始时间
158    pub start_time: crate::models::Timestamp,
159    /// 结束时间
160    pub end_time: crate::models::Timestamp,
161}
162
163/// 地理位置信息
164#[derive(Debug, Clone, Serialize, Deserialize)]
165pub struct GeoLocation {
166    /// 纬度
167    pub latitude: f64,
168    /// 经度
169    pub longitude: f64,
170    /// 地址描述
171    pub address: Option<String>,
172}
173
174/// 文件上传响应
175#[derive(Debug, Clone, Serialize, Deserialize)]
176pub struct FileUploadResponse {
177    /// 文件ID
178    pub file_id: String,
179    /// 文件URL
180    pub file_url: String,
181    /// 文件大小
182    pub file_size: i64,
183    /// 文件类型
184    pub file_type: String,
185    /// 上传时间
186    pub upload_time: crate::models::Timestamp,
187}
188
189#[cfg(test)]
190mod tests {
191
192    use serde_json;
193
194    #[test]
195    fn test_serialization_roundtrip() {
196        // 基础序列化测试
197        let json = r#"{"test": "value"}"#;
198        assert!(serde_json::from_str::<serde_json::Value>(json).is_ok());
199    }
200
201    #[test]
202    fn test_deserialization_from_json() {
203        // 基础反序列化测试
204        let json = r#"{"field": "data"}"#;
205        let value: serde_json::Value = serde_json::from_str(json).expect("JSON 反序列化失败");
206        assert_eq!(value["field"], "data");
207    }
208}