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