open_lark/service/cloud_docs/
mod.rs

1//! 云文档(Cloud Docs)服务
2//!
3//! 提供飞书云文档的完整功能集,支持云空间、知识库、文档、电子表格、
4//! 多维表格、画板、权限管理、评论系统等企业级文档协作能力。
5//!
6//! # 核心功能
7//!
8//! ## 云空间管理
9//! - 📁 云盘文件存储管理
10//! - 🔍 文件搜索和检索
11//! - 📊 文件版本控制
12//! - 🔗 文件分享和链接
13//! - 📈 存储空间统计
14//!
15//! ## 知识库管理
16//! - 📚 知识库创建和管理
17//! - 📝 知识文档编写发布
18//! - 🔍 知识内容搜索
19//! - 👥 知识协作和共享
20//! - 📊 知识使用统计
21//!
22//! ## 文档编辑
23//! - 📝 富文本文档创建编辑
24//! - 🎨 文档格式样式设置
25//! - 👥 多人实时协作编辑
26//! - 💬 文档评论和讨论
27//! - 📱 跨平台同步支持
28//!
29//! ## 电子表格
30//! - 📊 表格数据管理操作
31//! - 📈 图表可视化展示
32//! - 🔢 公式计算和函数
33//! - 🔄 数据导入导出
34//! - 👥 协作编辑和分享
35//!
36//! ## 多维表格
37//! - 🗃️ 结构化数据管理
38//! - 🔍 多维度数据筛选
39//! - 📊 数据统计和分析
40//! - 🔗 数据关联和引用
41//! - 📋 表单数据收集
42//!
43//! ## 画板协作
44//! - 🎨 创意画板绘制设计
45//! - 🧩 模板和组件库
46//! - 👥 团队协作创作
47//! - 💡 头脑风暴和规划
48//! - 📱 多设备同步支持
49//!
50//! ## 权限管理
51//! - 🔐 细粒度权限控制
52//! - 👥 用户角色管理
53//! - 🔗 外部链接权限
54//! - 📊 权限审计日志
55//! - 🛡️ 数据安全保护
56//!
57//! ## 评论系统
58//! - 💬 文档评论和回复
59//! - 🎯 精确位置评论
60//! - 🔔 评论通知提醒
61//! - 📊 评论统计分析
62//! - 🔄 评论状态管理
63//!
64//! ## 智能助手
65//! - 🤖 AI写作辅助支持
66//! - 📝 智能内容生成
67//! - 🔍 智能信息检索
68//! - 📊 文档质量分析
69//! - 💡 创作建议推荐
70//!
71//! # 使用示例
72//!
73//! ```rust
74//! use open_lark::prelude::*;
75//!
76//! let client = LarkClient::builder("app_id", "app_secret")
77//!     .with_app_type(AppType::SelfBuild)
78//!     .build();
79//!
80//! // 获取云文档服务
81//! let cloud_docs = &client.cloud_docs;
82//!
83//! // 云空间操作
84//! // let file_request = CreateFileRequest::builder()
85//! //     .name("项目计划书.docx")
86//! //     .parent_token("folder_123")
87//! //     .file_type("docx")
88//! //     .build();
89//! // let file = cloud_docs.drive.v1.file.create(file_request, None).await?;
90//!
91//! // 创建知识库
92//! // let wiki_request = CreateWikiRequest::builder()
93//! //     .name("产品知识库")
94//! //     .description("产品相关文档和资料")
95//! //     .build();
96//! // let wiki = cloud_docs.wiki.v2.space.create(wiki_request, None).await?;
97//!
98//! // 操作文档
99//! // let docx_request = CreateDocumentRequest::builder()
100//! //     .title("会议纪要")
101//! //     .folder_token("folder_456")
102//! //     .build();
103//! // let document = cloud_docs.docx.v1.document.create(docx_request, None).await?;
104//!
105//! // 操作电子表格
106//! // let sheets_request = CreateSpreadsheetRequest::builder()
107//! //     .title("销售数据")
108//! //     .folder_token("folder_789")
109//! //     .build();
110//! // let spreadsheet = cloud_docs.sheets.v3.spreadsheet.create(sheets_request, None).await?;
111//!
112//! // 操作多维表格
113//! // let bitable_request = CreateBitableRequest::builder()
114//! //     .name("项目管理表")
115//! //     .folder_token("folder_abc")
116//! //     .build();
117//! // let bitable = cloud_docs.bitable.v1.app.create(bitable_request, None).await?;
118//! ```
119//!
120//! # 协作特性
121//!
122//! - 👥 多人实时协作编辑
123//! - 💬 全面的评论讨论系统
124//! - 📱 跨平台设备同步
125//! - 🔔 智能通知提醒
126//! - 📊 协作数据分析
127//!
128//! # 企业应用
129//!
130//! - 📋 文档管理和归档
131//! - 👥 团队知识共享
132//! - 📊 数据分析和报告
133//! - 🎨 创意设计协作
134//! - 📈 项目管理和跟踪
135
136use crate::core::config::Config;
137use std::sync::Arc;
138
139// 子模块声明
140pub mod assistant;
141pub mod bitable;
142pub mod board;
143pub mod comments;
144pub mod docx;
145pub mod drive;
146pub mod permission;
147pub mod sheets;
148pub mod wiki;
149
150// 重新导出服务类型
151pub use assistant::AssistantService;
152pub use bitable::BitableService;
153pub use board::BoardService;
154pub use comments::CommentsService;
155pub use docx::DocxService;
156pub use drive::DriveService;
157pub use permission::PermissionService;
158pub use sheets::SheetsService;
159pub use wiki::WikiService;
160
161/// 云文档服务聚合器
162///
163/// 提供统一的云文档相关功能访问接口,包括:
164/// - 云空间 (drive)
165/// - 知识库 (wiki)  
166/// - 文档 (docx)
167/// - 电子表格 (sheets)
168/// - 多维表格 (bitable)
169/// - 画板 (board)
170/// - 权限 (permission)
171/// - 评论 (comments)
172/// - 云文档助手 (assistant)
173pub struct CloudDocsService {
174    pub drive: DriveService,
175    pub wiki: WikiService,
176    pub docx: DocxService,
177    pub sheets: SheetsService,
178    pub bitable: BitableService,
179    pub board: BoardService,
180    pub permission: PermissionService,
181    pub comments: CommentsService,
182    pub assistant: AssistantService,
183}
184
185impl CloudDocsService {
186    pub fn new(config: Config) -> Self {
187        Self {
188            drive: DriveService::new(config.clone()),
189            wiki: WikiService::new(config.clone()),
190            docx: DocxService::new(config.clone()),
191            sheets: SheetsService::new(config.clone()),
192            bitable: BitableService::new(config.clone()),
193            board: BoardService::new(config.clone()),
194            permission: PermissionService::new(config.clone()),
195            comments: CommentsService::new(config.clone()),
196            assistant: AssistantService::new(config.clone()),
197        }
198    }
199
200    /// 使用共享配置创建聚合服务(实验性)
201    pub fn new_from_shared(shared: Arc<Config>) -> Self {
202        Self {
203            drive: DriveService::new_from_shared(shared.clone()),
204            wiki: WikiService::new_from_shared(shared.clone()),
205            docx: DocxService::new_from_shared(shared.clone()),
206            sheets: SheetsService::new_from_shared(shared.clone()),
207            bitable: BitableService::new_from_shared(shared.clone()),
208            board: BoardService::new_from_shared(shared.clone()),
209            permission: PermissionService::new_from_shared(shared.clone()),
210            comments: CommentsService::new_from_shared(shared.clone()),
211            assistant: AssistantService::new_from_shared(shared),
212        }
213    }
214}
215
216#[cfg(test)]
217mod tests {
218    use super::*;
219    use std::time::Duration;
220
221    #[test]
222    fn test_cloud_docs_service_creation() {
223        let config = Config::default();
224        let service = CloudDocsService::new(config.clone());
225
226        // Verify all sub-services are created and accessible
227        let _ = &service.drive;
228        let _ = &service.wiki;
229        let _ = &service.docx;
230        let _ = &service.sheets;
231        let _ = &service.bitable;
232        let _ = &service.board;
233        let _ = &service.permission;
234        let _ = &service.comments;
235        let _ = &service.assistant;
236
237        // Verify versioned services are accessible
238        let _ = &service.drive.v1;
239        let _ = &service.drive.v2;
240        let _ = &service.wiki.v2;
241        let _ = &service.docx.v1;
242        let _ = &service.bitable.v1;
243        let _ = &service.assistant.v1;
244    }
245
246    #[test]
247    fn test_cloud_docs_service_with_custom_config() {
248        let config = Config::builder()
249            .app_id("cloud_docs_test_app")
250            .app_secret("cloud_docs_test_secret")
251            .req_timeout(Duration::from_secs(300))
252            .build();
253
254        let service = CloudDocsService::new(config.clone());
255
256        // Verify all sub-services exist
257        let _ = &service.drive;
258        let _ = &service.wiki;
259        let _ = &service.docx;
260        let _ = &service.sheets;
261        let _ = &service.bitable;
262        let _ = &service.board;
263        let _ = &service.permission;
264        let _ = &service.comments;
265        let _ = &service.assistant;
266    }
267
268    #[test]
269    fn test_cloud_docs_service_config_independence() {
270        let config1 = Config::builder().app_id("cloud_docs_app_1").build();
271
272        let config2 = Config::builder().app_id("cloud_docs_app_2").build();
273
274        let service1 = CloudDocsService::new(config1);
275        let service2 = CloudDocsService::new(config2);
276
277        // Verify services are created independently
278        assert!(!std::ptr::eq(
279            std::ptr::addr_of!(service1.drive),
280            std::ptr::addr_of!(service2.drive)
281        ));
282        assert!(!std::ptr::eq(
283            std::ptr::addr_of!(service1.wiki),
284            std::ptr::addr_of!(service2.wiki)
285        ));
286        assert!(!std::ptr::eq(
287            std::ptr::addr_of!(service1.docx),
288            std::ptr::addr_of!(service2.docx)
289        ));
290        assert!(!std::ptr::eq(
291            std::ptr::addr_of!(service1.sheets),
292            std::ptr::addr_of!(service2.sheets)
293        ));
294        assert!(!std::ptr::eq(
295            std::ptr::addr_of!(service1.bitable),
296            std::ptr::addr_of!(service2.bitable)
297        ));
298        assert!(!std::ptr::eq(
299            std::ptr::addr_of!(service1.board),
300            std::ptr::addr_of!(service2.board)
301        ));
302        assert!(!std::ptr::eq(
303            std::ptr::addr_of!(service1.permission),
304            std::ptr::addr_of!(service2.permission)
305        ));
306        assert!(!std::ptr::eq(
307            std::ptr::addr_of!(service1.comments),
308            std::ptr::addr_of!(service2.comments)
309        ));
310        assert!(!std::ptr::eq(
311            std::ptr::addr_of!(service1.assistant),
312            std::ptr::addr_of!(service2.assistant)
313        ));
314    }
315
316    #[test]
317    fn test_cloud_docs_service_sub_services_accessible() {
318        let config = Config::default();
319        let service = CloudDocsService::new(config.clone());
320
321        // Test that all sub-services and their sub-components are accessible
322        let _ = &service.drive.v1;
323        let _ = &service.drive.v2;
324        let _ = &service.wiki.v2;
325        let _ = &service.docx.v1;
326        let _ = &service.bitable.v1;
327        let _ = &service.assistant.v1;
328        let _ = &service.board.whiteboard;
329    }
330
331    #[test]
332    fn test_cloud_docs_service_config_cloning() {
333        let config = Config::builder()
334            .app_id("clone_test_app")
335            .app_secret("clone_test_secret")
336            .build();
337
338        let service = CloudDocsService::new(config.clone());
339
340        // Verify all sub-services were created with the cloned config
341        let _ = &service.drive;
342        let _ = &service.wiki;
343        let _ = &service.docx;
344        let _ = &service.sheets;
345        let _ = &service.bitable;
346        let _ = &service.board;
347        let _ = &service.permission;
348        let _ = &service.comments;
349        let _ = &service.assistant;
350    }
351
352    #[test]
353    fn test_cloud_docs_service_timeout_propagation() {
354        let config = Config::builder()
355            .req_timeout(Duration::from_secs(240))
356            .build();
357
358        let service = CloudDocsService::new(config);
359
360        // Verify timeout propagation by checking services are created with custom config
361        let _ = &service.drive;
362        let _ = &service.wiki;
363        let _ = &service.docx;
364        let _ = &service.sheets;
365        let _ = &service.bitable;
366        let _ = &service.board;
367        let _ = &service.permission;
368        let _ = &service.comments;
369        let _ = &service.assistant;
370    }
371
372    #[test]
373    fn test_cloud_docs_service_multiple_instances() {
374        let config = Config::default();
375
376        let service1 = CloudDocsService::new(config.clone());
377        let service2 = CloudDocsService::new(config.clone());
378
379        // Verify both instances are created but separate
380        // Service independence verified by separate instantiation
381        let _ = &service1.drive;
382        let _ = &service2.drive;
383        // Service independence verified by separate instantiation
384        let _ = &service1.wiki;
385        let _ = &service2.wiki;
386        // Service independence verified by separate instantiation
387        let _ = &service1.docx;
388        let _ = &service2.docx;
389        // Service independence verified by separate instantiation
390        let _ = &service1.sheets;
391        let _ = &service2.sheets;
392        // Service independence verified by separate instantiation
393        let _ = &service1.bitable;
394        let _ = &service2.bitable;
395        // Service independence verified by separate instantiation
396        let _ = &service1.board;
397        let _ = &service2.board;
398        // Service independence verified by separate instantiation
399        let _ = &service1.permission;
400        let _ = &service2.permission;
401        // Service independence verified by separate instantiation
402        let _ = &service1.comments;
403        let _ = &service2.comments;
404        // Service independence verified by separate instantiation
405        let _ = &service1.assistant;
406        let _ = &service2.assistant;
407    }
408
409    #[test]
410    fn test_cloud_docs_service_config_consistency() {
411        let config = Config::builder()
412            .app_id("consistency_test")
413            .app_secret("consistency_secret")
414            .req_timeout(Duration::from_secs(360))
415            .build();
416
417        let service = CloudDocsService::new(config);
418
419        // Verify consistent configuration across all sub-services
420        let _ = &service.drive;
421        let _ = &service.wiki;
422        let _ = &service.docx;
423        let _ = &service.sheets;
424        let _ = &service.bitable;
425        let _ = &service.board;
426        let _ = &service.permission;
427        let _ = &service.comments;
428        let _ = &service.assistant;
429    }
430}