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()))
}
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
// 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.

View File

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

View File

@@ -29,6 +29,9 @@ pub enum Event {
/// - 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.
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;
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)
}
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 {
if let Some(proj_dirs) = ProjectDirs::from("net", "buzzert", "kordophonecd") {
let data_dir = proj_dirs.data_dir();

View File

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

View File

@@ -42,6 +42,9 @@ pub enum Commands {
conversation_id: String,
last_message_id: Option<String>,
},
/// Deletes all conversations.
DeleteAllConversations,
}
#[derive(Subcommand)]
@@ -75,6 +78,7 @@ impl Commands {
Commands::Config { command } => client.config(command).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::DeleteAllConversations => client.delete_all_conversations().await,
}
}
}
@@ -188,4 +192,8 @@ impl DaemonCli {
.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))
}
}