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()))
|
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.
|
||||||
|
|||||||
@@ -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">
|
||||||
|
|||||||
@@ -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<()>),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user