openlark_security/models/
common.rs1use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
10pub struct KeyValue {
11 pub key: String,
13 pub value: String,
15}
16
17pub type ExtensionMap = HashMap<String, serde_json::Value>;
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
22pub struct DeviceBase {
23 pub device_id: String,
25 pub device_name: String,
27 pub device_type: String,
29 pub status: String,
31 pub create_time: crate::models::Timestamp,
33 pub update_time: crate::models::Timestamp,
35}
36
37#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct UserBase {
40 pub user_id: String,
42 pub name: String,
44 pub status: crate::models::Status,
46 pub department_ids: Vec<String>,
48 pub create_time: crate::models::Timestamp,
50 pub update_time: crate::models::Timestamp,
52}
53
54#[derive(Debug, Clone, Serialize, Deserialize)]
56pub struct PermissionBase {
57 pub permission_id: String,
59 pub name: String,
61 pub description: Option<String>,
63 pub status: crate::models::Status,
65 pub create_time: crate::models::Timestamp,
67 pub update_time: crate::models::Timestamp,
69}
70
71#[derive(Debug, Clone, Serialize, Deserialize)]
73pub struct OperationResponse {
74 pub success: bool,
76 pub operation_id: Option<String>,
78 pub message: Option<String>,
80}
81
82#[derive(Debug, Clone, Serialize, Deserialize)]
84pub struct BatchOperationRequest<T> {
85 pub items: Vec<T>,
87 pub skip_error: Option<bool>,
89}
90
91#[derive(Debug, Clone, Serialize, Deserialize)]
93pub struct BatchOperationResponse<T> {
94 pub success_items: Vec<T>,
96 pub failed_items: Vec<BatchOperationError<T>>,
98}
99
100#[derive(Debug, Clone, Serialize, Deserialize)]
102pub struct BatchOperationError<T> {
103 pub item: T,
105 pub error_code: i32,
107 pub error_message: String,
109}
110
111#[derive(Debug, Clone, Serialize, Deserialize)]
113#[serde(rename_all = "snake_case")]
114pub enum QueryCondition {
115 Eq(String, serde_json::Value),
117 Ne(String, serde_json::Value),
119 Gt(String, serde_json::Value),
121 Gte(String, serde_json::Value),
123 Lt(String, serde_json::Value),
125 Lte(String, serde_json::Value),
127 Contains(String, serde_json::Value),
129 In(String, Vec<serde_json::Value>),
131 NotIn(String, Vec<serde_json::Value>),
133}
134
135#[derive(Debug, Clone, Serialize, Deserialize)]
137pub struct SortCondition {
138 pub field: String,
140 pub direction: SortDirection,
142}
143
144#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
146#[serde(rename_all = "lowercase")]
147pub enum SortDirection {
148 Asc,
150 Desc,
152}
153
154#[derive(Debug, Clone, Copy, Serialize, Deserialize)]
156pub struct TimeRange {
157 pub start_time: crate::models::Timestamp,
159 pub end_time: crate::models::Timestamp,
161}
162
163#[derive(Debug, Clone, Serialize, Deserialize)]
165pub struct GeoLocation {
166 pub latitude: f64,
168 pub longitude: f64,
170 pub address: Option<String>,
172}
173
174#[derive(Debug, Clone, Serialize, Deserialize)]
176pub struct FileUploadResponse {
177 pub file_id: String,
179 pub file_url: String,
181 pub file_size: i64,
183 pub file_type: String,
185 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 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 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}