metis_docs_tui/app/operations/
document_mgmt.rs1use 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 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 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 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 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 self.core_state.set_sync_in_progress();
101
102 if let Some(sync_service) = &self.sync_service {
104 sync_service.sync_database().await?;
105 }
106
107 self.load_documents().await?;
109
110 self.core_state.set_sync_complete();
112
113 self.add_success_message("Synchronization completed".to_string());
115
116 Ok(())
117 }
118}