Skip to main content

metis_docs_tui/app/operations/
document_mgmt.rs

1use crate::app::App;
2use crate::error::AppError;
3use anyhow::Result;
4use metis_core::application::services::workspace::ArchiveService;
5
6impl App {
7    pub async fn delete_selected_document(&mut self) -> Result<()> {
8        if let Some(selected_item) = self.get_selected_item() {
9            if let Some(document_service) = &self.document_service {
10                match document_service
11                    .delete_document(&selected_item.file_path)
12                    .await
13                {
14                    Ok(_) => {
15                        // Sync database and reload documents
16                        if let Some(sync_service) = &self.sync_service {
17                            let _ = sync_service.sync_database().await;
18                        }
19                        self.load_documents().await?;
20                    }
21                    Err(e) => {
22                        self.error_handler.handle_error(AppError::from(e));
23                    }
24                }
25            }
26        }
27
28        Ok(())
29    }
30
31    pub async fn archive_selected_document(&mut self) -> Result<()> {
32        if let Some(selected_item) = self.get_selected_item() {
33            if let Some(workspace_dir) = &self.core_state.workspace_dir {
34                // Create archive service with database optimization
35                let db = match metis_core::dal::Database::new(
36                    &workspace_dir.join("metis.db").to_string_lossy(),
37                ) {
38                    Ok(db) => db,
39                    Err(e) => {
40                        self.add_error_message(format!("Database error: {}", e));
41                        return Ok(());
42                    }
43                };
44                let mut db_service =
45                    metis_core::application::services::DatabaseService::new(db.into_repository());
46                let archive_service = ArchiveService::new(workspace_dir);
47                match archive_service
48                    .archive_document_by_short_code(&selected_item.id(), &mut db_service)
49                    .await
50                {
51                    Ok(_archive_result) => {
52                        self.add_success_message(format!(
53                            "Document '{}' archived successfully",
54                            selected_item.title()
55                        ));
56                        // Sync database and reload documents
57                        if let Some(sync_service) = &self.sync_service {
58                            let _ = sync_service.sync_database().await;
59                        }
60                        self.load_documents().await?;
61                    }
62                    Err(e) => {
63                        self.add_error_message(format!("Failed to archive document: {}", e));
64                    }
65                }
66            }
67        }
68
69        Ok(())
70    }
71
72    pub async fn transition_selected_document(&mut self) -> Result<()> {
73        if let Some(selected_item) = self.get_selected_item() {
74            if let Some(transition_service) = &self.transition_service {
75                match transition_service
76                    .transition_to_next_phase(selected_item.id())
77                    .await
78                {
79                    Ok(_) => {
80                        // Sync database and reload documents
81                        if let Some(sync_service) = &self.sync_service {
82                            let _ = sync_service.sync_database().await;
83                        }
84                        self.load_documents().await?;
85                    }
86                    Err(e) => {
87                        let error_msg = format!("Failed to transition document: {}", e);
88                        self.add_error_message(error_msg.clone());
89                        self.error_handler.handle_error(AppError::from(e));
90                    }
91                }
92            }
93        }
94
95        Ok(())
96    }
97
98    pub async fn sync_and_reload(&mut self) -> Result<()> {
99        // Set sync in progress to show immediate feedback
100        self.core_state.set_sync_in_progress();
101
102        // Perform database synchronization
103        if let Some(sync_service) = &self.sync_service {
104            sync_service.sync_database().await?;
105        }
106
107        // Reload documents into boards
108        self.load_documents().await?;
109
110        // Mark sync as complete
111        self.core_state.set_sync_complete();
112
113        // Show success message
114        self.add_success_message("Synchronization completed".to_string());
115
116        Ok(())
117    }
118}