diff options
author | 2025-04-11 06:51:03 +0100 | |
---|---|---|
committer | 2025-04-11 06:52:15 +0100 | |
commit | 1e5d4b504901bbd8fbf884e0f006d5717e1bc88c (patch) | |
tree | daee0a4b5d6b07afdc7ee6c859157da2a7d30d91 /filamento/src | |
parent | 113d9d9ce54528f1f0a782e867683074aaa43ee4 (diff) | |
download | luz-1e5d4b504901bbd8fbf884e0f006d5717e1bc88c.tar.gz luz-1e5d4b504901bbd8fbf884e0f006d5717e1bc88c.tar.bz2 luz-1e5d4b504901bbd8fbf884e0f006d5717e1bc88c.zip |
feat(filamento): `get_messages_with_users()`
Diffstat (limited to '')
-rw-r--r-- | filamento/src/db.rs | 24 | ||||
-rw-r--r-- | filamento/src/lib.rs | 23 | ||||
-rw-r--r-- | filamento/src/logic/local_only.rs | 7 | ||||
-rw-r--r-- | filamento/src/logic/offline.rs | 6 | ||||
-rw-r--r-- | filamento/src/logic/online.rs | 11 |
5 files changed, 65 insertions, 6 deletions
diff --git a/filamento/src/db.rs b/filamento/src/db.rs index d94293d..cf21325 100644 --- a/filamento/src/db.rs +++ b/filamento/src/db.rs @@ -669,6 +669,30 @@ impl Db { Ok(messages) } + pub(crate) async fn read_message_history_with_users( + &self, + chat: JID, + ) -> Result<Vec<(Message, User)>, Error> { + let chat_id = self.read_chat_id(chat).await?; + #[derive(sqlx::FromRow)] + pub struct Row { + #[sqlx(flatten)] + user: User, + #[sqlx(flatten)] + message: Message, + } + let messages: Vec<Row> = + sqlx::query_as("select * from messages join users on jid = from_jid where chat_id = ? order by timestamp asc") + .bind(chat_id) + .fetch_all(&self.db) + .await?; + let messages = messages + .into_iter() + .map(|row| (row.message, row.user)) + .collect(); + Ok(messages) + } + pub(crate) async fn read_cached_status(&self) -> Result<Online, Error> { let online: Online = sqlx::query_as("select * from cached_status where id = 0") .fetch_one(&self.db) diff --git a/filamento/src/lib.rs b/filamento/src/lib.rs index 83d4991..97cc9cd 100644 --- a/filamento/src/lib.rs +++ b/filamento/src/lib.rs @@ -66,6 +66,12 @@ pub enum Command<Fs: FileStore> { /// get message history for chat (does appropriate mam things) // TODO: paging and filtering GetMessages(JID, oneshot::Sender<Result<Vec<Message>, DatabaseError>>), + /// get message history for chat (does appropriate mam things) + // TODO: paging and filtering + GetMessagesWithUsers( + JID, + oneshot::Sender<Result<Vec<(Message, User)>, DatabaseError>>, + ), /// delete a chat from your chat history, along with all the corresponding messages DeleteChat(JID, oneshot::Sender<Result<(), DatabaseError>>), /// delete a message from your chat history @@ -360,6 +366,23 @@ impl<Fs: FileStore> Client<Fs> { Ok(messages) } + pub async fn get_messages_with_users( + &self, + jid: JID, + ) -> Result<Vec<(Message, User)>, CommandError<DatabaseError>> { + let (send, recv) = oneshot::channel(); + self.send(CoreClientCommand::Command(Command::GetMessagesWithUsers( + jid, send, + ))) + .await + .map_err(|e| CommandError::Actor(Into::<ActorError>::into(e)))?; + let messages = timeout(self.timeout, recv) + .await + .map_err(|e| CommandError::Actor(Into::<ActorError>::into(e)))? + .map_err(|e| CommandError::Actor(Into::<ActorError>::into(e)))??; + Ok(messages) + } + pub async fn delete_chat(&self, jid: JID) -> Result<(), CommandError<DatabaseError>> { let (send, recv) = oneshot::channel(); self.send(CoreClientCommand::Command(Command::DeleteChat(jid, send))) diff --git a/filamento/src/logic/local_only.rs b/filamento/src/logic/local_only.rs index cabbef4..9db9d4d 100644 --- a/filamento/src/logic/local_only.rs +++ b/filamento/src/logic/local_only.rs @@ -42,6 +42,13 @@ pub async fn handle_get_messages<Fs: FileStore + Clone>( Ok(logic.db().read_message_history(jid).await?) } +pub async fn handle_get_messages_with_users<Fs: FileStore + Clone>( + logic: &ClientLogic<Fs>, + jid: JID, +) -> Result<Vec<(Message, User)>, DatabaseError> { + Ok(logic.db().read_message_history_with_users(jid).await?) +} + pub async fn handle_delete_chat<Fs: FileStore + Clone>( logic: &ClientLogic<Fs>, jid: JID, diff --git a/filamento/src/logic/offline.rs b/filamento/src/logic/offline.rs index 4f5df36..9f1a3bc 100644 --- a/filamento/src/logic/offline.rs +++ b/filamento/src/logic/offline.rs @@ -23,7 +23,7 @@ use super::{ local_only::{ handle_delete_chat, handle_delete_messaage, handle_get_chat, handle_get_chats, handle_get_chats_ordered, handle_get_chats_ordered_with_latest_messages, - handle_get_messages, handle_get_user, + handle_get_messages, handle_get_messages_with_users, handle_get_user, }, }; @@ -88,6 +88,10 @@ pub async fn handle_offline_result<Fs: FileStore + Clone>( let messages = handle_get_messages(logic, jid).await; sender.send(messages); } + Command::GetMessagesWithUsers(jid, sender) => { + let messages = handle_get_messages_with_users(logic, jid).await; + sender.send(messages); + } Command::DeleteChat(jid, sender) => { let result = handle_delete_chat(logic, jid).await; sender.send(result); diff --git a/filamento/src/logic/online.rs b/filamento/src/logic/online.rs index 1023b79..2cf2d5c 100644 --- a/filamento/src/logic/online.rs +++ b/filamento/src/logic/online.rs @@ -22,12 +22,9 @@ use crate::{ }; use super::{ - ClientLogic, local_only::{ - handle_delete_chat, handle_delete_messaage, handle_get_chat, handle_get_chats, - handle_get_chats_ordered, handle_get_chats_ordered_with_latest_messages, - handle_get_messages, handle_get_user, - }, + handle_delete_chat, handle_delete_messaage, handle_get_chat, handle_get_chats, handle_get_chats_ordered, handle_get_chats_ordered_with_latest_messages, handle_get_messages, handle_get_messages_with_users, handle_get_user + }, ClientLogic }; pub async fn handle_online<Fs: FileStore + Clone>(logic: ClientLogic<Fs>, command: Command<Fs>, connection: Connected) { @@ -1058,6 +1055,10 @@ pub async fn handle_online_result<Fs: FileStore + Clone>( let messages = handle_get_messages(logic, jid).await; let _ = sender.send(messages); } + Command::GetMessagesWithUsers(jid, sender) => { + let messages = handle_get_messages_with_users(logic, jid).await; + sender.send(messages); + } Command::DeleteChat(jid, sender) => { let result = handle_delete_chat(logic, jid).await; let _ = sender.send(result); |