diff options
Diffstat (limited to '')
-rw-r--r-- | filamento/src/db.rs | 144 |
1 files changed, 102 insertions, 42 deletions
diff --git a/filamento/src/db.rs b/filamento/src/db.rs index 9d4b4e9..1b5afe6 100644 --- a/filamento/src/db.rs +++ b/filamento/src/db.rs @@ -344,6 +344,14 @@ impl Db { result } + pub(crate) async fn read_chat_and_user(&self, chat: JID) -> Result<(Chat, User), Error> { + let (result, recv) = oneshot::channel(); + let command = DbCommand::ReadChatAndUser { chat, result }; + self.sender.send(command); + let result = recv.await?; + result + } + pub(crate) async fn mark_chat_as_chatted(&self, chat: JID) -> Result<(), Error> { let (result, recv) = oneshot::channel(); let command = DbCommand::MarkChatAsChatted { chat, result }; @@ -605,6 +613,10 @@ pub enum DbCommand { chat: JID, result: oneshot::Sender<Result<Chat, Error>>, }, + ReadChatAndUser { + chat: JID, + result: oneshot::Sender<Result<(Chat, User), Error>>, + }, MarkChatAsChatted { chat: JID, result: oneshot::Sender<Result<(), Error>>, @@ -700,45 +712,46 @@ impl Display for DbCommand { #[rustfmt::skip] fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.write_str(match self { - DbCommand::CreateUser { user, result } => "CreateUser", - DbCommand::ReadUser { user, result } => "ReadUser", - DbCommand::DeleteUserNick { jid, result } => "DeleteUserNick", - DbCommand::UpsertUserNick { jid, nick, result } => "UpsertUserNick", - DbCommand::DeleteUserAvatar { jid, result } => "DeleteUserAvatar", - DbCommand::UpsertUserAvatar { jid, avatar, result } => "UpsertUserAvatar", - DbCommand::UpdateUser { user, result } => "UpdateUser", - DbCommand::CreateContact { contact, result } => "CreateContact", - DbCommand::ReadContact { contact, result } => "ReadContact", - DbCommand::ReadContactOpt { contact, result } => "ReadContactOpt", - DbCommand::UpdateContact { contact, result } => "UpdateContact", - DbCommand::UpsertContact { contact, result } => "UpsertContact", - DbCommand::DeleteContact { contact, result } => "DeleteContact", - DbCommand::ReplaceCachedRoster { roster, result } => "ReplaceCachedRoster", - DbCommand::ReadCachedRoster { result } => "ReadCachedRoster", - DbCommand::ReadCachedRosterWithUsers { result } => "ReadCachedRosterWithUsers", - DbCommand::CreateChat { chat, result } => "CreateChat", - DbCommand::ReadChat { chat, result } => "ReadChat", - DbCommand::MarkChatAsChatted { chat, result } => "MarkChatAsChatted", - DbCommand::UpdateChatCorrespondent { old_chat, new_correspondent, result } => "UpdateChatCorrespondent", - DbCommand::DeleteChat { chat, result } => "DeleteChat", - DbCommand::ReadChats { result } => "ReadChats", - DbCommand::ReadChatsOrdered { result } => "ReadChatsOrdered", - DbCommand::ReadChatsOrderedWithLatestMessages { result } => "ReadChatsOrderedWithLatestMessages", - DbCommand::ReadChatsOrderedWithLatestMessagesAndUsers { result } => "ReadChatsOrderedWithLatestMessagesAndUsers", - DbCommand::CreateMessage { message, chat, from, result } => "CreateMessage", - DbCommand::UpsertChatAndUser { chat, result } => "UpsertChatAndUser", - DbCommand::CreateMessageWithUserResource { message, chat, from, result } => "CreateMessageWithUserResource", - DbCommand::UpdateMessageDelivery { message, delivery, result } => "UpdateMessageDelivery", - DbCommand::DeleteMessage { message, result } => "DeleteMessage", - DbCommand::ReadMessage { message, result } => "ReadMessage", - DbCommand::ReadMessageHistory { chat, result } => "ReadMessageHistory", - DbCommand::ReadMessageHistoryWithUsers { chat, result } => "ReadMessageHistoryWithUsers", - DbCommand::ReadCachedStatus { result } => "ReadCachedStatus", - DbCommand::UpsertCachedStatus { status, result } => "UpsertCachedStatus", - DbCommand::DeleteCachedStatus { result } => "DeleteCachedStatus", - DbCommand::ReadCapabilities { node, result } => "ReadCapabilities", - DbCommand::UpsertCapabilities { node, capabilities, result } => "UpsertCapabilities", - }) + DbCommand::CreateUser { user, result } => "CreateUser", + DbCommand::ReadUser { user, result } => "ReadUser", + DbCommand::DeleteUserNick { jid, result } => "DeleteUserNick", + DbCommand::UpsertUserNick { jid, nick, result } => "UpsertUserNick", + DbCommand::DeleteUserAvatar { jid, result } => "DeleteUserAvatar", + DbCommand::UpsertUserAvatar { jid, avatar, result } => "UpsertUserAvatar", + DbCommand::UpdateUser { user, result } => "UpdateUser", + DbCommand::CreateContact { contact, result } => "CreateContact", + DbCommand::ReadContact { contact, result } => "ReadContact", + DbCommand::ReadContactOpt { contact, result } => "ReadContactOpt", + DbCommand::UpdateContact { contact, result } => "UpdateContact", + DbCommand::UpsertContact { contact, result } => "UpsertContact", + DbCommand::DeleteContact { contact, result } => "DeleteContact", + DbCommand::ReplaceCachedRoster { roster, result } => "ReplaceCachedRoster", + DbCommand::ReadCachedRoster { result } => "ReadCachedRoster", + DbCommand::ReadCachedRosterWithUsers { result } => "ReadCachedRosterWithUsers", + DbCommand::CreateChat { chat, result } => "CreateChat", + DbCommand::ReadChat { chat, result } => "ReadChat", + DbCommand::MarkChatAsChatted { chat, result } => "MarkChatAsChatted", + DbCommand::UpdateChatCorrespondent { old_chat, new_correspondent, result } => "UpdateChatCorrespondent", + DbCommand::DeleteChat { chat, result } => "DeleteChat", + DbCommand::ReadChats { result } => "ReadChats", + DbCommand::ReadChatsOrdered { result } => "ReadChatsOrdered", + DbCommand::ReadChatsOrderedWithLatestMessages { result } => "ReadChatsOrderedWithLatestMessages", + DbCommand::ReadChatsOrderedWithLatestMessagesAndUsers { result } => "ReadChatsOrderedWithLatestMessagesAndUsers", + DbCommand::CreateMessage { message, chat, from, result } => "CreateMessage", + DbCommand::UpsertChatAndUser { chat, result } => "UpsertChatAndUser", + DbCommand::CreateMessageWithUserResource { message, chat, from, result } => "CreateMessageWithUserResource", + DbCommand::UpdateMessageDelivery { message, delivery, result } => "UpdateMessageDelivery", + DbCommand::DeleteMessage { message, result } => "DeleteMessage", + DbCommand::ReadMessage { message, result } => "ReadMessage", + DbCommand::ReadMessageHistory { chat, result } => "ReadMessageHistory", + DbCommand::ReadMessageHistoryWithUsers { chat, result } => "ReadMessageHistoryWithUsers", + DbCommand::ReadCachedStatus { result } => "ReadCachedStatus", + DbCommand::UpsertCachedStatus { status, result } => "UpsertCachedStatus", + DbCommand::DeleteCachedStatus { result } => "DeleteCachedStatus", + DbCommand::ReadCapabilities { node, result } => "ReadCapabilities", + DbCommand::UpsertCapabilities { node, capabilities, result } => "UpsertCapabilities", + DbCommand::ReadChatAndUser { chat, result } => "ReadChatAndUser", + }) } } @@ -863,6 +876,9 @@ impl DbActor { DbCommand::ReadChat { chat, result } => { result.send(self.read_chat(chat)); } + DbCommand::ReadChatAndUser { chat, result } => { + result.send(self.read_chat_and_user(chat)); + } DbCommand::MarkChatAsChatted { chat, result } => { result.send(self.mark_chat_as_chatted(chat)); } @@ -1272,8 +1288,10 @@ impl DbActor { // TODO: what happens if a correspondent changes from a user to a contact? maybe just have correspondent be a user, then have the client make the user show up as a contact in ui if they are in the loaded roster. + /// should be a bare jid + /// TODO: this is NOT a read pub(crate) fn read_chat(&self, chat: JID) -> Result<Chat, Error> { - let chat = self.db.query_row( + let chat_opt = self.db.query_row( "select correspondent, have_chatted from chats where correspondent = ?1", [&chat], |row| { @@ -1282,8 +1300,50 @@ impl DbActor { have_chatted: row.get(1)?, }) }, - )?; - Ok(chat) + ).optional()?; + match chat_opt { + Some(chat) => return Ok(chat), + None => { + let chat = Chat { + correspondent: chat, + have_chatted: false, + }; + self.create_chat(chat.clone())?; + Ok(chat) + } + } + } + + pub(crate) fn read_chat_and_user(&self, chat: JID) -> Result<(Chat, User), Error> { + let user = self.read_user(chat.clone())?; + let chat_opt = self.db.query_row( + "select correspondent, have_chatted, jid, nick, avatar from chats join users on correspondent = jid where correspondent = ?1", + [&chat], + |row| { + Ok(( + Chat { + correspondent: row.get(0)?, + have_chatted: row.get(1)?, + }, + User { + jid: row.get(2)?, + nick: row.get(3)?, + avatar: row.get(4)?, + } + )) + }, + ).optional()?; + match chat_opt { + Some(chat) => return Ok(chat), + None => { + let chat = Chat { + correspondent: chat, + have_chatted: false, + }; + self.create_chat(chat.clone())?; + Ok((chat, user)) + } + } } pub(crate) fn mark_chat_as_chatted(&self, chat: JID) -> Result<(), Error> { |