adds the ability to clear db
This commit is contained in:
@@ -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.
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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<()>),
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user