diff options
Diffstat (limited to 'filamento/src/db.rs')
-rw-r--r-- | filamento/src/db.rs | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/filamento/src/db.rs b/filamento/src/db.rs index 36ce7bf..d2c24a2 100644 --- a/filamento/src/db.rs +++ b/filamento/src/db.rs @@ -14,7 +14,7 @@ use crate::{ user::User, }; -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct Db { db: Arc<Mutex<rusqlite::Connection>>, } @@ -84,6 +84,7 @@ impl Db { Ok(()) } + // TODO: this is not a 'read' user pub(crate) async fn read_user(&self, user: JID) -> Result<User, Error> { let db = self.db().await; let user_opt = db @@ -556,6 +557,7 @@ impl Db { Ok(chats) } + #[tracing::instrument] async fn read_chat_id(&self, chat: JID) -> Result<Uuid, Error> { let chat_id = self.db().await.query_row( "select id from chats where correspondent = ?1", @@ -579,6 +581,7 @@ impl Db { } /// if the chat doesn't already exist, it must be created by calling create_chat() before running this function. + #[tracing::instrument] pub(crate) async fn create_message( &self, message: Message, @@ -587,6 +590,7 @@ impl Db { ) -> Result<(), Error> { let from_jid = from.as_bare(); let chat_id = self.read_chat_id(chat).await?; + tracing::debug!("creating message"); self.db().await.execute("insert into messages (id, body, chat_id, from_jid, from_resource, timestamp, delivery) values (?1, ?2, ?3, ?4, ?5, ?6, ?7)", (&message.id, &message.body.body, &chat_id, &from_jid, &from.resourcepart, &message.timestamp, &message.delivery))?; Ok(()) } @@ -596,7 +600,7 @@ impl Db { let db = self.db().await; db.execute( "insert into users (jid) values (?1) on conflict do nothing", - [&chat], + [&bare_chat], )?; let id = Uuid::new_v4(); db.execute("insert into chats (id, correspondent, have_chatted) values (?1, ?2, ?3) on conflict do nothing", (id, &bare_chat, false))?; @@ -614,6 +618,7 @@ impl Db { } /// create direct message from incoming. MUST upsert chat and user + #[tracing::instrument] pub(crate) async fn create_message_with_user_resource( &self, message: Message, @@ -624,6 +629,8 @@ impl Db { from: JID, ) -> Result<(), Error> { let from_jid = from.as_bare(); + let chat = chat.as_bare(); + tracing::debug!("creating resource"); if let Some(resource) = &from.resourcepart { self.db().await.execute( "insert into resources (bare_jid, resource) values (?1, ?2) on conflict do nothing", @@ -634,6 +641,18 @@ impl Db { Ok(()) } + pub(crate) async fn update_message_delivery( + &self, + message: Uuid, + delivery: Delivery, + ) -> Result<(), Error> { + self.db().await.execute( + "update messages set delivery = ?1 where id = ?2", + (delivery, message), + )?; + Ok(()) + } + // pub(crate) async fn read_message(&self, message: Uuid) -> Result<Message, Error> { // Ok(Message { // id: Uuid, @@ -653,6 +672,24 @@ impl Db { Ok(()) } + pub(crate) async fn read_message(&self, message: Uuid) -> Result<Message, Error> { + let message = self.db().await.query_row( + "select id, from_jid, delivery, timestamp, body from messages where id = ?1", + [&message], + |row| { + Ok(Message { + id: row.get(0)?, + // TODO: full from + from: row.get(1)?, + delivery: row.get(2)?, + timestamp: row.get(3)?, + body: Body { body: row.get(4)? }, + }) + }, + )?; + Ok(message) + } + // TODO: paging pub(crate) async fn read_message_history(&self, chat: JID) -> Result<Vec<Message>, Error> { let chat_id = self.read_chat_id(chat).await?; |