Private
Public Access
1
0

adds the ability to clear db

This commit is contained in:
2025-05-01 01:08:13 -07:00
parent fd4c43d585
commit 13a78ccd47
6 changed files with 53 additions and 0 deletions

View File

@@ -222,6 +222,18 @@ impl<'a> Repository<'a> {
Ok(message_record.map(|r| r.into())) Ok(message_record.map(|r| r.into()))
} }
pub fn delete_all_conversations(&mut self) -> Result<()> {
use crate::schema::conversations::dsl::*;
diesel::delete(conversations).execute(self.connection)?;
Ok(())
}
pub fn delete_all_messages(&mut self) -> Result<()> {
use crate::schema::messages::dsl::*;
diesel::delete(messages).execute(self.connection)?;
Ok(())
}
// Helper function to get the last inserted row ID // Helper function to get the last inserted row ID
// This is a workaround since the Sqlite backend doesn't support `RETURNING` // This is a workaround since the Sqlite backend doesn't support `RETURNING`
// Huge caveat with this is that it depends on whatever the last insert was, prevents concurrent inserts. // Huge caveat with this is that it depends on whatever the last insert was, prevents concurrent inserts.

View File

@@ -40,6 +40,11 @@
value="Emitted when the list of conversations is updated."/> value="Emitted when the list of conversations is updated."/>
</signal> </signal>
<method name="DeleteAllConversations">
<annotation name="org.freedesktop.DBus.DocString"
value="Deletes all conversations from the database."/>
</method>
<!-- Messages --> <!-- Messages -->
<method name="GetMessages"> <method name="GetMessages">

View File

@@ -29,6 +29,9 @@ pub enum Event {
/// - conversation_id: The ID of the conversation to get messages for. /// - conversation_id: The ID of the conversation to get messages for.
/// - last_message_id: (optional) The ID of the last message to get. If None, all messages are returned. /// - last_message_id: (optional) The ID of the last message to get. If None, all messages are returned.
GetMessages(String, Option<String>, Reply<Vec<Message>>), GetMessages(String, Option<String>, Reply<Vec<Message>>),
/// Delete all conversations from the database.
DeleteAllConversations(Reply<()>),
} }

View File

@@ -206,6 +206,15 @@ impl Daemon {
let messages = self.get_messages(conversation_id, last_message_id).await; let messages = self.get_messages(conversation_id, last_message_id).await;
reply.send(messages).unwrap(); reply.send(messages).unwrap();
}, },
Event::DeleteAllConversations(reply) => {
self.delete_all_conversations().await
.unwrap_or_else(|e| {
log::error!("Failed to delete all conversations: {}", e);
});
reply.send(()).unwrap();
},
} }
} }
@@ -313,6 +322,18 @@ impl Daemon {
Ok(client) Ok(client)
} }
async fn delete_all_conversations(&mut self) -> Result<()> {
self.database.with_repository(|r| -> Result<()> {
r.delete_all_conversations()?;
r.delete_all_messages()?;
Ok(())
}).await?;
self.signal_sender.send(Signal::ConversationsUpdated).await?;
Ok(())
}
fn get_database_path() -> PathBuf { fn get_database_path() -> PathBuf {
if let Some(proj_dirs) = ProjectDirs::from("net", "buzzert", "kordophonecd") { if let Some(proj_dirs) = ProjectDirs::from("net", "buzzert", "kordophonecd") {
let data_dir = proj_dirs.data_dir(); let data_dir = proj_dirs.data_dir();

View File

@@ -99,6 +99,10 @@ impl DbusRepository for ServerImpl {
}).collect() }).collect()
}) })
} }
fn delete_all_conversations(&mut self) -> Result<(), dbus::MethodErr> {
self.send_event_sync(Event::DeleteAllConversations)
}
} }
impl DbusSettings for ServerImpl { impl DbusSettings for ServerImpl {

View File

@@ -42,6 +42,9 @@ pub enum Commands {
conversation_id: String, conversation_id: String,
last_message_id: Option<String>, last_message_id: Option<String>,
}, },
/// Deletes all conversations.
DeleteAllConversations,
} }
#[derive(Subcommand)] #[derive(Subcommand)]
@@ -75,6 +78,7 @@ impl Commands {
Commands::Config { command } => client.config(command).await, Commands::Config { command } => client.config(command).await,
Commands::Signals => client.wait_for_signals().await, Commands::Signals => client.wait_for_signals().await,
Commands::Messages { conversation_id, last_message_id } => client.print_messages(conversation_id, last_message_id).await, Commands::Messages { conversation_id, last_message_id } => client.print_messages(conversation_id, last_message_id).await,
Commands::DeleteAllConversations => client.delete_all_conversations().await,
} }
} }
} }
@@ -188,4 +192,8 @@ impl DaemonCli {
.map_err(|e| anyhow::anyhow!("Failed to set credential item: {}", e)) .map_err(|e| anyhow::anyhow!("Failed to set credential item: {}", e))
} }
pub async fn delete_all_conversations(&mut self) -> Result<()> {
KordophoneRepository::delete_all_conversations(&self.proxy())
.map_err(|e| anyhow::anyhow!("Failed to delete all conversations: {}", e))
}
} }