diff options
Diffstat (limited to 'filamento/src/db.rs')
-rw-r--r-- | filamento/src/db.rs | 92 |
1 files changed, 67 insertions, 25 deletions
diff --git a/filamento/src/db.rs b/filamento/src/db.rs index 1054ec2..f92bfb2 100644 --- a/filamento/src/db.rs +++ b/filamento/src/db.rs @@ -50,8 +50,9 @@ impl Db { pub(crate) async fn create_user(&self, user: User) -> Result<(), Error> { sqlx::query!( - "insert into users ( jid, cached_status_message ) values ( ?, ? )", + "insert into users ( jid, nick, cached_status_message ) values ( ?, ?, ? )", user.jid, + user.nick, user.cached_status_message ) .execute(&self.db) @@ -60,6 +61,12 @@ impl Db { } pub(crate) async fn read_user(&self, user: JID) -> Result<User, Error> { + sqlx::query!( + "insert into users ( jid ) values ( ? ) on conflict do nothing", + user + ) + .execute(&self.db) + .await?; let user: User = sqlx::query_as("select * from users where jid = ?") .bind(user) .fetch_one(&self.db) @@ -67,10 +74,23 @@ impl Db { Ok(user) } + pub(crate) async fn upsert_user_nick(&self, jid: JID, nick: String) -> Result<(), Error> { + sqlx::query!( + "insert into users (jid, nick) values (?, ?) on conflict do update set nick = ?", + jid, + nick, + nick + ) + .execute(&self.db) + .await?; + Ok(()) + } + pub(crate) async fn update_user(&self, user: User) -> Result<(), Error> { sqlx::query!( - "update users set cached_status_message = ? where jid = ?", + "update users set cached_status_message = ?, nick = ? where jid = ?", user.cached_status_message, + user.nick, user.jid ) .execute(&self.db) @@ -288,6 +308,17 @@ impl Db { Ok(chat) } + pub(crate) async fn mark_chat_as_chatted(&self, chat: JID) -> Result<(), Error> { + let jid = chat.as_bare(); + sqlx::query!( + "update chats set have_chatted = true where correspondent = ?", + jid + ) + .execute(&self.db) + .await?; + Ok(()) + } + pub(crate) async fn update_chat_correspondent( &self, old_chat: Chat, @@ -387,38 +418,47 @@ impl Db { } /// if the chat doesn't already exist, it must be created by calling create_chat() before running this function. - pub(crate) async fn create_message(&self, message: Message, chat: JID) -> Result<(), Error> { + pub(crate) async fn create_message( + &self, + message: Message, + chat: JID, + from: JID, + ) -> Result<(), Error> { // TODO: one query - let bare_jid = message.from.as_bare(); - let resource = message.from.resourcepart; + let from_jid = from.as_bare(); let chat_id = self.read_chat_id(chat).await?; - sqlx::query!("insert into messages (id, body, chat_id, from_jid, from_resource, timestamp) values (?, ?, ?, ?, ?, ?)", message.id, message.body.body, chat_id, bare_jid, resource, message.timestamp).execute(&self.db).await?; + sqlx::query!("insert into messages (id, body, chat_id, from_jid, from_resource, timestamp) values (?, ?, ?, ?, ?, ?)", message.id, message.body.body, chat_id, from_jid, from.resourcepart, message.timestamp).execute(&self.db).await?; Ok(()) } - pub(crate) async fn create_message_with_self_resource_and_chat( - &self, - message: Message, - chat: JID, - ) -> Result<(), Error> { - let from_jid = message.from.as_bare(); - let resource = &message.from.resourcepart; + pub(crate) async fn upsert_chat_and_user(&self, chat: &JID) -> Result<bool, Error> { let bare_chat = chat.as_bare(); sqlx::query!( "insert into users (jid) values (?) on conflict do nothing", - from_jid + bare_chat, ) .execute(&self.db) .await?; let id = Uuid::new_v4(); - sqlx::query!( - "insert into chats (id, correspondent) values (?, ?) on conflict do nothing", - id, - bare_chat - ) - .execute(&self.db) - .await?; - if let Some(resource) = resource { + let chat: Chat = sqlx::query_as("insert into chats (id, correspondent, have_chatted) values (?, ?, ?) on conflict do nothing returning *") + .bind(id) + .bind(bare_chat) + .bind(false) + .fetch_one(&self.db) + .await?; + Ok(chat.have_chatted) + } + + /// MUST upsert chat beforehand + pub(crate) async fn create_message_with_self_resource( + &self, + message: Message, + chat: JID, + // full jid + from: JID, + ) -> Result<(), Error> { + let from_jid = from.as_bare(); + if let Some(resource) = &from.resourcepart { sqlx::query!( "insert into resources (bare_jid, resource) values (?, ?) on conflict do nothing", from_jid, @@ -427,15 +467,17 @@ impl Db { .execute(&self.db) .await?; } - self.create_message(message, chat).await?; + self.create_message(message, chat, from).await?; Ok(()) } // create direct message from incoming - pub(crate) async fn create_message_with_user_resource_and_chat( + pub(crate) async fn create_message_with_user_resource( &self, message: Message, chat: JID, + // full jid + from: JID, ) -> Result<(), Error> { let bare_chat = chat.as_bare(); let resource = &chat.resourcepart; @@ -462,7 +504,7 @@ impl Db { .execute(&self.db) .await?; } - self.create_message(message, chat).await?; + self.create_message(message, chat, from).await?; Ok(()) } |