aboutsummaryrefslogtreecommitdiffstats
path: root/filamento/src/db.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--filamento/src/db.rs144
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> {